我正在为应用编写插件;插件是显示模态对话框。它显示得很好,但当我移动它时,它会在屏幕上留下一条痕迹,即下面的窗口不会重绘。它的某些部分会重绘(所有标准的Windows控件,例如工具栏或滚动条),但客户区的其余部分却没有。
我正在使用DialogBoxIndirectParam
; hWnd
是应用程序的顶部窗口,我在运行中构建的模板和对话框标志是WS_POPUP | WS_CAPTION | DS_MODALFRAME | DS_SETFONT | WS_SYSMENU
,此外,函数设置了一些标志,例如WS_CLIPSIBLINGS
。对话框类是标准的(CS + DBLCLKS,CS_SAVEBITS)对话框程序非常基本,它目前只处理WM_CLOSE
消息。
我试过谷歌,但没有管理找到任何直接相关的东西。我试图将我的对话框类与同一个应用程序的其他对话框进行比较,并检查了消息日志,但我没有看到任何明显的差异。
为什么父母/老板不会重绘,我该如何解决?
更新即可。这是相关的电话。
调用对话框:
class Dialog(object):
def run(self):
t = cast(c_char_p(self.template()), LPCDLGTEMPLATE)
p = GetActiveWindow()
r = DialogBoxIndirectParamW(0, t, p, dialog_proc_2, py_object(self))
窗口程序:
def dialog_proc(window, message, wparam, lparam):
if message == WM_CLOSE:
EndDialog(window, IDCANCEL);
return 1
return 0
这是Python代码:)它是通过ctypes
工作的嵌入式Python。插件在主线程中运行;主机应用程序进行同步调用,即等待被调用函数返回。 self.template()
返回我即时准备的DLGTEMPLATEEX
数据;我相信我这样做是正确的,因为对话框显示,当我用Spy检查时,所有标志似乎都被设置(除了还有一些)。我不使用实例句柄,因为我没有从资源加载任何东西。我相信我正确地包装了所有函数和常量,但我也可以发布定义。 GetActiveWindow
(或GetForegroundWindow
)返回指向应用主窗口的指针;它是一个MDI应用程序,它重新绘制除MDI窗口的客户区之外的所有内容:
在这里,我将窗口移动到所有可见窗口(工具栏,按钮等)上,唯一没有重新绘制的部分是MDI文档的客户区。
答案 0 :(得分:2)
您需要泵送消息队列以使绘制循环起作用。似乎有一些抽水(你说有些控件重新抽奖)。
由于模态对话框运行自己的消息泵,我会猜测你的插件的主机在其消息泵中有一些特殊的消息处理,很可能是错误的,你的标准对话框消息泵以不同的方式做事。
我正在猜测并大肆宣传,但我怀疑你的主机应用的消息循环不是标准的TranslateMessage
/ DispatchMessage
形式。如果是这样,那么你就是真正的软管。
如果没有更多详细信息,就不可能确切地说出任何事情。正如汉斯所说,最小的复制会使问题变得容易解决。