2011-05-18 182 views
7

好吧,首先我使用win32 api編碼,不使用mfc,不使用.net,不使用wxwidgets。 我用WC_TABCONTROL類創建了一個窗口,並添加了標籤,除了...我需要在每個標籤中都有內容,我從msdn得到了我需要爲每個標籤創建一個對話框的印象頁面,然後在用戶選擇選項卡時加載對話框。唯一的問題是我的主窗口不是一個對話框,因此使得該選項卡的對話框完全適合不起作用。C win32選項卡控件

所以我想知道是否有更好的方法來做到這一點?我想過隱藏和顯示每個標籤的不同控件,但這似乎不是一個好主意。

我想要的是,當我的應用程序啓動時,它將調整窗口大小和選項卡控件大小以適應所有選項卡(3-4選項卡)所需的最小大小,並且窗口不會調整大小我想這簡化了一些事情。我通過以下msdn上的示例(將每個對話框加載到內存中,循環每個對話框並將RECT設置爲所需的最小大小然後調整所有內容的大小)來實現此目的,問題在於大小在對話框單元中,而我無法將它轉換爲像素,因爲我還沒有HWND到對話框。

基本上我的問題是,什麼是管理與標籤控件的窗口上的控件的最好方法。所以如果我有一個選項卡控件,並且用戶從tab1更改爲tab2,我希望向用戶顯示不同的控件。

+4

Upvoted爲我的同胞「沒有mfc,沒有.net,沒有wxwidgets」的兄弟。 :( – Colen 2011-05-18 18:08:27

+7

我不使用mfc或.net或wxwidgets的原因是:學習的目的,而win32 API令我着迷。而且我一直喜歡做低一點的事情。 – Josh 2011-05-18 19:08:25

回答

3

MSDN的基本思想是在每個選項卡的HWND中擁有控件。這樣做的好處是,您可以通過隱藏/顯示父HWND來隱藏/顯示HWND中的所有控件。這意味着從一個標籤到另一個標籤只是一個隱藏一個容器HWND的情況,並且顯示另一個容器,比隱藏/顯示控件組更簡單更優雅。 (它也將每個窗格的對話框處理程序代碼分開,這通常是您想要的。)但是,這兩種方法都是允許的:創建對話框通常更方便,但您不需要。

這些容器HWND不一定是對話框,但使用對話框意味着Windows將爲您填充.rc文件中的內容並自動處理鍵盤切換。如果你創建自己的HWND,你必須自己做。你可以採取一種混合的方法:首先使用對話框,但如果需要,可以在WM_INITDIALOG處理程序中添加自己的控件,甚至可以處理WM_SIZE以執行自定義佈局,以便控件更好地適應。

如果您使用創建自己的HWND路徑,請查找IsDialogMessage()以獲取將鍵盤Tab鍵支持添加到您自己的HWND的簡單方法;並檢出WS_EX_CONTROLPARENT樣式,以便在選項卡本身和容器HWND中的控件之間起作用。

回覆:「問題是,大小是在對話框單位,我不能將它轉換爲像素,因爲我沒有HWND的對話框呢。」 - 您可以使用CreateDialog將對話框創建爲不可見 - 從.rc文件中省略WS_VISIBLE - 然後您可以在顯示它之前適當地測量/調整大小。

+0

我想過使用CreateDialog創建每個對話框並檢查大小,唯一的問題是,創建約4個對話框只是爲了讓應用程序運行,並且id更願意根據需要創建它們,所以如果以任何方式我都可以檢查每個對話框的大小而不實際創建它們,那會解決我的問題:) – Josh 2011-05-18 22:17:20

+1

對話框可能相對便宜實例化 - 無論如何,相對於終端用戶對時間的感知。(如果你用來自慢速信息源的信息填充它們,那麼確定,延遲人羣。)我的2c:先試試它,然後看看它是否足夠快。如果速度夠快,那麼你就完成了,繼續下一個問題。只需花費時間增加額外的複雜度來衡量而不用創建,如果您確定需要做出必要的改變。 (通用開發規則:不要過早優化:開發時間是一個寶貴的資源,在它最有效的地方使用它。) – BrendanMcK 2011-05-19 07:28:10