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);
注意事项:
1、GDI对象选进画布,完成相关工作后不要忘记选回原来状态
2、操作GDI对象,有Create...样式的,用完后记得DeleteObject
我喜欢一无所有,这样就只能一步一步的创造世界...

浙公网安备 33010602011771号