2009-07-20 35 views
3

在Win32 API C++項目中,我有一個帶有選項卡控件(3個選項卡)和3個對話框的對話框,這些對話框是選項卡控件的子項。我使用DialogBoxParam加載具有選項卡控件的主對話框,並使用CreateDialogParam從資源加載子對話框。主對話框出現在子對話框中。點擊標籤顯示/隱藏正確的子對話框,一切工作正常。帶有嵌套對話框的選項卡控件中的Tab順序(WS_EX_CONTROLPARENT)

經過搜索周圍的標籤訂單後,我發現WS_EX_CONTROLPARENT風格設置在選項卡控件上,以獲取選項卡工作到子對話窗口。這很好,除了一個問題:選項卡控件本身永遠不會獲得焦點,所以我無法通過鍵盤選項卡切換到不同的選項卡。鍵盤焦點會通過子對話框,主對話框上的按鈕,然後直接返回到子對話框,並且永遠不會停在選項卡控件本身上,因此我必須單擊選項卡控件才能更改選項卡。這讓我瘋狂。有什麼建議麼?

更新:我設法通過完全忘掉WS_EX_CONTROLPARENT並使該子對話框中的選項卡控件的兄弟對齊來解決該問題。唯一的副作用似乎是在重新繪製過程中控件的更多閃爍,但仍然需要一個答案,因爲使選項卡的子對話框的子對象看起來更清晰。

回答

3

它不乾淨。建議選項卡式對話框的建議方法是製作對話框的選項卡頁面。選項卡控件只是控制哪些頁面可見,但不是它們的父級。

當您嘗試讓XP主題在對話框上工作時,這一點尤其重要。

WS_EX_CONTROLPARENT是一種旨在設置在實際「標籤」對話框上的樣式。

我認爲你已經在選項卡控件上設置了WS_TABSTOP?我認爲WS_TABSTOPWS_EX_CONTROLPARENT在同時設置時會發生衝突,因爲它們會告訴對話管理器在製表符週期達到控件時執行兩個完全不同且衝突的事情。

最後,我看不出任何理由,閃爍應該會增加,因爲對話框頁面是對話框的子項而不是選項卡控件。

+0

適用於我。製作選項卡控件的子對話框的網絡上的樣本太多,MS在文檔中沒有說清楚。我已經啓用了XP選項卡主題,並且它工作正常。 – Jay 2009-12-16 13:25:27

0

您不能AFAIK,因爲按設計,選項卡會在對話框的子控件中循環。最好你可以做的是預處理標籤keydown事件,如果焦點在對話框中的最後一個控件之後,請關注標籤頁並放棄事件。不是比我已經擁有的解決方案更清潔。

+0

似乎DialogProc沒有得到處理Tab鍵的機會,我不想編寫自己的消息循環來解決這個問題。所以我決定離開我的解決方案並繼續前進。我很驚訝,我找不到其他人在網上遇到同樣的問題。大家都說使用WS_EX_CONTROLPARENT,然後產生這個新問題。 – Jay 2009-07-24 18:38:12

相關問題