我一直在創建一個跨平臺的GUI庫,我遇到了一個有趣的障礙。爲了使界面更加美觀,我試圖讓它可以在沒有父項的情況下創建一個按鈕,然後在構造函數完成後爲其分配一個父項。我得到的代碼主要工作,但點擊按鈕導致父窗口失去焦點。 我使用CreateWindowEx()創建按鈕併爲其提供樣式WS_POPUP | BS_PUSHBUTTON和一個空的父親。我使用WS_POPUP的原因是爲了避免標題欄大小影響按鈕的尺寸;沒有它,按鈕被壓扁。創建按鈕後,我使用SetParent()並用WS_CHILD替換WS_POPUP標誌。動態父按鈕竊取父母的焦點
1
A
回答
2
Windows API窗口不是這樣靈活。如文檔on MSDN所示,除了使用API調用(例如ShowWindow()
更改WS_VISIBLE
)之外,您不能手動更改標誌。爲什麼你不要延遲撥打CreateWindowEx()
,直到你的庫按鈕對象被分配給父窗口?
WS_POPUP意味着你想創建一個外行人可能會調用一個窗口。換句話說,可以包含小部件(WS_CHILD窗口)的頂級框架。儘管將標誌更改爲WS_CHILD,但隨後您設置爲父級的窗口可能會失去焦點,因爲按鈕會作爲單獨的頂級窗口出現在系統上。
還有更多的Windows行爲比它當前設置的標誌。如果Windows的設計很敏感,兩種類型的窗口(WS_POPUP
和WS_CHILD
)將由兩個完全不同的對象實現,根據傳遞給CreateWindowEx的標誌進行選擇。更改標誌不會奇蹟般地將底層對象從一種類型變爲另一種類型。
如果MSDN API文檔沒有明確指出標記是直接被操作的,並且沒有API調用來處理您的更改,那麼窗口標識的這個方面是不可變的。
相關問題
- 1. Flex TextInput左鍵單擊 - 父母竊取焦點
- 2. CSS按鈕 - 父母的100%
- 3. iFrame更改按鈕點擊父母
- 4. wxpython關閉父母點擊按鈕
- 5. ScrollViewer竊取焦點
- 6. 獲取div的父母的父母
- 7. 父母的父母的父母
- 8. 更新工具欄按鈕狀態竊取另一個窗口的焦點
- 9. 過濾在動態數據父母的父母
- 10. WPF Infragistics XamDataGrid竊取滾動焦點
- 11. ScrollView在滾動時竊取焦點
- 12. Resharper Test Runner竊取焦點
- 13. GoSms從alertDialog竊取焦點
- 14. ContextMenuStrip沒有竊取焦點
- 15. C#FormWindowState.Normal不竊取焦點
- 16. 從按鈕點擊獲取父對象
- 17. MVVM通按鈕,點擊父
- 18. 從父母活動中獲取數據從片段按鈕點擊
- 19. 佈置父母的父母
- 20. usercontrol在父母找到按鈕控制
- 21. jquery不能隱藏父母與按鈕
- 22. 離子後退按鈕與父母和孩子的狀態
- 23. 限制父母獲得焦點點擊它的一個子女
- 24. Rails的 - 按父母屬性
- 25. 按鈕點擊獲取每個功能的父母的文本值
- 26. 如何竊取Windows 7的焦點
- 27. SplashScreen.Close()竊取主窗口的焦點
- 28. 嵌入的Adobe Acrobat PDF竊取焦點
- 29. 在按鈕上添加一個孩子到父母點擊Xamarin.forms
- 30. 焦點父視圖swtbot
這很有道理。 API文檔指出,在使用SetParent()時應改變WS_CHILD和WS_POPUP標誌,所以必須有某種方法來改變它們。不過,我猜Get/SetWindowLongPtr()不是答案。 – blm768
我必須承認,我發現那些API文檔非常奇怪。我無法想象爲什麼一個按鈕會有明智的WS_POPUP風格。也許這隻適用於嵌套窗口,例如屬性表和對話框,這些窗口與頂層窗口同樣令人愉快,並且嵌套在父窗口中。 – thehouse
我想我可能只是重新創建窗口,每次像房子說的。有時候我開始決定Windows API並不是那麼糟糕,但我很快回到了現實中...... – blm768