研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息
為了與Win32 GUI的函數(shù)功能兼容,得先知道Windows是怎么處理這些信息的,才能模仿。
這次研究對象是SetActiveWindow與SetFocus和窗口消息WM_SETFOCUS,WM_ACTIVATE之間的關(guān)系
------------------------------------
SetFocus
功能:設(shè)置新的焦點窗口,只有焦點窗口才能獲取鍵盤輸入消息
1.這個函數(shù)會檢查輸入的窗口,如果是最小化的窗口,或者禁用的窗口,則不會改變焦點.
2.如果要設(shè)置的焦點窗口是子窗口,且其父窗口不是激活狀態(tài),還會調(diào)用SetActiveWindow將其父窗口激活.
3.檢查激活窗口是否成功,如果沒有成功,則取消設(shè)置新焦點.
4.向窗口發(fā)送WM_SETFOCUS消息,向前一個焦點窗口發(fā)送WM_KILLFOCUS消息
-----------------------------------
SetActiveWindow
功能:設(shè)置激活窗口,只有激活窗口,才能擁有焦點窗口
1.檢查傳入的窗口,如果是子窗口,則取消操作
2.向當前激活窗口發(fā)送WM_NCACTIVE消息,如果當前激活窗口返回FALSE,則表示它不同意其它窗口被激活,所以取消操作.
3.如果第2步?jīng)]有問題,則向當前激活窗口發(fā)送WM_ACTIVE消息,告之被取消激活.
4.將傳入的窗口標記為激活窗口,并將窗口的Z序置頂,
5.向新激活窗口發(fā)送WM_NCACTIVE和WM_ACTIVE消息,告之被成功激活.
---------------------------------
WM_NCACTIVE
這個消息通知窗口,非客戶區(qū)被激活或取消激活.
當WPARAM參數(shù)為FALSE時,表示窗口要被取消激活,此時如果返回FALSE,則會阻止被取消激活,返回TRUE則表示允許被激活。
DefWindowProc 處理方式:做一些內(nèi)部標記,如果lParam為-1的話,還要重繪標題欄和菜單欄!
WM_SETFOCUS?
這個消息是通知窗口,即將獲得或失去焦點;
DefWindowProc好像并沒有處理這個消息。
WM_ACTIVATE?
?這個消息是通知窗口,即將被激活或取消激活;
DefWindowProc 處理方式是:如果這個窗口馬上要被激活了,則將這個窗口設(shè)置為焦點窗口
---------------------------------
這里很詭異的是,如果對一個未激活的主窗口調(diào)用SetFocus,它會激活這個窗口,
而激活這個窗口會發(fā)送WM_ACTIVE消息,而默認處理WM_ACTIVE消息的方式又是對這個窗口調(diào)用SetFocus...
總結(jié)
以上是生活随笔為你收集整理的研究Win32 GUI中SetActiveWindow与SetFocus和窗口消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机知识在物理学中的应用,浅谈物理学在
- 下一篇: 【毕业设计】深度学习实现行人重识别 -