vc的mfc中重绘函数的使用总结

vc的mfc中重绘函数的使用总结

ID:8821826

大小:25.00 KB

页数:4页

时间:2018-04-08

vc的mfc中重绘函数的使用总结_第1页
vc的mfc中重绘函数的使用总结_第2页
vc的mfc中重绘函数的使用总结_第3页
vc的mfc中重绘函数的使用总结_第4页
资源描述:

《vc的mfc中重绘函数的使用总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、VC的MFC中重绘函数的使用总结在刷新窗口时经常要调用重绘函数MFC提供了三个函数用于窗口重绘InvalidateRect(&Rect)Invalidate()UpdateWindow()当需要更新或者重绘窗口时,一般系统会发出两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)--WM_NVPAINT系统会自己搞定--WM_PAINT消息对应的函数是OnPaint(),它是系统默认的接受WM_PAINT消息的函数,但我们一般在程序中做重绘时都在OnDraw函数中进行的,因为在ONPAIN函数中调用了ONDRAW函数。///CView默认的标准

2、的重画函数voidCView::OnPaint(){CPaintDCdc(this);OnPreparDC(&dc);OnDraw(&dc);//调用了OnDraw}上面讲到InvalidateRect(&Rect)Invalidate()两个函数形式和功能差不多,但Invalidate是使得整个窗口无效,形成无效矩形,而InvalidateRect(&Rect)是使得指定的区域无效。Invalidate()申明无效,等待WM_PAINT消息以便重绘,队列中无其他消息时系统会自动发送UpdateWindow()会立即发送WM_PAINT,不过在它发送前,先调用GetUpdateR

3、ect(hWnd,NULL,TRUE)看有无可绘制区域,如果没有则不发送消息RedrawWindow()RedrawWindow()则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做。不过这样也有利于提高绘制的效率:两个WM_PAINT消息之间通过InvalidateRect和Inval

4、iateRgn使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统。在合适的时机发送WM_PAINT消息的机制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用SendMessage发送一条WM_PAINT消息来强制立即重画,但不如使用WindowsGDI为我们提供的更方便和强大的函数:Upda

5、teWindow和RedrawWindow。UpdateWindow会检查窗口的UpdateRegion,当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们更多的控制:是否重画非客户区和背景,是否总是发送WM_PAINT消息而不管UpdateRegion是否为空等。BeginPaint和WM_PAINT消息紧密相关。试一试在WM_PAINT处理函数中不写BeginPaint会怎样?程序会像进入了一个死循环一样达到惊人的CPU占用率,你会发现程序总在处理一个接一个的WM_PAINT消息。这是因为在通常情况下,当应用收到WM_PAINT消息时,窗口的Update

6、Region都是非空的(如果为空就不需要发送WM_PAINT消息了),BeginPaint的一个作用就是把该UpdateRegion置为空,这样如果不调用BeginPaint,窗口的UpdateRegion就一直不为空,如前所述,系统就会一直发送WM_PAINT消息。BeginPaint和WM_ERASEBKGND消息也有关系。当窗口的UpdateRegion被标志为需要擦除背景时,BeginPaint会发送WM_ERASEBKGND消息来重画背景,同时在其返回信息里有一个标志表明窗口背景是否被重画过。当我们用InvalidateRect和InvalidateRgn来把指定区域加

7、到UpdateRegion中时,可以设置该区域是否需要被擦除背景,这样下一个BeginPaint就知道是否需要发送WM_ERASEBKGND消息了。另外要注意的一点是,BeginPaint只能在WM_PAINT处理函数中使用。以下是Invalidate函数的作用::voidInvalidate(BOOLbErase=TRUE);该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。