关于SetWindowPos的窗口排序的问题!(高分)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SetWindowPos的窗口排序的问题!(高分)相关的知识,希望对你有一定的参考价值。

想设计多个窗口的程序,不清楚怎样能将窗口的顺序排好。设计流程如下:
1、加载窗口1;
2、加载窗口2,希望窗口2始终保持在窗口1之上;
3、加载窗口3,希望窗口3始终在窗口2之上,而窗口2始终在窗口1之上,但三个窗口的任何窗口都能获得焦点。
用SetWindowPos函数怎么实现上述的功能?谢谢!

另外:用SetWindowPos函数后,指定的窗口会位于桌面上所有的窗口之前,不管是不是自己程序的窗口。请问能不能让顶端的窗口只是在自己程序的窗口中在最前,当别的程序的窗口获得焦点时,依然可以覆盖它。

方法其实很简单,不需要用API:

窗体1代码
Private Sub Form_Load()
Form2.Show , Me
End Sub

窗体2代码:

Private Sub Form_Load()
Form3.Show , Me
End Sub

窗体3不需要代码

这样show一次,三个窗体的次序会固定下来,并且不会影响其它窗体的次序,也不需要用API,form3一直在form2前面 form2一直在form1前面
参考技术A 设置窗口2为窗口1的子窗口;
设置窗口3为窗口2的子窗口。

反过来说可能更容易明白些:
创建窗口2时,设置其父窗口为窗口1;
创建窗口3时,设置其父窗口为窗口2。
参考技术B 楼上,你的方法的效果是一个时间只有一个窗口才能获得焦点!

第一个问题:
加载窗口1、窗口2、窗口3;
先对窗口2,再对窗口2实行 SetWindowPos,hWndInsertAfter 使用 HWND_TOPMOST 参数就符合要求。
第二个问题:
使用 SetParent 函数。
Declare Function SetParent Lib "user32.dll" (ByVal hChild As Long, ByVal hNewParent As Long) As Long
这个声明应该能看懂吧……前一个参数是待排序的子窗口句柄,后一个是新父句柄。比如:
hW1 = FindWindow(vbNullString, "无标题 - 记事本")
SetParent hW1, Me.hWnd 就可以了,把记事本窗口设置为自己的子窗口。
此时再次使用 SetWindowPos,hWndInsertAfter 采用 HWND_TOP 参数,用 Timer 监视就可以了。

附:SetWindowPos 使用样板
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
SetWindowPos Form2.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NORESIZE

以上是关于关于SetWindowPos的窗口排序的问题!(高分)的主要内容,如果未能解决你的问题,请参考以下文章

C++里怎么用setwindowpos()把一个窗口置于最前端?

windows界面程序设计,设置一个窗口始终在屏幕最前,SetWindowPos函数

API函数,setwindowpos及其它函数用法

SetWindowPos,RegisterHotKey,GlobalAddAtom的用法

MoveWindow和SetWindowPos

Windows API一日一练 38 SetWindowPos函数