我们希望有些窗口需要置顶Topmost = true;但是置顶的窗口多了以后会出现很多麻烦
1.导致层次混乱,同样是置顶,因此相互冲突,运行中会随着焦点的不同发生变化。
2.主窗口打开对话框时,这些置顶窗口依旧在对话框上,不美观也不方便使用,非常影响客户体验。
如果采用动态调整,虽然可以解决,但是会导致代码量增加,而且会解决逻辑判断问题。
其实我们可以使用简单的办法就是嵌入:
SetParent(子窗口, 父窗口);
只是个WinAPI函数,实际中我发现子窗口如果在快速更新中(比如PPT转场效果),如果嵌入到别的窗口(控件),就会导致报错甚至死锁。
因此这个函数是用需要慎重。
调整指定窗口的层次,我现在使用设置窗口“父子”逻辑关系的办法,也就是把上层窗口的“父”属性,指向下层的主窗口。
具体代码:
WindowInteropHelper TopWindow = new WindowInteropHelper(TopWin);
TopWindow.Owner = MainWin.Handle;
上面的代码是用C#实现的,如果有的窗口不是自己的是别的程序的,可以用下面的代码(WInAPI)
SetWindowLong(TopWindows, beiger.GWL_HWNDPARENT, MainWin);
这样,Top窗口在Main窗口上,不会被Main遮挡,也不会出现在Main的对话框上,影响用户操作了。
版权归原作者 beiger 所有, 如有侵权,请联系我们删除。