使用WS_EX_COMPOSITE时不发送WM_PAINT

时间:2014-06-25 14:10:52

标签: visual-c++ mfc windows-messages

我正在使用MFC在遗留应用程序中工作。

我们有一种根据某些业务逻辑启用/禁用控件的机制。

此机制在CView派生类中实现。它的工作方式是从常见的CView派生类(CBaseView)派生的应用程序中的所有视图,并在PreTranslateMessage上启用/禁用视图的所有控件。

到目前为止,此工作正常,因为所有控件在需要绘制时至少发送WM_PAINT消息。因此系统在没有用户移动鼠标或任何东西的情况下工作。我最近添加了一些绘图功能,我不得不使用WS_EX_COMPOSITE来获取一些闪烁。激活此标志后,我的CView派生类在创建视图时没有调用PreTranslateMessage ....因此在用户将鼠标移到控件上之前,控件不会被禁用。

我知道没有办法使用WS_EX_COMPOSITE发送WM_PAINT但是我可以使用其他消息来获得相同的行为???

编辑:

我目前正在使用OnIdle方法,但它有一个很大的缺点,在绘制所有控件之后窗口都不会空闲...所以当你进入屏幕时,al控件被启用,并且它们被禁用......这会产生非常难看的效果!

更多解决方案???

提前致谢...

2 个答案:

答案 0 :(得分:1)

启用/禁用控件的逻辑位置为CView::OnUpdate,在视图文档被修改后由框架调用,并且来自OnInitialUpdate();如果存在一些会触发重新评估业务逻辑的更改,也可以调用此函数。

修改 在更仔细地阅读问题之后,您还可以做的是在OnInitialUpdate的末尾发布私人消息并且" catch"它在您的PreTranslateMessage中:

PostMessage(WM_APP, 0, 0);

答案 1 :(得分:0)

对相关窗口调用InvalidateRect后跟UpdateWindow会将整个客户区标记为脏并强制立即重绘。请记住,WM_PAINT实际上并不是一个消息,在通常意义上的队列中,在为该窗口处理了所有其他消息之后将其推出,这将包括正在绘制的区域的任何失效。如果活动窗口显示没有无效段,则根本不会生成任何消息。