2012-06-08 60 views
1

我一直在創建一個跨平臺的GUI庫,我遇到了一個有趣的障礙。爲了使界面更加美觀,我試圖讓它可以在沒有父項的情況下創建一個按鈕,然後在構造函數完成後爲其分配一個父項。我得到的代碼主要工作,但點擊按鈕導致父窗口失去焦點。 我使用CreateWindowEx()創建按鈕併爲其提供樣式WS_POPUP | BS_PUSHBUTTON和一個空的父親。我使用WS_POPUP的原因是爲了避免標題欄大小影響按鈕的尺寸;沒有它,按鈕被壓扁。創建按鈕後,我使用SetParent()並用WS_CHILD替換WS_POPUP標誌。動態父按鈕竊取父母的焦點

回答

2

Windows API窗口不是這樣靈活。如文檔on MSDN所示,除了使用API​​調用(例如ShowWindow()更改WS_VISIBLE)之外,您不能手動更改標誌。爲什麼你不要延遲撥打CreateWindowEx(),直到你的庫按鈕對象被分配給父窗口?

WS_POPUP意味着你想創建一個外行人可能會調用一個窗口。換句話說,可以包含小部件(WS_CHILD窗口)的頂級框架。儘管將標誌更改爲WS_CHILD,但隨後您設置爲父級的窗口可能會失去焦點,因爲按鈕會作爲單獨的頂級窗口出現在系統上。

還有更多的Windows行爲比它當前設置的標誌。如果Windows的設計很敏感,兩種類型的窗口(WS_POPUPWS_CHILD)將由兩個完全不同的對象實現,根據傳遞給CreateWindowEx的標誌進行選擇。更改標誌不會奇蹟般地將底層對象從一種類型變爲另一種類型。

如果MSDN API文檔沒有明確指出標記是直接被操作的,並且沒有API調用來處理您的更改,那麼窗口標識的這個方面是不可變的。

+0

這很有道理。 API文檔指出,在使用SetParent()時應改變WS_CHILD和WS_POPUP標誌,所以必須有某種方法來改變它們。不過,我猜Get/SetWindowLongPtr()不是答案。 – blm768

+0

我必須承認,我發現那些API文檔非常奇怪。我無法想象爲什麼一個按鈕會有明智的WS_POPUP風格。也許這隻適用於嵌套窗口,例如屬性表和對話框,這些窗口與頂層窗口同樣令人愉快,並且嵌套在父窗口中。 – thehouse

+0

我想我可能只是重新創建窗口,每次像房子說的。有時候我開始決定Windows API並不是那麼糟糕,但我很快回到了現實中...... – blm768