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); 

 

原文地址:https://www.cnblogs.com/yfyzy/p/3634654.html