GDI基础小记1--获取设备环境句柄

GDI(Graphics Device Interface 图形设备接口)主要用于实现 系统与需要进行图形输出的程序间的信息交换,我们在编程时可以用GDI提供的接口函数很方便地进行 文字或者图像的输出。 

DC(device context) 设备环境。程序在绘制前必须获取一个  设备环境句柄(HDC)。 

获取 DC 的方法有两个:

1.使用BeginPaint 和 EndPaint 函数:

这两个函数分别都有两个参数:设备句柄、PAINTSTRUCT结构的变量地址。  注意,BeginPaint函数的返回值就是一个 HDC(设备环境句柄),并且这两个函数 必须成对使用

如果 在 程序中没有放置  WM_PAINT 过程的代码,那么 系统会调用默认窗口过程处理函数DefWindowProc进行处理,DefWindowProc 处理 WM_PAINT的代码如下:

case WM_PAINT:

BeginPaint(hwnd,&ps);

EndPaint(hwnd,&ps);

return 0;



在处理WM_PAINT消息时,窗口过程首先会调用 BeginPaint。这个函数会擦出窗口的无效区域,以便绘图。同时它还会填充ps(PAINTSTRUCT)的各个字段。并且 BeginPaint会返回一个设备环境句柄。也就是 HDC。

通常,当程序窗口存在 “无效区域” 时,系统就会发送一条 WM_PAINT消息给该窗口,然后 在该程序的窗口过程中,可以放置 BeginPaint EndPaint函数对 或者ValidateRect 函数进行 对无效矩形进行擦除处理。 

然后,如果 程序被写成如下形式:

case WM_PAINT:

return 0;

那么程序便会出问题了!因为刚说过,程序窗口在存在 无效区域时,系统会发送WM_PAINT消息给窗口,如果  程序的窗口过程没有 对无效区域进行擦除,并且,同时也没有把控制权交给 DefWindowProc函数 ,那么  系统就会 无限制地对窗口程序发送 WM_PAINT,这样 ,虽然程序和系统不会立即卡死或崩溃,但你可以打开任务管理器看看这两者运行时分别的CPU占用率了。

2.通过GetDC获取设备环境句柄:

  和BeginPaint与EndPaint一样,GetDC与ReleaseDC必须成对使用。

hdc=GetDC(hwnd);

[调用GDI函数…]

ReleaseDC(hwnd,hdc);

  和BeginPaint与EndPaint的区别在于:

前者,是把 无效矩形当作“裁剪矩形”,也就是说windows会把绘制限制在这个无效矩形里面,如果 无效区域不为矩形,那么,同样会被限制在那个 无效区域内。

而后者,返回的设备环境句柄却是整个客户区,这意味着你可以在整个客户区的任意部分绘制,而不仅仅是无效区域中。因为GetDC不会把无效区域有效化。如果需要将整个客户区有效化,可以调用下面的函数:

ValidateRect(hwnd,NULL);


还有一个与GetDC相似的函数 GetWindowDC。 此函数返回的设备环境句柄是整个窗口区域的,所以,如果使用此函数,那么程序将可以在整个窗口的任意位置进行绘制。 当然。程序也必须要处理WM_NCPAINT(非客户区绘制)消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值