首页 > 其他 > 详细

GDI的 点 线 面 双缓冲 位图的绘制

时间:2014-03-31 00:20:48      阅读:686      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣

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  
bubuko.com,布布扣

 

 

  

 

2. 输出点

 

 因为一个点不是很明显,所以用输出矩形的方式。

SetPixel表示输出点,有四个参数,第一表示设备句柄,我们所说的画家,第二和第三分别表示点画的位置,最后一个是像素点的颜色。

 

bubuko.com,布布扣
 for(int i=0;i<100;i++)
         {
         for(int j=0;j<100;j++)
         {
         SetPixel(hDC,i,j,RGB(0,0,255));
         }
         }
bubuko.com,布布扣

 3.绘制线条函数

 

bubuko.com,布布扣
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); 
bubuko.com,布布扣

 

4.绘制面

 

 

bubuko.com,布布扣
 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);
bubuko.com,布布扣

 

 

5.双缓冲绘图模式

bubuko.com,布布扣
 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); 
bubuko.com,布布扣

6. 输出位图

位图的输出要在双缓冲的基础上进行

bubuko.com,布布扣
 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); 
bubuko.com,布布扣

 

 

GDI的 点 线 面 双缓冲 位图的绘制,布布扣,bubuko.com

GDI的 点 线 面 双缓冲 位图的绘制

原文:http://www.cnblogs.com/yfyzy/p/3634654.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!