C++技巧之一(MFC),第1张

C++技巧之一(MFC),第2张

在冗长的粒度操作中更新窗口时,一个典型的问题是窗口闪烁,更改控件的内容会导致控件的部分或全部可视区域的重复重绘。当在短时间内出现大量这样的更新时,这就成了一个问题,并且这种重复重绘看起来是一种不吸引人的视觉干扰形式。解决这个问题的两个常用方法是使用API函数LockWindowUpdate和WM-SETREDRAW message。

LockWindowUpdate是通过换出该窗口的正常设备上下文,并用可见区域为空的窗口替换该窗口来实现的。当用NULL(解锁窗口)调用LockWindowUpdate时,原来的设备场景被替换,系统使其中一个与临时窗口大小和位置相同的区域失效,这样窗口就会收到重绘修改区域的请求。因此可以在一次操作中有效完成所有的窗口绘制,视觉效果更加无缝。使用LockWindowUpdate的缺点是一次只能用于一个窗口,所以不能用于同时锁定多个相关的控件集。第一个调用此函数的窗口被锁定,而解锁前的所有其他调用都失败。(通过测试程序执行文件wndscope.cpp(包含在本月的代码文档中)第93行上的run按钮的未注释手动锁定,可以很容易地显示这一点)。有趣的是,使用LockWindowUpdate的应用程序的两个版本同时运行。似乎任何调用这个函数的进程都“拥有”了锁定函数,并去掉了之前成功调用的所有权,这就简化为一串闪烁的解锁行为插入。

WM-SETREDRAW是由各种标准和自定义控件实现的消息,包括列表框、组合框、列表视图控件、按钮和选项卡控件。它通过清除和设置窗口重绘标志来工作。的一个小缺点是,应用程序必须在发送消息后使窗口矩形无效才能恢复活动,因此所有可见的窗口矩形都将被重绘。WM-SETREDRAW的使用通常会取代LockWindowUpdate的使用。当然,对于不支持此消息的windows,LockWindowUpdate仍然是一个可选工具。

这里给出了WinSTL库(http://winstl.org/)中的两个类window_update_scope和window_redraw_scope,以提供两种形式的自动锁定范围。(简略实现部分见表1和表2。的完整执行部分在存档文件中提供,也可以在WinSTL站点上在线获得)。在锁构造函数中设置它,并在析构函数中重置它:

Window_update_scope在其构造函数中调用LockWindowUpdate,如果成功,在其析构函数中调用LockWindowUpdate(null);Window_redraw_scope在其构造函数中发送WM-SETREDRAW(传递False)和WM-SETREDRAW(传递True)。它们都获得窗口的句柄来锁定它们的构造函数;Window_redraw_scope采用第二个参数(缺省值为True)来确定窗口解锁时是否无效(通过调用invalidate estradle)。

在附带的应用程序中演示了这两种技术的使用(图1),将许多项发送到listbox列表框,使用或不使用刚才描述的两种锁定技术。要展示这项技术,只需执行程序并选择“运行”来演示闪烁。然后,选择“使用LockWindowUpdate”和“使用WM-SETREDRAW”并运行它们来演示锁定。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++技巧之一(MFC)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情