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


1.输出文本


// 输出文本


 1 COLORREF clrOldTextColor = SetTextColor(hDC, RGB(,,));   //设置字体颜色,但最后都要返回原来的字体格式

    COLORREF clrBackColor = SetBkColor(hDC, RGB(,,));           //设置背景颜色,仅仅指的是文本区域的颜色

    HFONT hFont = CreateFont(           // nHeight                          //创造一个字体格式,其中包含14个参数,前两个是字体的大小,其他的详见MSDN

                                                    ,       // nWidth   

                                                  ,       // nEscapement     

                                                    ,       // nOrientation     

                                                       ,       // nWeight     

                                                     , FALSE     // nItalic     

                                                  , FALSE     // nUnderline    

                                           ,       // cStrikeOut    

                                          ,      ANSI_CHARSET   // nTCHARSet    

                                          , OUT_DEFAULT_PRECIS // nOutPrecision    

                                             , CLIP_DEFAULT_PRECIS // nClipPrecision   

                                          , DEFAULT_QUALITY  // nQuality 

                                           , DEFAULT_PITCH|FF_SWISS// nPitchAndFamily   

                                          , _T("arial") );        // lpszFacename

    HFONT hOldFont = (HFONT)::SelectObject(hDC, (HGDIOBJ)hFont);                 //设置字体

   {  

     DrawText(hDC, _T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")), &rcClient,    DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS |           DT_SINGLELINE);                                                                     //最后一个参数表示输出格式,其中 DT_WORD_ELLIPSIS  在本本区域不够时输出省略号

                                                                                               可以指定输出的格式 比TextOut灵活  

    // TextOut(hDC, 0, 0,_T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")));  

   }   

                //SetTextAlign(hDC,TA_RIGHT|TA_TOP);       //显示文本的对齐方式,右对齐

               //SetTextAlign(hDC,TA_LEFT|TA_TOP);          //显示文本的对齐方式,左对齐

    ::SelectObject(hDC, (HGDIOBJ)hOldFont);      //返回原来的字体     

      DeleteObject((HGDIOBJ)hFont);                   //删除掉所创建的字体,不然可能会出现内存泄露

        SetBkColor(hDC, clrBackColor);                 // 返回原来的背景颜色

      SetTextColor(hDC, clrOldTextColor);           //f返回原来的字体颜色

2. 输出点

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

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

 for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
SetPixel(hDC,i,j,RGB(,,));
}
}

3.绘制线条函数

  HPEN hPen = CreatePen(PS_DASH,,RGB(,,));       // 产生画笔,设置线条格式
HPEN hOldPen = (HPEN)::SelectObject(hDC,hPen); MoveToEx(hDC,rcClient.left,rcClient.top,NULL); //画线函数
LineTo(hDC,rcClient.right,rcClient.bottom); ::SelectObject(hDC,hOldPen);
DeleteObject(hPen);

4.绘制面

 //HPEN hPen =(HPEN) ::GetStockObject(NULL_PEN);   //设置为没有颜色的边框,同样也可以设置一个无填充的 背景NULL_BRUSH
HPEN hPen = CreatePen(PS_SOLID,,RGB(,,)); // 产生画笔,设置线条格式
HPEN hOldPen = (HPEN)::SelectObject(hDC,hPen); HBRUSH hBrush = CreateSolidBrush(RGB(,,)); //设置画刷颜色
HBRUSH hOldBrush =(HBRUSH)::SelectObject(hDC,hBrush);
{
//::Rectangle(hDC,0,0,100,50); //绘制矩形 ::Ellipse(hDC,,,,); //绘制椭圆
}
::SelectObject(hDC,hOldBrush);
DeleteObject(hBrush);
::SelectObject(hDC,hOldPen);
DeleteObject(hPen);

5.双缓冲绘图模式

 HDC  hMenDC = ::CreateCompatibleDC(hDC);      //产生一个能兼容hDC的设备句柄
assert(hMenDC); HBITMAP hCompatibaleMap = ::CreateCompatibleBitmap(hDC,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top); //创造出一个图层,当然所有创建的最后都要进行销毁
assert(hCompatibaleMap);
{
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMenDC,hCompatibaleMap);
{ //HPEN hPen =(HPEN) ::GetStockObject(NULL_PEN); //设置为没有颜色的边框,同样也可以设置一个无填充的 背景NULL_BRUSH
HPEN hPen = CreatePen(PS_SOLID,,RGB(,,)); // 产生画笔,设置线条格式
HPEN hOldPen = (HPEN)::SelectObject(hMenDC,hPen); HBRUSH hBrush = CreateSolidBrush(RGB(,,)); //设置画刷颜色
HBRUSH hOldBrush =(HBRUSH)::SelectObject(hMenDC,hBrush);
{ for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
SetPixel(hMenDC,i,j,RGB(,,));
}
} //::Rectangle(hDC,0,0,100,50); //绘制矩形 // ::Ellipse(hMenDC,0,0,100,50); //绘制椭圆
}
::SelectObject(hMenDC,hOldBrush);
DeleteObject(hBrush);
::SelectObject(hMenDC,hOldPen);
DeleteObject(hPen);
::BitBlt(hDC,rcClient.left,rcClient.top,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top,
hMenDC,,,SRCCOPY);
}
::SelectObject(hMenDC,hOldBitmap);
}
::DeleteObject((HGDIOBJ)hCompatibaleMap);
DeleteDC(hMenDC);

6. 输出位图

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

  HDC  hMenDC = ::CreateCompatibleDC(hDC);
assert(hMenDC); HBITMAP hBitMap = (HBITMAP)::LoadBitmap((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1));
assert(hBitMap); BITMAP bm;
::GetObject(hBitMap,sizeof(BITMAP),&bm); //获取位置的尺寸信息 {
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMenDC,hBitMap);
{
for(int i= ; i< ;i++)
{
for(int j=;j<;j++)
{
::BitBlt(hDC,rcClient.left+bm.bmWidth*i,rcClient.top+bm.bmHeight*j,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top,
hMenDC,,,SRCCOPY);
}
} /* ::BitBlt(hDC,rcClient.left,rcClient.top,rcClient.right-rcClient.left,rcClient.bottom-rcClient.top,
hMenDC,0,0,SRCCOPY);*/ //::StretchBlt(hDC, rcClient.left, rcClient.top, //放大位图
//rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hMenDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
::SelectObject(hMenDC,hOldBitmap);
}
::DeleteObject((HGDIOBJ)hBitMap);
DeleteDC(hMenDC);
上一篇:Ethernet & IEEE 802.3 802.X 802.1ag-MEP


下一篇:Nginx作为静态资源web服务之防盗链