赞
踩
GDI是一个抽象的接口,是一个关于图形显示的函数库。通过这个接口可以实现对图形的颜色、线条的粗细等属性的控制。它是我们的程序与计算机硬件之间的一个桥梁。
设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。在Win32编程中,设备环境是用HDC 来标识。H的意思Handle句柄的意思。
重点:获取HDC句柄的方法
{ HDC hDC = ::GetDC(hWnd); //其他的绘图操作代码 …… ::ReleaseDC(hWnd,hDC); } GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC
{ PAINTSTRUCT ps; HDC hDC = ::BeginPaint(hWnd,&ps); //其他的绘图操作代码 ::EndPaint(hWnd,&ps); }
{ 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); } |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。