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

     

  • 相关阅读:
    解决-webkit-box-orient: vertical;(文本溢出)属性在webpack打包后无法编译的问题
    消息框尖尖
    表单提交
    昨天看了一个大神的fix类,清晰了然
    使用cross-env解决跨平台设置NODE_ENV的问题
    axios 在Vue全局引入的方法
    vue自定义指令
    AMD/CMD/CommonJs到底是什么?它们有什么区别?
    artDialog.js的使用
    delegate-使用笔记
  • 原文地址:https://www.cnblogs.com/yfyzy/p/3634654.html
Copyright © 2020-2023  润新知