GDI的 点 线 面 双缓冲 位图的绘制
1.输出文本
// 输出文本
1 COLORREF clrOldTextColor = SetTextColor(hDC, RGB(255,0,0)); //设置字体颜色,但最后都要返回原来的字体格式 2 3 COLORREF clrBackColor = SetBkColor(hDC, RGB(0,255,0)); //设置背景颜色,仅仅指的是文本区域的颜色 4 5 HFONT hFont = CreateFont( 200 // nHeight //创造一个字体格式,其中包含14个参数,前两个是字体的大小,其他的详见MSDN 6 7 , 0 // nWidth 8 9 , 0 // nEscapement 10 11 , 0 // nOrientation 12 13 , 500 // nWeight 14 15 , FALSE // nItalic 16 17 , FALSE // nUnderline 18 19 , 0 // cStrikeOut 20 21 , ANSI_CHARSET // nTCHARSet 22 23 , OUT_DEFAULT_PRECIS // nOutPrecision 24 25 , CLIP_DEFAULT_PRECIS // nClipPrecision 26 27 , DEFAULT_QUALITY // nQuality 28 29 , DEFAULT_PITCH|FF_SWISS// nPitchAndFamily 30 31 , _T("arial") ); // lpszFacename 32 33 HFONT hOldFont = (HFONT)::SelectObject(hDC, (HGDIOBJ)hFont); //设置字体 34 35 { 36 37 DrawText(hDC, _T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")), &rcClient, DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS | DT_SINGLELINE); //最后一个参数表示输出格式,其中 DT_WORD_ELLIPSIS 在本本区域不够时输出省略号 38 39 可以指定输出的格式 比TextOut灵活 40 41 // TextOut(hDC, 0, 0,_T("www.itxueba.org"), _tcslen(_T("www.itxueba.org"))); 42 43 } 44 45 //SetTextAlign(hDC,TA_RIGHT|TA_TOP); //显示文本的对齐方式,右对齐 46 47 //SetTextAlign(hDC,TA_LEFT|TA_TOP); //显示文本的对齐方式,左对齐 48 49 ::SelectObject(hDC, (HGDIOBJ)hOldFont); //返回原来的字体 50 51 DeleteObject((HGDIOBJ)hFont); //删除掉所创建的字体,不然可能会出现内存泄露 52 53 SetBkColor(hDC, clrBackColor); // 返回原来的背景颜色 54 55 SetTextColor(hDC, clrOldTextColor); //f返回原来的字体颜色 56 57 58 59 60 61
2. 输出点
因为一个点不是很明显,所以用输出矩形的方式。
SetPixel表示输出点,有四个参数,第一表示设备句柄,我们所说的画家,第二和第三分别表示点画的位置,最后一个是像素点的颜色。
for(int i=0;i<100;i++) { for(int j=0;j<100;j++) { SetPixel(hDC,i,j,RGB(0,0,255)); } }
3.绘制线条函数
1 HPEN hPen = CreatePen(PS_DASH,1,RGB(255,0,0)); // 产生画笔,设置线条格式 2 HPEN hOldPen = (HPEN)::SelectObject(hDC,hPen); 3 4 MoveToEx(hDC,rcClient.left,rcClient.top,NULL); //画线函数 5 LineTo(hDC,rcClient.right,rcClient.bottom); 6 7 ::SelectObject(hDC,hOldPen); 8 DeleteObject(hPen);
4.绘制面
1 //HPEN hPen =(HPEN) ::GetStockObject(NULL_PEN); //设置为没有颜色的边框,同样也可以设置一个无填充的 背景NULL_BRUSH 2 HPEN hPen = CreatePen(PS_SOLID,2,RGB(255,0,0)); // 产生画笔,设置线条格式 3 HPEN hOldPen = (HPEN)::SelectObject(hDC,hPen); 4 5 HBRUSH hBrush = CreateSolidBrush(RGB(0,0,255)); //设置画刷颜色 6 HBRUSH hOldBrush =(HBRUSH)::SelectObject(hDC,hBrush); 7 { 8 //::Rectangle(hDC,0,0,100,50); //绘制矩形 9 10 ::Ellipse(hDC,0,0,100,50); //绘制椭圆 11 } 12 ::SelectObject(hDC,hOldBrush); 13 DeleteObject(hBrush); 14 ::SelectObject(hDC,hOldPen); 15 DeleteObject(hPen);
5.双缓冲绘图模式
1 HDC hMenDC = ::CreateCompatibleDC(hDC); //产生一个能兼容hDC的设备句柄 2 assert(hMenDC); 3 4 HBITMAP hCompatibaleMap = ::CreateCompatibleBitmap(hDC,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top); //创造出一个图层,当然所有创建的最后都要进行销毁 5 assert(hCompatibaleMap); 6 { 7 HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMenDC,hCompatibaleMap); 8 { 9 10 //HPEN hPen =(HPEN) ::GetStockObject(NULL_PEN); //设置为没有颜色的边框,同样也可以设置一个无填充的 背景NULL_BRUSH 11 HPEN hPen = CreatePen(PS_SOLID,2,RGB(255,0,0)); // 产生画笔,设置线条格式 12 HPEN hOldPen = (HPEN)::SelectObject(hMenDC,hPen); 13 14 HBRUSH hBrush = CreateSolidBrush(RGB(0,0,255)); //设置画刷颜色 15 HBRUSH hOldBrush =(HBRUSH)::SelectObject(hMenDC,hBrush); 16 { 17 18 for(int i=0;i<1280;i++) 19 { 20 for(int j=0;j<800;j++) 21 { 22 SetPixel(hMenDC,i,j,RGB(0,255,0)); 23 } 24 } 25 26 //::Rectangle(hDC,0,0,100,50); //绘制矩形 27 28 // ::Ellipse(hMenDC,0,0,100,50); //绘制椭圆 29 } 30 ::SelectObject(hMenDC,hOldBrush); 31 DeleteObject(hBrush); 32 ::SelectObject(hMenDC,hOldPen); 33 DeleteObject(hPen); 34 ::BitBlt(hDC,rcClient.left,rcClient.top,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top, 35 hMenDC,0,0,SRCCOPY); 36 } 37 ::SelectObject(hMenDC,hOldBitmap); 38 } 39 ::DeleteObject((HGDIOBJ)hCompatibaleMap); 40 DeleteDC(hMenDC);
6. 输出位图
位图的输出要在双缓冲的基础上进行
1 HDC hMenDC = ::CreateCompatibleDC(hDC); 2 assert(hMenDC); 3 4 HBITMAP hBitMap = (HBITMAP)::LoadBitmap((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1)); 5 assert(hBitMap); 6 7 BITMAP bm; 8 ::GetObject(hBitMap,sizeof(BITMAP),&bm); //获取位置的尺寸信息 9 10 { 11 HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMenDC,hBitMap); 12 { 13 for(int i=0 ; i<100 ;i++) 14 { 15 for(int j=0;j<100;j++) 16 { 17 ::BitBlt(hDC,rcClient.left+bm.bmWidth*i,rcClient.top+bm.bmHeight*j,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top, 18 hMenDC,0,0,SRCCOPY); 19 } 20 } 21 22 /* ::BitBlt(hDC,rcClient.left,rcClient.top,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top, 23 hMenDC,0,0,SRCCOPY);*/ 24 25 //::StretchBlt(hDC, rcClient.left, rcClient.top, //放大位图 26 //rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hMenDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); 27 } 28 ::SelectObject(hMenDC,hOldBitmap); 29 } 30 ::DeleteObject((HGDIOBJ)hBitMap); 31 DeleteDC(hMenDC);