更新无效区域的一个问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 04:56:02
都知道 CPaintDC这个类可以自动调用BEGINPAINT和ENDPAINT函数 从而实现更新无效区域 但是有这样一个问题 比如pdc是个CPaintDC对象,那么这样pdc->TextOut(10,20,"你好");
那么第一次接受到WM_PAINT消息时 确实如上所示的执行了 但是 如果我用一个对话框挡住了一部分 那么新的WM_PAINT消息会让CPaintDC只包含无效区域 那么此时的pdc能调用TextOut吗? 因为可能10,20不在无效区域内啊 另外 如果调用了 是如何调用的呢? 是不是按照TextOut参数说的 仍然在10,20把所有内容从写一遍? 还是TextOut智能的只更新无效区域的? 他如何“智能”的呢?

全部重写一遍,但CPaintDC中有个剪切矩形,不包含在剪贴矩形的代码执行比较快,绘图函数会放弃实际绘图。用CDC的GetClipBox函数可以得到当前的刷新区域大小。在一般的绘图函数中,需要用户根据此矩形来判断是否做某写绘图操作,以加快绘图操作。
你可以根据GetClipBox函数获取的大小,自建一个内存设备环境,在其中绘制完后再用BitBlt绘制到目标设备(DC),这样绘图速度更快,因为不必要调用一个绘图函数,就立即显示它,等绘制完后同时显示。相关内容请查看 CreateCompatibleDC 函数