如何获得设备环境句柄(HDC)--Win32SDK
原创转自: http://www.itniwo.net/blog/v/302078.html
要绘制设备,第一步是获取设备环境句柄(hDC)当不再用于释放它时,获取设备环境句柄的函数和释放设备环境句柄的函数始终成对出现在同一个消息处理过程中。
在程序中获得hDC有几种方法可以:
方法一:BeginPaint
在处理WM_PAINT获取设备环境句柄最常用的方法是使用BeginPaint函数,返回设备环境的句柄,而函数EndPaint该函数用于释放更改句柄,一般代码为:
CASE WM_PAINT:
hDC = BeginPaint(hwnd,&ps);
//在此处添加绘图代码
EndPaint(hwnd,&ps);
return 0;
其中BeginPaint的第一个参数是:窗口句柄,另一个参数是:PAINTSTRUCT结构变量(图形信息结构)的地址,具体定义为:
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL flncUpdate;
BYTE rgbReserved[32];
}PAINTSTRUCT;
程序调用中BeiginPaint时,windows填写结构的各个字段。用户程序仅使用结构的前三个字段,第一个字段是设备环境句柄,第二个字段是标识符windows当字段false是所以这意味着windows无效矩形区域的背景已被擦除。如果是:true所以这意味着windows无效区域的背景未擦除,换句话说,无效区域中的图像现在是什么或没有更改。第三个字段是一个rect结构,表示无效区域的范围,即要重绘的无效区域。
如果要在无效区域之外绘制,则应BeginPaint在调用函数之前,请使用该函数InvalidateRect使整个客户区域无效并擦除背景。
方法二:GetDC
并非总是在程序中WM_PAINT如果重绘无效区域,则无法使用BeginPaint与EndPaint这些功能组合在一起是因为它们只能用于处理WM_PAINT在消息中使用,可以在其他地方使用GetDC该函数使用ReleaseDC功能释放,用于使用GetDC得到的hDC通常,它仅在一条消息中有效,并且应在该消息结束之前释放。当另一条消息中仍需要句柄时,应检索它,
当我们的程序重绘无效区域时,我们必须显示它以通知系统我们已使无效区域有效,然后我们必须使用该函数validateRect该函数将无效区域转换为有效区域,否则系统将始终假定该区域无效并不断发送WM_PAINT消息,那么它将进入一个死循环,那为什么会这样BeiginPaint与EndPaint在函数组合中,我们没有告诉系统我们已经将无效区域更改为有效区域,因为BeiginPaint与EndPaint该函数已经帮助我们完成了这项工作,但是当我们不使用这种组合时,我们必须自己告诉系统,因此我们必须添加validateRect该函数已被调用。
方法三:GetWindowDC
使用GetWindowDC()返回设备内容句柄,可以在程序中显示的整个窗口上绘制,包括标题栏、菜单、滚动条和框架
GetWindowDC(hwnd);
ReleaseDC(hwnd,hDc);
通过上述各种方法获得hDC这一切都是基于窗口的hDC如果我们对其他东西进行操作,那么这两种方法就不合适了。此时,我们可以使用其他方法获得相应的hDC,
方法四:CreateDC
当我们绘制的对象是设备时,我们可以使用CreateDC用于创建函数DC起始函数原型为:
HDC CreateDC(LPCTSTR lpszDrive, LPCTSTR lpszDevice, LPCTSTR lpszOutput, CONST DEVMODE *lplnitData);
lpszDriver :指向Null指向显示驱动程序指定的结束字符串的指针DISPLAY或者,指定打印驱动程序名称,通常WINSPOOL。
lpszDevice :指向null指向结束字符串的指针,该字符串指定正在使用的特定输出设备的名称,该名称不是打印机模式名称。LpszDevice必须使用该参数。
lpszOutput :此参数位于32在位应用中被忽略;并置为Null它主要设计用于提供16按位应用程序兼容性,有关详细信息,请参阅下面的注释部分。
LplnitData 指向为包含设备驱动程序的设备指定的初始化数据DEVMODE指向结构的指针,DocumentProperties如果设备驱动程序使用用户指定的默认初始化值,则该函数将检索指定设备的填充结构。是lplnitData参数必须是Null。
例如,获取整个屏幕的设备内容句柄
hDc = CreateDC(_T(“DISPLAY”),NULL,NULL,NULL);
DeleteDC(hDc);
当我们面对的对象是位图时:我们可以使用 CreateCompatibleDC 用于创建函数DC函数原型为:
CreateCompatibleDC(hDC);
参数中的hDC实用参考DC处理。如果此参数为 NULL,则建立的 DC 将与当前屏幕设置兼容。要使用此 DC 绘制位图,您还需要使用SelectObject函数将DC与位图句柄关联,
前面介绍的四种方法是相同的,当一个DC用完后,我们必须释放它CreateDC与CreateCompatibleDC功能建立DC我们可以使用DeleteDC释放它。
我们之前提到,我们获得了DC通常,重要的是不要让它的影响超过此消息,而是CreateCompatibleDC与CreateDC在功能方面不再有这种限制,使用这两个功能来获得DC我们可以使用它,直到我们不再使用它。
方法五:CreateIC
有时,您只需要获取有关某个设备内容的一些信息,而无需绘制任何内容。在这种情况下,您可以使用CreateIC获取“信息内容”的句柄,
hDc = CreateIC(_T(“DISPLAY”),NULL,NULL,NULL);
无法使用此信息内容句柄写入设备;
使用位图时获取“存储设备内容”有时很有用
hdcMem = CreateCompatibleDC (hdc) ;
DeleteDC (hdcMem) ;
您可以选择内存设备内容的位图,然后使用GDI位图上的绘图函数
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123



