我有一个包含许多 MDI 子窗口的应用程序。通常,用户可以通过单击窗口的客户区和非客户区将一个 MDI 子窗口置于最前面。这似乎通常在鼠标按钮按下时发生。
现在,有时发生的情况是,当用户单击其客户区域上的 MDI 子窗体时,窗口不会按预期出现在前面。但是,单击表单的标题栏确实会将窗口带到前面,但仅在释放鼠标按钮时。这样做的效果是,用户可以将一个 MDI 子窗口拖到另一个后面,当释放鼠标按钮时,被拖到的窗口会回到前面。
效果是,如果我有几个 MDI 子窗口相互部分重叠,我就不能像往常一样把一个窗口放在前面。这似乎与焦点无关 - MDI 子窗口可以具有焦点,但仍位于另一个 MDI 子窗口之后。
此外 - 这似乎是随机发生的,在使用该应用程序一段时间后。我可以使用从用户发送的序列化程序状态(“保存”文件)重现该错误。
我的问题有两个部分:任何想法为什么会发生这种情况,以及如何调试我的程序以找出为什么会发生这种情况?
我怀疑窗口消息 WM_ACTIVATE(或类似的东西)没有得到正确处理,但这是一个 C# 应用程序,我没有对消息队列做任何不寻常的事情。
编辑:这是来自 spy++ 的一些附加信息。
以下是一切正常时 spy++ 的输出:
<00013> 00D209AA S WM_PARENTNOTIFY fwEvent:WM_LBUTTONDOWN xPos:146 yPos:147
<00014> 00D209AA R WM_PARENTNOTIFY
<00015> 00D209AA S WM_WINDOWPOSCHANGING lpwp:0012EE90
<00016> 00D209AA R WM_WINDOWPOSCHANGING
<00017> 00D209AA S WM_CHILDACTIVATE
<00018> 00D209AA S WM_NCPAINT hrgn:D3043A75
<00019> 00D209AA R WM_NCPAINT
<00020> 00D209AA S WM_ERASEBKGND hdc:C20124F7
<00021> 00D209AA S WM_GETTEXTLENGTH
<00022> 00D209AA R WM_GETTEXTLENGTH cch:1
<00023> 00D209AA S WM_GETTEXT cchTextMax:4 lpszText:0012DC48
<00024> 00D209AA R WM_GETTEXT cchCopied:1 lpszText:0012DC48 (" ")
<00025> 00D209AA R WM_ERASEBKGND fErased:True
<00026> 00D209AA S WM_WINDOWPOSCHANGING lpwp:0012EB80
<00027> 00D209AA R WM_WINDOWPOSCHANGING
<00028> 00D209AA S WM_MDIACTIVATE hwndDeactivate:014809AE hwndActivate:00D209AA (activating)
<00029> 00D209AA S WM_NCACTIVATE fActive:True
<00030> 00D209AA R WM_NCACTIVATE
<00031> 00D209AA S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
<00032> 00D209AA R WM_IME_SETCONTEXT
<00033> 00D209AA S WM_SETFOCUS hwndLoseFocus:00B20A2A
<00034> 00D209AA R WM_SETFOCUS
<00035> 00D209AA R WM_MDIACTIVATE
<00036> 00D209AA R WM_CHILDACTIVATE
<00037> 00D209AA S WM_WINDOWPOSCHANGED lpwp:0012EE90
<00038> 00D209AA R WM_WINDOWPOSCHANGED
<00039> 00D209AA S WM_MOUSEACTIVATE hwndTopLevel:012C093A nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<00040> 00D209AA R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
当我从运行应用程序获得输出并重现错误时,单击客户区域会产生以下结果:
<01315> 023E0AA0 S WM_PARENTNOTIFY fwEvent:WM_LBUTTONDOWN xPos:139 yPos:142
<01316> 023E0AA0 R WM_PARENTNOTIFY
<01317> 023E0AA0 S WM_MOUSEACTIVATE hwndTopLevel:012C093A nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<01318> 023E0AA0 R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
查看消息编号,我可以立即看到有一堆消息没有发生,特别是WM_CHILDACTIVATE
.
解决方案
MdiParent
在显示窗口之前未设置其中一种形式的设置。