您的位置:首页 > 其它

绘制位图的步骤

2016-03-07 23:25 471 查看
•GDI是图形设备接口(Graphics Device Interface)的英文首字母的简称。

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

•Windows图形编程就是针对Windows自带的图形设备接口函数库和设备环境(DC)进行操作。通过调用这些函数库中的函数来完成绘制工作。


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



一、获得目标DC句柄(有三种方式)

获取DC设备上下文:
1.通过GetDC函数来获得相应窗口的HDC

GetDC函数适合在窗口现有图形的基础上进行绘制。
代码段:
{
HDC hDC = ::GetDC(hWnd);
//其他的绘图操作代码
……
::ReleaseDC(hWnd,hDC);
}
GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC
2.通过BeginPaint函数来获得所在窗口的HDC
BeginPaint函数是将窗口上所有内容清除干净,然后在上面绘制。
代码段:
{
PAINTSTRUCT ps;
HDC hDC = ::BeginPaint(hWnd,&ps);
//其他的绘图操作代码
::EndPaint(hWnd,&ps);
}
<div><div> typedef struct tagPAINTSTRUCT {
</div><div>     HDC         hdc;// 显示器的设备环境句柄
</div><div>     BOOL        fErase;//是否擦除背景
</div><div>     RECT        rcPaint;//指定了需要绘图的窗口区域
</div><div>     BOOL        fRestore;
</div><div>     BOOL        fIncUpdate;
</div><div>     BYTE        rgbReserved[32];
</div><div> } PAINTSTRUCT;</div></div>

3.通过CreateCompatibleDC 创建兼容内存DC

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

代码片段:
{
HDC hMemDC = ::CreateCompatibleDC(hDest);		//其他的绘图操作代码
…
::BitBlt(hDest,x,y,w,h,hMemDC,0,0,SRCCOPY);
…
::DeleteDC(hMemDC);
}

获取目标DC句柄:
(1)LoadBitmap图片的加载

HBITMAP WINAPI LoadBitmapW(HINSTANCE hInstance,LPCWSTR lpBitmapName);
函数的作用是从应用程序工程资源中读取位图数据。
第一个参数HINSTANCE,它是资源文件所在的模块的实例句柄
第二个参数BitmapName是位图在资源中的ID名称。

(2)LoadImage图片的加载

LoadImage这个函数可以加载位图、图标、光标多种图像数据。
1.从资源加载
hbmpBack = (HBITMAP) ::LoadImage (hInst,MAKEINTRESOURCE (IDB_BACK),IMAGE_BITMAP, 0,  0, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
2.从文件路径加载
hbmpBack = (HBITMAP) ::LoadImage (NULL,_T(".\\1.bmp"),IMAGE_BITMAP,0, 0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);


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

见CreateCompatiableDC()函数。
HDC hMemDC = ::CreateCompatibleDC(hDC);

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

HGDIOBJ WINAPI SelectObject(HDC hdc, HGDIOBJ h);
第一个参数是设备DC。
第二个参数是HGDIOBJ,其实是一个void* 。这个函数传入一个新的GDI对象到第一个参数的DC中,并返回该DC的老的相同类型的GDI对象。

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

1.BitBlt绘制位图(非拉伸绘制)

BOOL WINAPI BitBlt (
HDC hdc, //目标DC的句柄
int x, int y, int cx, int cy, //目标区域
HDC hdcSrc, //源DC的句柄
int x1,int y1, //源区域的左上角
DWORD rop //操作标志,一般是 SRCCOPY,是拷贝的意思。
);

2.StretchBlt拉伸函数(绘制位图)

BOOL WINAPI StretchBlt(
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

SelectObject函数。

六、销毁临时的内存DC

位图的销毁

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

CBitmap Bmp;
Bmp.LoadBitmap(IDB_BITMAP1);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
hOldBmp = memDC.SelectObject(&Bmp);
pDC->BitBlt(0,0,600,600,&memDC,0,0,SRCCOPY);
SelectObject(hOldBmp);
DeleteObject(memDC);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: