Visual c++ 使用WS_EX_复合材料时不发送WM_油漆

Visual c++ 使用WS_EX_复合材料时不发送WM_油漆,visual-c++,mfc,windows-messages,Visual C++,Mfc,Windows Messages,我在使用MFC的遗留应用程序中工作 根据某些业务逻辑,我们有一种启用/禁用控件的机制 此机制在CView派生类中实现。它的工作方式是,应用程序中的所有视图都是从一个公共CView派生类(CBaseView)派生的,并且在PreTranslateMessage上,该视图的所有控件都是启用/禁用的 到目前为止,这种方法效果很好,因为所有控件在需要绘制时都至少发送WM_绘制消息。因此,该系统可以在用户不必移动鼠标或任何东西的情况下工作。我最近添加了一些绘图功能,我不得不使用WS_EX_COMPOSIT

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

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

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

到目前为止,这种方法效果很好,因为所有控件在需要绘制时都至少发送WM_绘制消息。因此,该系统可以在用户不必移动鼠标或任何东西的情况下工作。我最近添加了一些绘图功能,我不得不使用WS_EX_COMPOSITE来克服一些闪烁。激活此标志后,我的CView派生类在创建视图时不会收到任何调用以预翻译消息…因此,在用户将鼠标移到控件上之前,控件不会被禁用

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

编辑:

我目前使用的是OnIdle方法,但它有一个很大的缺点,在绘制所有控件之前,窗口不会空闲…因此,当你进入屏幕时,所有控件都被启用,而在中间它们被禁用…这造成了一个非常丑陋的效果

更多解决方案


提前感谢…

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

编辑 在仔细阅读问题之后,您还可以在OnInitialUpdate的末尾发布一条私人消息,并在您的预翻译消息中“捕获”它:

PostMessage(WM_APP, 0, 0);

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

MFC中的大多数UI启用/禁用都是在空闲处理期间完成的-也许这是一个选项?您需要重写
CWinApp::OnIdle()
IIRC。谢谢罗杰!我在谷歌上搜索了一下,发现了一些有趣的例子……我会试试看。不过我还是想得到其他的想法!您是在
CView
派生类中手动创建控件,还是基于
CFormView
?您是否需要根据视图文档中的值以及更改时启用/禁用控件?不,我不是手动创建控件,它们是CFormView派生类。我需要一种不需要为视图中的任何控件创建代码的机制。在PreTranslateMessage中实现的“业务逻辑”是什么样子的?是否有一些事件可以启用或禁用控件?PreTranslateMessage不是启用或禁用控件的最佳位置。如果您必须基于外部事件禁用控件(例如,仅当剪贴板包含文本时才应启用的粘贴按钮),则这不会有帮助。您是对的,但OP似乎没有动态逻辑(业务逻辑基本上是一种结构,根据屏幕和/或登录用户的不同,它包含有关应禁用哪些控件的信息)用于启用/禁用controls@FrédéricHamidi:对不起,忘了将您的用户名添加到我以前的帐户中comment@FrédéricHamidi我同意OnUpdate和OnInitialUpdate是启用/禁用常规操作控制的地方。但在这种情况下,这将需要大量的“管道工”。我需要在后台自动调用的东西。使用OnIdle状态听起来不错,但我担心性能。当应用程序不处理消息时,将调用OnIdle,但这并不意味着它不工作。我们有很多工作线程。@EdwardClements是一个不错的选择,但您仍然需要发送应用程序每次控制状态发生变化时,都会显示一条消息。使用WM_PAINT消息,我只需要使视图无效。此外,这是我在问题中没有评论的内容,但在CBASEDALOG中为应用程序中的所有对话框实现了相同的机制,这种方法在那里不起作用。无论如何,我实现了OnIdle appr我会接受你的回答,因为我认为你的评论很有用,我真的很感谢你的帮助。