|
|
1
2
我假设您的非模态对话框是ws撊popup窗口,对吗?(也就是说,它们是浮动窗口,可以出现在屏幕上的任何位置,而不只是在应用程序窗口中)。 如果它们是浮动窗口,那么从技术上讲,它们不是框架窗口的子窗口,但是文档往往使用这个术语 起源 在它真正应该使用的地方 主人 所以这很容易让人困惑。子窗口不能出现在其父窗口的工作区之外,拥有的窗口可以。当子窗口的父窗口失效时,子窗口将失效。但拥有的窗口不会。 只有具有ws_child-style标志的窗口可以是子窗口,否则它们是属于自己的窗口。 如果这些是自己拥有的窗口,它们不会从主应用程序窗口继承无效性,因此您需要在代码中查找调用::invalidrect()的位置,其中第一个参数为空句柄。通常这是因为变量未初始化。
当你打电话
一旦你得到了onpaint,现在知道无效请求来自何处为时已晚。所以为了找到这个bug,你必须检查你的代码或者拦截
在一般情况下,这是一个困难的问题,因为有几种方法可以使窗口的全部或部分无效,并且在头文件中有许多代码可以通过创建自动执行某些操作的此函数的变体来“帮助”您。
您可以尝试在
您还可以尝试强制编译所有代码,以便通过您控制的函数重定向对invalidrect的调用。
如果找不到,那就做同样的事
这些虫子很难找。我不羡慕你。在我自己的代码中,我永久禁止直接调用invalidrect,它们必须始终通过包装函数,以便我可以始终检查调试版本中的空窗口句柄。但是,同样,我不使用MFC,所以执行这种策略更容易。 |
|
|
2
0
看看这个: http://msdn.microsoft.com/en-us/library/01c9aaty(VS.80).aspx 您可能会重写onpaint并找出消息来自哪里… 编辑: 当Windows或应用程序请求重新绘制应用程序窗口的一部分时,框架调用此成员函数。 因此,要么操作系统请求重新绘制,要么在应用程序中完成。 还可以看看这个论坛主题的第一个答案: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/3f53fce3-38dd-441b-b112-82eff4dafc9e |
|
|
3
0
我会像在MFC中调试任何我不太理解的东西那样做——我试图通过在一个全新的项目中复制行为来隔离问题。 因此,创建一个全新的MFC应用程序,向它添加一个无模式对话框,在cView上调用invalidate,看看它是否仍然发生。 如果它仍然发生,那么它必须是您的主机发送油漆消息。然后你可以尝试在你的主机的预传输消息中捕获它。 如果它没有发生,那么您在应用程序中所做的一些事情就是导致它发生的原因。如果是这样的话,您可以尝试通过消除应用程序中的复杂性来解决您所做的工作,直到找到导致此问题发生的原因为止。 不 不再发生了。 |
|
|
4
0
对话框也接收到wm_paint消息的原因是它们是cView的子窗口,正如karim已经建议的那样。
最可能发生的情况是,在导致重新绘制视图的无效声明之后
wm_paint消息本身由Windows发送,以响应调用
最接近消息处理机制背后的场景的是重写cView类的windowproc,该类是从cwnd派生的。这是收到wm_paint和任何其他消息的回调。 干杯 霍格尔 |
|
|
revy · Impala通过jdbc使元数据无效 8 年前 |
|
|
aiueoH · 在Android中设置布局参数后何时更新视图 10 年前 |
|
|
R3tep · Momentjs:如何防止“无效日期”? 11 年前 |
|
|
Sergey92zp · NSTimer不会因失效而停止 13 年前 |
|
|
Jeremy · 如何“禁用”Java对象? 13 年前 |