使用 WS_EX_COMPOSITE 时不发送 WM_PAINT

Posted

技术标签:

【中文标题】使用 WS_EX_COMPOSITE 时不发送 WM_PAINT【英文标题】:WM_PAINT not send when using WS_EX_COMPOSITE 【发布时间】:2014-06-25 14:10:52 【问题描述】:

我正在使用 MFC 处理旧应用程序。

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

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

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

我知道无法使用 WS_EX_COMPOSITE 发送 WM_PAINT,但我可以使用其他消息来获得相同的行为吗???

已编辑:

我目前正在使用 OnIdle 方法,但它有一个很大的缺点,在绘制所有控件之前,窗口不会变为空闲状态......所以当你进入屏幕时,所有控件都被启用并立即被禁用...... .这会产生非常丑陋的效果!

更多解决方案???

提前谢谢...

【问题讨论】:

MFC 中的大多数 UI 启用/禁用是在空闲处理期间完成的 - 也许这是一个选项?您需要覆盖 CWinApp::OnIdle() IIRC。 谢谢罗杰!我在谷歌上搜索并找到了一些有趣的例子......我会试一试。不过,我仍然想获得其他想法! 您是在您的CView 派生类中手动创建控件,还是您的视图基于CFormView?您是否需要根据视图文档中的值以及它们何时更改来启用/禁用控件? 不,我不是手动创建控件,它们是 CFormView 派生类。我需要一种不需要为视图中的任何控件创建代码的机制。 在 PreTranslateMessage 中实现的“业务逻辑”是什么?是不是有一些事件可以启用或禁用控件? PreTranslateMessage 不是启用或禁用控件的最佳位置。 【参考方案1】:

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

编辑 在仔细阅读问题后,您还可以在 OnInitialUpdate 末尾发布一条私人消息,并将其“捕获”到您的 PreTranslateMessage 中:

PostMessage(WM_APP, 0, 0);

【讨论】:

如果您必须禁用基于外部事件的控件(例如,只有在剪贴板包含文本时才应启用的粘贴按钮),这将无济于事。 你是对的,但 OP 似乎没有动态逻辑(业务逻辑基本上是一个结构,其中包含有关应根据屏幕和/或记录禁用哪些控件的信息用户) 用于启用/禁用控件 @FrédéricHamidi:抱歉,忘记在我之前的评论中添加您的用户名 @FrédéricHamidi 我同意 OnUpdate 和 OnInitialUpdate 是启用/禁用常规操作控件的地方。但在这种情况下,这将需要大量的“管道工程”。我需要在后台自动调用的东西。使用 OnIdle 状态听起来不错,但我担心性能。当应用程序不处理消息时将调用 OnIdle,但这并不意味着不工作。我们有很多工作线程。 @EdwardClements 是一个不错的选择,但您仍然需要在每次更改控制状态时发送应用程序消息。使用 WM_PAINT 消息,我只需要使视图无效。此外,这是我没有在问题中评论的内容,但是在 CBaseDialog 中为应用程序中的所有对话框实现了相同的机制,并且这种方法在那里不起作用。无论如何,我实现了 OnIdle 方法,它工作正常。我会接受您的回答,因为我认为您的 cmets 很有用,非常感谢您的帮助。【参考方案2】:

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

【讨论】:

以上是关于使用 WS_EX_COMPOSITE 时不发送 WM_PAINT的主要内容,如果未能解决你的问题,请参考以下文章

IE10 使用 CORS 时不发送 cookie

使用 react-navigation 时不发送 redux 状态

stomp nodejs在连接时不发送标头

发送消息时不和谐机器人出错

为啥浏览器在请求 JavaScript 文件时不发送 cookie?

C#:UdpClient 很快调用 close() 时不发送数据