BeginPaint和GetDC

使用方法:

BeginPaint

             hdc = BeginPaint (hwnd, &ps);

                // 使用GDI函数

                EndPaint (hwnd, &ps);

GetDC

            hdc = GetDC (hwnd);

              // 使用GDI函数

              ReleaseDC (hwnd, hdc);


作用:

BeginPaint

            1. 擦除无效区背景,使无效区变有效;(如果没有无效区,则不需要擦除任何区域背景,也不需要重绘任何区域)

               2. 将ps字段填好(即填好字段:hdc、fErase和rcPaint。其中fErase在大多数情况下都被标志为FALSE,rcPaint为无效矩形的边界。)

GetDC 

            1. 获得窗口显示区域的设备内容句柄。


相同点:

               1.  这两种都是Windows应用程序用来取得设备内容句柄的,以便在屏幕上绘图。

              2. 两者都需要配对使用,BeginPaint和EndPaint配;GetDC和ReleaseDC配。同时,都需要在同一条消息处理过程中配对使用。不可以在一个消息中BeginPaint,在另一个消息中EndPaint。


区别:

               1. 传回的虽然都是hdc但此hdc非彼hdc。BeginPaint传回的hdc是无效区域。GetDC传回的hdc等于整个显示区域。

              2. BeginPaint会使无效区域变为有效区域,但GetDC不会。也就是说,如果GetDC不告诉Windows,我已经重绘过了,我有效了,他的无效区域就会一直都在,系统会不停的发送WM_PAINT消息,进行不停的重绘,显示上就会不停的闪烁。


下面举例来使用这两个函数,顺带说明一下InvalidateRect和ValidateRect在其中的使用。

case WM_PAINT:

                // InvalidateRect(hWnd, NULL, TRUE);
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
RECT rect;
GetClientRect(hWnd,&rect);
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(255,255,0));
//SetBkMode(hdc,OPAQUE);
DrawText(hdc,_T("My first try for the hard program"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hWnd, &ps);
break;

        BeginPaint传回的hdc只指向无效区,如果要更新系统自动识别的无效矩形以外的区域,在BeginPaint之前加一句InvalidateRect(hWnd, NULL, TRUE);即可,它将整个窗口显示区域都置为无效。例如,如果窗口显示区域画了一个圆,其中一部分被遮挡住了变为无效,要只画那无效矩形那一部分的圆会比较困难,你会想画整个的,这种时候就整体设为无效即可。


case WM_PAINT:

hdc = GetDC(hWnd);
// TODO: 在此添加任意绘图代码...
RECT rect;
GetClientRect(hWnd,&rect);
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(255,255,0));
//SetBkMode(hdc,OPAQUE);
DrawText(hdc,_T("My first try for the hard program"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
ReleaseDC(hWnd,hdc);
ValidateRect(hWnd,NULL);
break;

        因为GetDC不会将无效区域变为有效,则字体会不停的闪,加上ValidateRect(hWnd,NULL);就是告诉系统整个区域有效了。就不会再一直向系统发送WM_PAINT消息。也就不会一直重绘了,避免了闪烁。

        不过在处理WM_PAINT时都会用BeginPaint,这里只是举例说明GetDC的用法。


既然有了BeginPaint为什么还会出现GetDC呢?

        下面是《Windows程序设计》中的一段话,我觉得揭示了这个原因。

        “虽然最好是在处理WM_PAINT消息处理期间更新整个显示区域,但您也会发现在处理非WM_PAINT消息处理期间绘制显示区域的某个部分也是非常有用的。或者您需要将设备内容句柄用于其它目的,如取得设备内容的信息。


PS: 下面这段是前辈们总结的,记。

       1. 因为BeginPaint和EndPaint用到的设备描述符只会在当前的无效区域内绘画,在有效区域内的绘画会自动被过滤,大家都知道,WIN GDI的绘画速度是比较慢的,所以能节省一个象素就节省一个,不用吝啬,这样可以有效加快绘画速度。

       2. 无效区域是可以被累加的,当队列中其他消息都被带走时,只剩下WM_PAINT 消息时,无效区域统一重绘。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值