gpt4 book ai didi

c# - 激活时 MDI 窗口 z 顺序异常

转载 作者:行者123 更新时间:2023-11-30 15:42:04 24 4
gpt4 key购买 nike

我有一个包含许多 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 在显示窗口之前 未设置其中一种窗体。

最佳答案

这里有一些尝试的建议:

  • 向子窗体添加点击事件,并在点击时调用 Show() 将窗体置于最前面
  • 确保在所有子窗体上都设置了 MdiParent 属性
  • 确保 IsMdiContainer 属性在父窗体上设置
  • 将子窗体的WindowState设置为Normal
  • 使用Activate()激活表单并赋予它焦点

您还可以尝试利用父级的 z 顺序将焦点放在子级上:

this.ActiveMdiChild.SendToBack();
Control.ControlCollection ct = ((MdiClient)this.ActiveMdiChild.Parent).Controls;
((Form)ct[0]).Activate();

希望这些建议中的一项或多项能够解决您的问题。

关于c# - 激活时 MDI 窗口 z 顺序异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com