对话框如何获得子控件的重绘消息?

时间:2022-12-16 14:37:00
因为我们的程序里用了一些自绘的代码,每次重绘都要调用一个自定义的方法 “UpdateWindow”
程序里面的大部分控件如 Button, Text 都是自制的,会调用 UpdateWindow
然而现在在对话框里加入了一个 ActiveX 控件,在 ActiveX 控件重绘时 UpdateWindow 方法不会调用,导致控件内容一片空白。只有在其他控件调用 UpdateWindow 后才会正确绘制

请问大家在对话框中有没有办法获知子控件的重绘事件好调用 UpdateWindow 重绘对话框?

10 个解决方案

#1


控件内容不是控件自己绘的么?与父窗口没关系.

如果控件自己不绘,是不是要显示窗口的内容?如果是去掉WS_CHIPCHILD属性

#2


控件不是不绘,而是与对话框的绘制起了冲突,导致显示不出来,只要调一下 UpdateWindow 函数(自定义的对话框绘制函数)就可以了
但是因为不知道控件什么时候需要重绘,所以无法确定调用 UpdateWindow 的时机

#3


是什么时候导致控件不自绘?

#4


刚刚又试了一下,问题好像还不是在 UpdateWindow 上

情况是这样的,对话框上有一个 ActiveX(Web Browser) 控件,点击这个控件或者滚动控件的滚动条都会导致控件区域变成一片白色。但是这时点击对话框上的任何一个按钮,ActiveX 控件的内容就会显示出来。

为此我将按钮类(继承自CButton)的 OnLButtonDown 中的代码一行行注释掉,发现去掉 CButton::OnLButtonDown 后,点击按钮 ActiveX 控件也显示不出来了...

#5


个人认为:
并非ActiveX控件显示不出来,而是由于控件响应相关事件后未自动重绘造成的。
一般好的ActiveX控件,他都有封装自动重绘功能,你可以查查看是否有相关方法?有的话,试试在OnPaint()中手动刷新。

#6


ActiveX 控件本身是没问题的
但是我们自己写了个 UpdateWindow 函数,用来“画”界面,导致与 ActiveX 冲突了
我本以为只要正确的调用了 UpdateWindow 函数就可以显示正确(因为点击 Button 时会调 UpdateWindow 函数,然后显示就正确了),但现在看来情况并非如此

#7


仔细研究了一下UpdateWindow 发现这是调用 UpdateLayeredWindow 绘制窗口的
是不是因为这个原因,和 ActiveX 冲突了?

#8


引用 7 楼 yizhili 的回复:
仔细研究了一下UpdateWindow 发现这是调用 UpdateLayeredWindow 绘制窗口的
是不是因为这个原因,和 ActiveX 冲突了?
你的实现方法本身就有问题,应该在控件的WM_PAINT里自绘,控件跟父窗口互不相关,Menu除外。

#9


看 MSDN 里的说法,使用 UpdateLayeredWindow 似乎是不用 WM_PAINT 消息的...

#10


我遇到跟你一样的问题,请问楼主解决了没有?

#1


控件内容不是控件自己绘的么?与父窗口没关系.

如果控件自己不绘,是不是要显示窗口的内容?如果是去掉WS_CHIPCHILD属性

#2


控件不是不绘,而是与对话框的绘制起了冲突,导致显示不出来,只要调一下 UpdateWindow 函数(自定义的对话框绘制函数)就可以了
但是因为不知道控件什么时候需要重绘,所以无法确定调用 UpdateWindow 的时机

#3


是什么时候导致控件不自绘?

#4


刚刚又试了一下,问题好像还不是在 UpdateWindow 上

情况是这样的,对话框上有一个 ActiveX(Web Browser) 控件,点击这个控件或者滚动控件的滚动条都会导致控件区域变成一片白色。但是这时点击对话框上的任何一个按钮,ActiveX 控件的内容就会显示出来。

为此我将按钮类(继承自CButton)的 OnLButtonDown 中的代码一行行注释掉,发现去掉 CButton::OnLButtonDown 后,点击按钮 ActiveX 控件也显示不出来了...

#5


个人认为:
并非ActiveX控件显示不出来,而是由于控件响应相关事件后未自动重绘造成的。
一般好的ActiveX控件,他都有封装自动重绘功能,你可以查查看是否有相关方法?有的话,试试在OnPaint()中手动刷新。

#6


ActiveX 控件本身是没问题的
但是我们自己写了个 UpdateWindow 函数,用来“画”界面,导致与 ActiveX 冲突了
我本以为只要正确的调用了 UpdateWindow 函数就可以显示正确(因为点击 Button 时会调 UpdateWindow 函数,然后显示就正确了),但现在看来情况并非如此

#7


仔细研究了一下UpdateWindow 发现这是调用 UpdateLayeredWindow 绘制窗口的
是不是因为这个原因,和 ActiveX 冲突了?

#8


引用 7 楼 yizhili 的回复:
仔细研究了一下UpdateWindow 发现这是调用 UpdateLayeredWindow 绘制窗口的
是不是因为这个原因,和 ActiveX 冲突了?
你的实现方法本身就有问题,应该在控件的WM_PAINT里自绘,控件跟父窗口互不相关,Menu除外。

#9


看 MSDN 里的说法,使用 UpdateLayeredWindow 似乎是不用 WM_PAINT 消息的...

#10


我遇到跟你一样的问题,请问楼主解决了没有?