哪些窗體置頂得程序是怎麼實現得?

窗口置頂即不允許其他窗口在我之上,比如微信聊天窗口中右上角的釘子按鈕,確認後,普通窗口不能在他之上,但是也不是絕對的,同樣具有置頂屬性的窗口也能覆蓋掉他,這些是通過WindowsApi中的SetWindowPos函數來完成。

SetWindowPos

更改子窗口、彈出窗口或頂級窗口的大小、位置和Z順序。這些窗口是根據屏幕上的外觀排序的。最頂部的窗口獲得最高排名,並且是Z順序中的第一個窗口。
在這裏插入圖片描述
參數有7個,但是實現置頂功能,只需要hWnd(要置頂窗口的句柄)、hWndInsertAfter(標識在z中的順序)、uFlags(窗口的標誌)。

hWndInsertAfter可以取值如下:
1.HWND_BOTTOM:值爲1,將窗口置於Z序的底部。如果參數hWnd標識了一個頂層窗口,則窗口失去頂級位置,並且被置在其他窗口的底部。

2.HWND_NOTOPMOST:值爲-2,將窗口置於所有非頂層窗口之上(即在所有頂層窗口之後)。如果窗口已經是非頂層窗口則該標誌不起作用。

3.HWND_TOP:值爲0,將窗口置於Z序的頂部。

4.HWND_TOPMOST:值爲-1,將窗口置於所有非頂層窗口之上。即使窗口未被激活窗口也將保持頂級位置

很顯然要用到-1,

uFlags取值非常多,不列舉了,但是要取 SWP_NOSIZE 和SWP_NOMOVE用來忽略參數 x、y、 cx、 cy,也就是忽略窗口的大小和位置,不然SetWindowPos會重新定義位置和大小,組合值用或運算來連接,SWP_NOSIZE值爲1,SWP_NOMOVE值爲2,即最後值1| 2=3。

拿vb做個例子,運行後,窗口會被置頂,他可以跑到其他被置頂的窗口上面,同樣其他被置頂窗口也能在他之上。

Private Declare Function SetWindowPos Lib "user32.dll" (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
Private Const SWP_SHOWWINDOW As Long = &H40
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOMOVE As Long = &H2
Private Const HWND_TOPMOST As Long = -1

Private Sub Form_Load()
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
End Sub

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章