当前位置:   article > 正文

WIndow下的图形GDI和GDI+编程总结-不断完善_gdi+window

gdi+window

GDI是一个抽象的接口,是一个关于图形显示的函数库。通过这个接口可以实现对图形的颜色、线条的粗细等属性的控制。它是我们的程序与计算机硬件之间的一个桥梁。

设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。在Win32编程中,设备环境是用HDC 来标识。H的意思Handle句柄的意思。

重点:获取HDC句柄的方法

  • GetDC函数适合在窗口现有图形的基础上进行绘制。代码段:

{

HDC hDC = ::GetDC(hWnd);

//其他的绘图操作代码

……

::ReleaseDC(hWnd,hDC);

}

GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC

 

  • 通过BeginPaint函数来获得所在窗口的HDCBeginPaint函数是将窗口上所有内容清除干净,然后在上面绘制。代码段:

PAINTSTRUCT ps;

HDC hDC = ::BeginPaint(hWnd,&ps);

//其他的绘图操作代码

::EndPaint(hWnd,&ps);

  • 在MFC中可以截获WM_PAINT消息重写或者在OnPaint中

 

  • 通过调用CreateCompatibleDC函数来创建与目标DC兼容的内存DC。一般用于解决界面的闪烁问题。代码片段:

HDC hMemDC = ::CreateCompatibleDC(hDest); //其他的绘图操作代码

::BitBlt(hDest,x,y,w,h,hMemDC,0,0,SRCCOPY);

::DeleteDC(hMemDC);

 

 

PEN

图形绘制

画线,画边框(如矩形边框,圆边框,饼边框)采用画笔来操作的,默认是黑色,宽度为1,样式为实线的画笔。

 

 

 

 

 

 

 

 

 

 

常用GDI对象PEN,BRUSH,FONT,REGION,BITMAP,

 

PEN

图形绘制

画线,画边框(如矩形边框,圆边框,饼边框)采用画笔来操作的,默认是黑色,宽度为1,样式为实线的画笔

 

BRUSH

图形绘制

填充矩形,填充圆,填充饼等以及刷窗口背景都是通过画刷来操作的。默认是白色的画刷

 

FRON

图形绘制

所有的文本绘制,都是要基于具体的字体对象来绘制的,默认的是系统等宽字体

 

REGION

图像绘制

一个区域可以是椭圆形,多边形,或是更常见的矩形。

 

 

BITMAP图形

绘制

分为图形绘制跟图像绘制。对于线,矩形,圆,饼等的绘制是属于图形绘制。而对位图的绘制是属于图像绘制。

HBITMAP LoadBitmapW(HINSTANCE hInstance,LPCWSTR lpBitmapName);//从应用程序工程资源中读取位图数据

第一个参数HINSTANCE,它是资源文件所在的模块的实例句柄

第二个参数BitmapName是位图在资源中的ID名称。

HBITMAP hbmpBack = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BACKGROUND));//MAKEINTRESOURCE,把ID好转成字符串

//IDB_BACKGROUND 为资源ID

 

HANDLE LoadImageA(HINSTANCE hInst, LPCSTR name,UINT type,int cx,int cy,UINT fuLoad);//从资源或者文件中加载位图

//从资源加载位图

(HBITMAP)::LoadImage(hInst,MAKEINTRESOURCE(IDB_BACK),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADMAP3DCOLORS);

//从文件加载位图

(HBITMAP) ::LoadImage (hInst,_T(".\\1.bmp"),IMAGE_BITMAP,0, 0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);

 

::DeleteObject(HBITMAP );//位图的销毁是调用DeleteObject函数。

//选入DC里面的不要DeleteObject,Create和加载的句柄、GDI对象在它的生命结束前DeleteObject

 

BOOL BitBlt (HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1,int y1, DWORD rop );//平铺绘制位图,

HDC hdc, //目标DC的句柄  |  int x, int y, int cw, int ch, //目标区域   |   HDC hdcSrc, //源DC的句柄

int x1,int y1, //源区域的左上角  |   DWORD rop //操作标志,一般是SRCCOPY,是拷贝的意思。

 

 

BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc,DWORD rop);//

HDC hdcDest, //目标DC的句柄  |  int xDest, int yDest, int wDest, int hDest, //目标DC的区域

HDC hdcSrc, //源DC的句柄   |   int xSrc, int ySrc, int wSrc, __in int hSrc, //源DC的区域

DWORD rop //操作标志,一般为SRCCOPY,意思为拷贝

 

总结一下绘制位图的步骤

获得目标DC句柄

创建与目标DC兼容的临时内存DC

将位图句柄选入到临时内存DC中

使用BitBlt函数将临时内存DC中的位图拷贝到目标DC上来

将位图句柄选出临时内存DC

销毁临时的内存DC

   //从资源加载LoadBitMap在这里实例初始化的时候加载这个图片,LoadBitmap 这个资源要是bmp?

   hbmpBack = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BACKGROUND));//MAKEINTRESOURCE,把ID好转成字符串

   //从资源加载LoadImage

   hbmpBack = (HBITMAP)::LoadImage(hInstance, MAKEINTRESOURCE(IDB_BACKGROUND), IMAGE_BITMAP, 0,0,LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);

   //从路径加载,注意的地方:文件路径,LR_LOADFROMFILE

   hbmpBack = (HBITMAP)::LoadImage(NULL, _T(".\\220055opv1lnrli0m3l0rv.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

DrawImageOnCtrl(hdc, hWnd, hbmpBack);

void DrawImageOnCtrl(HDC hdc, HWND hWnd, HBITMAP hmap, int SelectBlt = 0)

{

HDC hDCMem = ::CreateCompatibleDC(hdc);

HBITMAP hOldBmp = (HBITMAP)::SelectObject(hDCMem, hmap);

BITMAP bmp;

::GetObject(hmap, sizeof(BITMAP), &bmp);//目的是获取DC大小,用于BitBLT函数

switch (SelectBlt)

{

case 1:

{ ::BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMem, 0, 0, SRCCOPY);//平铺拷贝break;}

case 2:

{   RECT reClient;

::GetClientRect(hWnd, &reClient);

::StretchBlt(hdc, 0, 0, reClient.right - reClient.left, reClient.bottom - reClient.top,

hDCMem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);//拉伸拷贝

break;

}

default:

{   RECT reClient;  ::GetClientRect(hWnd, &reClient);

::StretchBlt(hdc, 0, 0, reClient.right - reClient.left, reClient.bottom - reClient.top,

hDCMem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);//拉伸拷贝}

}

::SelectObject(hDCMem, hOldBmp);

::DeleteDC(hDCMem);

}

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号