获取设备环境句柄的方法

想要对任何设备绘图,首先必须得到设备环境句柄(hDC),几乎所有的GDI函数的操作目标都是hDC,并且当你获得的设备环境句柄不在有用时应当将其释放,因此得到设备环境句柄的函数与释放设备环境句柄的函数总是成对出现在同一个消息处理过程之中的。

在程序中得到hDC的方法有几种:
方法一:
在处理WM_PAINT时,最常用的一种获取设备环境句柄的方法就是,使用BeginPaint函数,该函数返回设备环境的句柄,而函数EndPaint函数使用来释放改句柄的,一般代码是:
CASE WM_PAINT:
hDC = BeginPaint(hwnd,&ps);
【use GDI function】
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使整个客户区无效并擦出背景。
方法二:
在程序中并不是总是在WM_PAINT中重绘无效区域,那么就不能使用BeginPaint与EndPaint的函数组合了,因为他们只能用于处理WM_PAINT消息中使用,那么在别的地方可以使用GetDC函数了获得设备环境句柄,而用ReleaseDC函数释放,对于使用GetDC得到的hDC,一般都只是在一个消息内是有效地,在该条消息结束前应当释放,当在另一条消息内还需要该句柄时,应当重新获得,

当我们的程序重画了无效区域时,那么我们必须显示的告诉系统,我们已经将无效区域变为有效了,那么就必须用函数validateRect函数将无效区域变为有效,否则系统会一直以为该区域是无效的,就会一直发送WM_PAINT消息,那么就会进入一个死循环,那么为什么在BeiginPaint与EndPaint函数的组合中我们没有告诉系统我们已经将无效区域变为有效区域了呢,那是因为BeiginPaint与EndPaint函数已经帮我们做了这个工作了,但是当我们不是用这个组合时,我们就必须自己告诉系统了,那么就必须加上对validateRect函数的调用了。

以上两种方法获取的hDC都是窗口的hDC,如果操作的是其他东西,那么这两种方法就不适合,在这时我们可以用其他的方法来获得相应的hDC,

当我们绘图的对象是一个设备是,那么我们可以用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。
当我们面对的对象是一个位图时:我们可以用CreateDC函数来创建一个DC,其函数原型为:
CreateCompatibleDC(hDC);
参数中的hDC实用来参考的DC句柄,如果该参数为NULL,那么建立的DC将和当前屏幕的设置兼容,为了用该DC绘画一个位图,还需要用SelectObject函数将DC与位图句柄联系起来,
通最前面介绍的哪两种方式一样,当一个DC用完时,我们必须将其释放,对于用CreateDC与CreateCompatibleDC函数建立的DC我们可以用DeleteDC来将其释放。

前面我们提到过我们获得DC一般做好不要让其的作用于不要超过本条消息,但是对于CreateCompatibleDC与CreateDC函数来说就没有那个限制了,用这两个函数得到DC我们可以一直使用一直到我们不再使用为止。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值