Riordon

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

GDI绘图
1、绘图画布---设备上下文(DC)
2、绘图工具---GDI对象(PEN、BRUSH、FONT、BITMAP等)
3、绘图技巧---绘图函数

常见绘图:
1、文本绘制
(1)TextOut (2)DrawText
可结合使用的绘图函数和GD
函数:SetTextColor、SetBkColor
GDI对象:FONT
2、点的绘制
     SetPixel
3、线的绘制
   MoveToEx、LineTo
   GDI对象:FONT
4、面的绘制
    Rectangle
GDI对象:PEN(边框)、BRUSH(填充)
5、位图的绘制
    (1)创建兼容DC ---CreateCompatibleDC
    (2)加载位图 ---LoadBitmap
    (3)位图选入兼容DC ---SelectObject
    (4)兼容DC-->现有DC ---BitBlt、StretchBlt(支持伸缩)

代码:

  1     PAINTSTRUCT ps;
  2     RECT rcClient;
  3     GetClientRect(&rcClient);
  4 
  5     HDC hDc = ::BeginPaint(m_hWnd,&ps);
  6     {
  7         /*----文本绘制----
  8         HFONT hFont = ::CreateFont(20,0,0,0,500,FALSE,FALSE,0,ANSI_CHARSET,
  9                                    OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
 10                                    DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,
 11                                    _T("arial"));
 12         HFONT hOldFont = (HFONT)::SelectObject(hDc, (HGDIOBJ)hFont);
 13         COLORREF clrOldTextColor = ::SetTextColor(hDc, RGB(255,0,0));
 14         COLORREF clrOldBkColor = ::SetBkColor(hDc, RGB(0,255,0));
 15         //::DrawText(hDc, _T("www.itxueba.org"),_tcslen(_T("www.itxueba.org")),&rcClient,DT_CENTER | DT_VCENTER |DT_WORD_ELLIPSIS);
 16         ::TextOut(hDc, 0, 0, _T("www.itxueba.org"),_tcslen(_T("www.itxueba.org")));
 17 
 18         ::SetTextColor(hDc, clrOldTextColor);
 19         ::SetBkColor(hDc, clrOldBkColor);
 20         ::DeleteObject(hFont);
 21         ::SelectObject(hDc, (HGDIOBJ)hOldFont);
 22         */
 23 
 24         /*----点的绘制
 25         for (int i = 0; i < 200; i++)
 26         {
 27             for (int j = 0; j < 100; j++)
 28             {
 29                 ::SetPixel(hDc,i,j,RGB(0,255,0));
 30             }
 31         }
 32         */
 33 
 34         /*----线的绘制
 35         HPEN hPen = ::CreatePen(PS_SOLID,3,RGB(255,0,0));
 36         HPEN hOldPen = (HPEN)::SelectObject(hDc,hPen);
 37 
 38         ::MoveToEx(hDc,0,0,NULL);
 39         ::LineTo(hDc,rcClient.right,rcClient.bottom);
 40         
 41         ::SelectObject(hDc,hOldPen);
 42         ::DeleteObject(hPen);
 43         */
 44 
 45         /*----面的绘制
 46         HPEN hPen = ::CreatePen(PS_SOLID,5,RGB(255,100,100));
 47         HPEN hOldPen = (HPEN)::SelectObject(hDc,hPen);
 48         //::GetStockObject(NULL_PEN); //无边框
 49         LOGBRUSH lbrush;
 50         lbrush.lbColor = RGB(0,255,255);
 51         lbrush.lbHatch = HS_CROSS;
 52         lbrush.lbStyle = BS_SOLID;
 53         HBRUSH hBrush = ::CreateBrushIndirect(&lbrush);
 54         HBRUSH hOldBrush = (HBRUSH)::SelectObject(hDc,hBrush);
 55 
 56         ::Rectangle(hDc,10,10,100,80);
 57 
 58         ::SelectObject(hDc,hOldBrush);
 59         ::DeleteObject(hBrush);
 60 
 61         ::SelectObject(hDc,hOldPen);
 62         ::DeleteObject(hPen);
 63         */
 64 
 65         /*----位图的绘制
 66         HDC hMemDc = ::CreateCompatibleDC(hDc);
 67 
 68         HBITMAP hBitMap = ::LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1));
 69         HBITMAP hOldBitMap = (HBITMAP)::SelectObject(hMemDc,hBitMap);
 70 
 71         BITMAP bm;
 72         ::GetObject((HANDLE)hBitMap,sizeof(BITMAP),&bm);
 73 
 74         //::BitBlt(hDc,0,0,rcClient.right,rcClient.bottom,
 75         //         hMemDc,bm.bmWidth/2,0,SRCCOPY);
 76         
 77         ::StretchBlt(hDc,0,0,rcClient.right,rcClient.bottom,
 78                      hMemDc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
 79 
 80         ::SelectObject(hMemDc,hOldBitMap);
 81         ::DeleteObject(hBitMap);
 82         ::DeleteObject(hMemDc);
 83         */
 84 
 85         //双缓冲技术分析
 86         HDC hMemDc = ::CreateCompatibleDC(hDc);
 87         
 88         HBITMAP hBitMap = ::CreateCompatibleBitmap(hDc,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top);
 89         HBITMAP hOldBitMap = (HBITMAP)::SelectObject(hMemDc,hBitMap);
 90 
 91         for (int i = 0; i < 1000; i++)
 92         {
 93             for (int j = 0; j < 800; j++)
 94             {
 95                 ::SetPixel(hMemDc,i,j,RGB(0,255,0));
 96             }
 97         }
 98         
 99         ::BitBlt(hDc,0,0,rcClient.right,rcClient.bottom,
100                  hMemDc,0,0,SRCCOPY);
101 
102         ::SelectObject(hMemDc,hOldBitMap);
103         ::DeleteObject(hBitMap);
104         ::DeleteObject(hMemDc);    
105     }
106     ::EndPaint(m_hWnd,&ps);
View Code

注意事项:
1、GDI对象选进画布,完成相关工作后不要忘记选回原来状态
2、操作GDI对象,有Create...样式的,用完后记得DeleteObject

posted on 2013-08-03 12:06  Riordon  阅读(403)  评论(0)    收藏  举报