设备上下文相关函数

1.DC 设备上下文(Device Context)

设备上下文是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条、形状和文本的 Windows API。设备上下文允许在 Windows 中进行与设备无关的绘制。设备上下文可用于绘制到屏幕、打印机或者图元文件。

HDC是DC的句柄,API中的一个类似指针的数据类型.

 

2.CreateCompatibleDC

函数原型:HDC CreateCompatibleDC(HDC hdc);

参数:

hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。

返回值:如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为NULL。

CreateCompatibleDc函数只适用于支持光栅操作的设备,应用程序可以通过调用GetDeviceCaps函数来确定一个设备是否支持这些操作。

当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它 

在窗口的DC之外,可以建立自己的DC,就是说它不对应窗口,这个方法就是CreateCompatibleDC,这个DC就是一个内存缓冲区,通过这个DC你可以把和它兼容的窗口DC保存到这个DC中,就是说你可以通过它在不同的DC之间拷贝数据。例如:你先在这个DC中建立好数据,然后在拷贝到窗口的DC就是完成了这个窗口的刷新。

 

3.GetObject

函数功能:该函数得到指定图形对象的信息,根据图形对象,函数把填满的或结构,或表项(用于逻辑调色板)数目放入一个指定的缓冲区。

函数原型:int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);

参数:

hgdiobj:指向感兴趣的图形对象的句柄,它可以是这样的一个句柄:一个逻辑位图、一个刷子、一种字体、一个调色板、笔或通过调用CreateDIBsection函数创建的与设备无关位图。

cbBuffer:指定将要写到缓冲区的信息的字节数目。

lpvObject:指向一个缓冲区的指针,该缓冲区将要检索指定图形对象的信息。

 

4.SelectObject

函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);

 参数:
 hdc:设备上下文环境的句柄。
 hgdiobj:被选择的对象的句柄,该指定对象必须由如下的函数创建。
 
5.StretchBlt
函数功能:函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩
函数原型:BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);
 参数:
hdcDest:指向目标设备环境的句柄
nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。
nYOriginDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。
nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。
nHeightDest:指定目标矩形的高度,按逻辑单位表示高度。
hdcSrc:指向源设备环境的句柄。
nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。
nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。
nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度
nHeightSrc:指定源矩形的高度,按逻辑单位表示高度
dwRop:指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。
 
6.TransparentBlt
函数功能:该函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(bit_block)转换,并将结果置于目标设备环境,此函数同样具有缩放功能
函数原型:BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);
参数:
hdcDest:指向目标设备环境的句柄。
nXOriginDest:指定目标矩形左上角的X轴坐标,坐标以逻辑单位表示。
nYOriginDest:指定目标矩形左上角的Y轴坐标,坐标以逻辑单位表示。
nWidthDest:指定目标矩形的宽度。
nHeightDest:指定目标矩形的高度。
hdcsrc:指向源设备环境的句柄。
nXOriginSrc:指定源矩形(左上角)的X轴坐标,坐标以逻辑单位表示。
nYOriginsrc:指定源矩形(左上角)的Y轴坐标,坐标以逻辑单位表示。
nWidthSrc:指定源矩形的宽度。
nHeightSrc:指定源矩形的高度。
crTransparent:源位图中的RGB值当作透明颜色。返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。
 
7.BitBlt
 函数功能:该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境,不具备缩放功能
函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
参数:
hdcDest:指向目标设备环境的句柄。   
nXDest:指定目标矩形区域左上角的X轴逻辑坐标。   
nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。   
nWidth:指定源和目标矩形区域的逻辑宽度。   
nHeight:指定源和目标矩形区域的逻辑高度。   
hdcSrc:指向源设备环境的句柄。   
nXSrc:指定源矩形区域左上角的X轴逻辑坐标。   
nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。   
dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。   
下面列出了一些常见的光栅操作代码:   
BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。   
DSTINVERT:表示使目标矩形区域颜色取反。   
MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。   
MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。   
NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。   
NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。   
PATCOPY:将特定的模式拷贝到目标位图上。   
PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。   
PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。   
SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。   
SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。   
SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。   
SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。   
SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。   
WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
 
载入位图到表面代码:
//载入位图
HBITMAP hBitmap;
hBitmap = (HBITMAP)LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

HDC hdcImage;
HDC hdc;
BITMAP bm;

lpBackBuffer->Restore();

hdcImage = CreateCompatibleDC(NULL);
SelectObject(hdcImage, hBitmap);

GetObject(hBitmap, sizeof(bm), &bm);

lpBackBuffer->GetDC(&hdc);
BitBlt(hdc, 0, 0, 800, 600, hdcImage, 0, 0, SRCCOPY);
lpBackBuffer->ReleaseDC(hdc);
DeleteDC(hdcImage);

 

 
posted @ 2012-07-30 15:31  冷夜 - 网游编程技术  阅读(675)  评论(0编辑  收藏  举报