共用方式為


關於對話框

有許多函式、訊息和預先定義的控制項可協助建立和管理對話框,因此更容易開發應用程式的使用者介面。 本概觀描述對話框函式和訊息,並說明如何使用它們來建立和使用對話方塊。

此概觀包含下列主題:

如需通用對話框的詳細資訊,請參閱 通用對話框連結庫

使用對話框的時機

大部分的應用程式都會使用對話框來提示輸入需要使用者輸入之功能表項的其他資訊。 使用對話框是應用程式擷取輸入的唯一建議方式。 例如,典型的 開啟 功能表項需要指定要開啟的檔案名稱,因此應用程式應該使用對話框來提示使用者輸入檔案名稱。 在這種情況下,當使用者按一下選單項時,應用程式會建立對話框,並在使用者提供資訊後立即關閉對話框。

許多應用程式也會使用對話框,在使用者在另一個視窗中運作時顯示資訊或選項。 例如,文字處理應用程式通常會使用具有文字搜尋選項的對話方塊。 當應用程式搜尋文字時,對話框會保留在畫面上。 然後,使用者可以返回對話框,然後再次搜尋相同的單字;或使用者可以變更對話框中的專案,並搜尋新字。 以這種方式使用對話框的應用程式通常會在使用者按兩下功能表項時建立對話框,只要應用程式執行或使用者明確關閉對話方塊,就會繼續顯示它。

若要支援應用程式使用對話框的不同方式,有兩種類型的對話框:模式和非模式。 模式對話框 需要使用者提供資訊或取消對話框,才能讓應用程式繼續。 應用程式會使用模態對話框,搭配需要額外資訊的功能表項,才能繼續進行。 無模式對話方塊 可讓使用者輸入資訊並在不關閉對話方塊的情況下返回到先前的工作。 模式對話方塊比無模式對話方塊更容易管理,因為它們是由單一函式來建立、執行任務和終結。

若要建立模態或無模式對話框,應用程式必須提供一個對話框範本來描述對話框的樣式和內容,並且必須提供一個對話框程式來執行任務。 對話框範本 是對話方塊及其所包含的控件的二進位描述。 開發人員可以將此範本建立為要從應用程式可執行檔載入的資源,或在應用程式執行時於記憶體中建立。 對話框程式 是應用程式定義的回呼函式,系統會在系統輸入對話框或對話框的工作執行時呼叫。雖然對話框程序類似於視窗程式,但它沒有相同的責任。

應用程式通常會使用 DialogBoxCreateDialog 函式來建立對話方塊。 DialogBox 建立模態對話方塊; CreateDialog 建立非模態對話方塊。 這兩個函式會從應用程式的可執行檔載入對話框範本,並建立符合範本規格的彈出視窗。 還有其他函式會使用記憶體中的範本來建立對話框;它們會在建立對話框時,將其他資訊傳遞至對話框程式。

對話框通常屬於預先定義的獨佔窗口類別。 系統會針對模態和非模態對話框使用此視窗類別及其對應的視窗程序。 呼叫 函式時,它會建立對話框的視窗,以及對話框中控件的視窗,然後將選取的訊息傳送至對話框程式。 當對話框可見時,預先定義的視窗程式會管理所有訊息、處理某些訊息,並將其他訊息傳遞至對話框程式,讓程式可以執行工作。 應用程式無法直接存取預先定義的視窗類別或視窗程式,但可以使用對話框範本和對話框程式來修改對話框的樣式和行為。

對話框擁有者視窗

大部分對話框都有擁有者視窗(或更簡單地說是擁有者)。 建立對話框時,應用程式會藉由指定擁有者的視窗句柄來設定擁有者。 系統會使用擁有者來判斷對話框在 Z 順序中的位置,讓對話框一律位於其擁有者上方。 此外,系統可以將訊息傳送至擁有者的視窗程式,並在對話框中通知事件。

每當其擁有者被隱藏或摧毀時,系統會自動隱藏或摧毀對話框。 這表示對話框程式不需要特殊處理,即可偵測擁有者視窗狀態的變更。

由於一般對話框會與功能表項搭配使用,因此擁有者視窗通常是包含功能表的視窗。 雖然可以建立沒有擁有者的對話框,但不建議這麼做。 例如,當強制回應對話框沒有擁有者時,系統不會停用任何應用程式的其他視窗,並允許用戶繼續在其他視窗中執行工作,從而破壞強制回應對話框的目的。

當無模式對話框沒有擁有者時,當應用程式中的其他視窗被隱藏或關閉時,系統不會隱藏也不會關閉對話框。 雖然這不會破壞無模式對話框的目的,但它要求應用程式執行特殊處理,以確保對話框在適當時間隱藏和銷毀。

消息框

消息框是一個特殊的對話框,應用程式可用來顯示訊息,並提示輸入簡單的輸入。 消息框通常包含簡訊和一或多個按鈕。 應用程式會使用 MessageBoxMessageBoxEx 函式來建立消息框,並指定要顯示的文字和按鈕數目和類型。 請注意,目前 MessageBoxMessageBoxEx 運作方式沒有任何差異。

雖然消息框是對話框,但系統會完全控制消息框的建立和管理。 這表示應用程式不提供對話框範本和對話框程式。 系統會根據消息框指定的文字和按鈕,建立自己的範本,並提供自己的對話框程式。

訊息框是模態對話框,系統會使用與 DialogBox 相同的內部函式來建立它。 如果應用程式在呼叫 MessageBoxMessageBoxEx時指定擁有者視窗,則系統會停用擁有者視窗。 應用程式也可以指示系統在建立對話框時指定 MB_TASKMODAL 值,以停用屬於目前線程的所有最上層視窗。

系統可以將訊息傳送給擁有者,例如 WM_CANCELMODEWM_ENABLE,就像建立強制回應對話框時一樣。 擁有者視窗應該執行這些訊息所要求的任何動作。

模態對話框應該是具有視窗功能表、標題列和粗框線的彈出視窗;也就是說,對話框範本應該指定 WS_POPUPWS_SYSMENUWS_CAPTIONDS_MODALFRAME 樣式。 雖然應用程式可以指定 WS_VISIBLE 樣式,但不論對話框範本是否指定 WS_VISIBLE 樣式,系統一律會顯示強制回應對話方塊。 應用程式不得建立具有 WS_CHILD 樣式的強制回應對話框。 具有此樣式的模態對話框會使自身不可用,以防止任何後續輸入到達應用程式。

應用程式會使用 DialogBoxDialogBoxIndirect 函式來建立模態對話框。 DialogBox 需要一個包含對話框範本的資源名稱或識別符;DialogBoxIndirect 需要一個包含對話框範本的記憶體物件的句柄。 DialogBoxParamDialogBoxIndirectParam 函式也會建立強制回應對話框;它們與先前提及的函式相同,但在建立對話框時,會將指定的參數傳遞至對話框程式。

當建立模態對話框時,系統會讓它成為活動視窗。 對話框會保持作用中,直到對話框程式呼叫 EndDialog 函式,或系統在另一個應用程式中啟動窗口為止。 使用者和應用程式都無法讓擁有者窗口處於作用中狀態,直到強制回應對話框終結為止。

當擁有者視窗尚未停用時,系統會在建立強制回應對話框時,自動停用視窗及其所屬的任何子視窗。 在對話框終結之前,擁有者視窗會保持停用狀態。 雖然對話框程序可以隨時啟用擁有者視窗,但這樣會失去模式對話框的意義,不建議這麼做。 當對話框程序被銷毀時,系統會再次啟用擁有者視窗,但前提是模態對話框導致擁有者被禁用。

當系統建立模態對話框時,它會將 WM_CANCELMODE 訊息傳送至目前正在接收滑鼠輸入的視窗(如果有的話)。 接收此訊息的應用程式應該釋放滑鼠擷取,讓使用者可以在強制回應對話框中移動滑鼠。 因為系統停用擁有者視窗,因此如果擁有者在收到此訊息時無法釋放滑鼠,則所有滑鼠輸入都會遺失。

若要處理強制回應對話框的訊息,系統會啟動自己的訊息迴圈,並暫時控制整個應用程式的消息佇列。 當系統擷取未明確用於對話框的訊息時,它會將訊息分派至適當的視窗。 如果擷取 WM_QUIT 訊息,它會將訊息張貼回應用程式消息佇列,讓應用程式的主要訊息循環最終可以擷取訊息。

每當應用程式消息佇列空白時,系統會將 WM_ENTERIDLE 訊息傳送至擁有者視窗。 當對話框保留在畫面上時,應用程式可以使用此訊息來執行背景工作。 當應用程式以這種方式使用訊息時,應用程式必須經常讓出控制權(例如,使用 PeekMessage 函式),以便模態對話方塊可以接收任何使用者輸入。 若要防止模態對話方塊傳送 WM_ENTERIDLE 訊息,應用程式可以在建立對話框時指定 DS_NOIDLEMSG 樣式。

應用程式會使用 EndDialog 函式來關閉模態對話框。 在大部分情況下,當使用者從對話框的視窗功能表單擊 [關閉],或在對話方塊中按下 [確定] 或 [取消] 按鈕時,對話框過程會呼叫 EndDialog。 對話框可以透過 DialogBox 函式(或其他建立函式)傳回值,方法是在呼叫 EndDialog 函式時指定值。 系統會在終結對話框之後傳回此值。 大部分的應用程式都會使用此傳回值來判斷對話方塊是否已順利完成其工作,或是由使用者取消。 系統不會從建立對話框的函式傳回控件,直到對話框程式呼叫 EndDialog 函式為止。

無模式對話框

無模式對話框應該是具備視窗選單、標題列和細邊框的彈出視窗;也就是說,對話框範本應該指定 WS_POPUPWS_CAPTIONWS_BORDERWS_SYSMENU 樣式。 除非範本指定 WS_VISIBLE 樣式,否則系統不會自動顯示對話方塊。

應用程式會使用 CreateDialogCreateDialogIndirect 函式來建立無模式對話框。 CreateDialog 需要包含對話框範本之資源的名稱或標識符;CreateDialogIndirect 需要包含對話框範本的記憶體物件句柄。 另外兩個函式,CreateDialogParamCreateDialogIndirectParam,也會建立無模式對話框;它們會在建立對話框時,將指定的參數傳遞至對話框程式。

CreateDialog 和其他建立函式會將視窗句柄傳回對話方塊。 應用程式和對話框程式可以使用這個句柄來管理對話框。 例如,如果未在對話框範本中指定 WS_VISIBLE,應用程式可以將視窗句柄傳遞至 ShowWindow 函式,以顯示對話方塊。

無模式對話框不會停用擁有者視窗,也不會傳送訊息給它。 建立對話框時,系統會將其設定為使用中視窗,但使用者或應用程式可以隨時變更活動視窗。 如果對話框變成非使用中狀態,即使擁有者窗口處於使用中狀態,仍會維持在 Z 順序的擁有者視窗上方。

應用程式負責擷取和分派輸入訊息至對話方塊。 大部分的應用程式都會為此使用主要訊息迴圈。 不過,若要允許使用者使用鍵盤移至並選取控件,應用程式必須呼叫 IsDialogMessage 函式。 如需此函式的詳細資訊,請參閱 對話框鍵盤介面

非模態對話框無法像模態對話框那樣將值傳回給應用程式,但對話框程序可以使用 SendMessage 函式,將資訊傳送至擁有視窗。

應用程式必須在終止之前終結所有無模式對話框。 它可以使用 DestroyWindow 函式來終結無模式對話方塊。 在大部分情況下,對話框過程會呼叫 DestroyWindow,以回應使用者輸入,例如按 取消 按鈕。 如果使用者從未以這種方式關閉對話框,應用程式必須呼叫 DestroyWindow

DestroyWindow 使視窗句柄失效,因此任何後續呼叫使用句柄的函式都會傳回錯誤值。 為了避免錯誤,對話框程序應該通知擁有者對話框已被銷毀。 許多應用程式都會維護包含對話框句柄的全域變數。 當對話框程式終結對話框時,它也會將全域變數設定為 NULL,表示對話方塊不再有效。

對話框程式不得呼叫 EndDialog 函式來終結無模式對話方塊。

對話框範本

對話框範本是二進位數據,描述對話框、定義其高度、寬度、樣式,以及其所包含的控件。 若要建立對話框,系統會從應用程式可執行檔中的資源載入對話框範本,或使用應用程式在全域記憶體中傳遞的範本。 不論是哪一種情況,應用程式都必須在建立對話框時提供範本。

開發人員會使用資源編譯程式或對話框編輯器來建立範本資源。 資源編譯程式會將文字描述轉換成二進位資源,而對話框編輯器會將互動式建構的對話框儲存為二進位資源。

注意

如何建立範本資源並將其新增至應用程式的可執行文件的說明已超出此概觀的範圍。 如需建立範本資源並將其新增至可執行檔的詳細資訊,請參閱應用程式開發工具所提供的檔。

 

若要建立對話框而不使用範本資源,您必須在記憶體中建立範本,並將它傳遞至 CreateDialogIndirectParamDialogBoxIndirectParam 函式,或 CreateDialogIndirectDialogBoxIndirect 巨集。

記憶體中的對話框範本是由描述對話框的標頭所組成,後面接著一或多個描述對話框中每個控件的其他數據區塊。 範本可以使用標準格式或擴充格式。 在標準範本中,標頭是 DLGTEMPLATE 結構,後面接著額外的可變長度陣列;和每個控件的數據是由 DLGITEMTEMPLATE 結構所組成,後面接著額外的可變長度數位。 在擴充的對話框範本中,標頭會使用 DLGTEMPLATEEX 格式,而控件定義則使用 DLGITEMTEMPLATEEX 格式。

您可以藉由配置全域記憶體物件,並填入標準或擴充標頭和控制定義來建立記憶體範本。 記憶體範本的格式和內容與範本資源相同。 許多使用記憶體範本的應用程式會先使用 LoadResource 函式,將範本資源載入記憶體中,然後修改載入的資源以建立新的記憶體範本。 如需在記憶體中建立對話框範本的詳細資訊,請參閱記憶體中的 範本

下列各節說明對話框範本中使用的樣式、度量和其他值。

對話框範本樣式

每個對話框範本都會指定樣式值的組合,以定義對話框的外觀和功能。 樣式值可以是視窗樣式,例如 WS_POPUPWS_SYSMENU,以及對話框樣式,例如 DS_MODALFRAME。 範本的樣式數目和類型取決於對話框的類型和用途。 如需值清單,請參閱 對話框樣式

系統會在建立對話框時,將範本中指定的所有視窗樣式傳遞至 CreateWindowEx 函式。 系統可能會根據指定的對話框樣式傳遞一或多個擴充樣式。 例如,當範本指定 DS_MODALFRAME時,系統會在建立對話框時使用 WS_EX_DLGMODALFRAME

大部分的對話框都是具有視窗功能表和標題列的彈出視窗。 因此,一般範本會指定 WS_POPUPWS_SYSMENUWS_CAPTION 樣式。 範本也會指定框線樣式:無模式對話框的 WS_BORDER,以及模式對話框的 DS_MODALFRAME。 當範本建立自定義視窗而非對話框時,可以指定除了快顯視窗外的其他視窗類型(例如 WS_OVERLAPPED)。

不論是否已指定 WS_VISIBLE 樣式,系統一律會顯示模態對話框。 當無模式對話框的範本指定 WS_VISIBLE 樣式時,系統會在建立時自動顯示對話方塊。 否則,應用程式會負責使用 ShowWindow 函式來顯示對話方塊。

對話框度量

每個對話框範本都包含度量,指定對話框的位置、寬度和高度,以及它所包含的控制件。 這些度量與裝置無關,因此應用程式可以使用單一範本來為所有類型的顯示裝置建立相同的對話方塊。 這可確保對話框在所有螢幕上都有相同的比例和外觀,儘管螢幕之間的解析度和外觀比例不同。

對話框範本中的量值是在對話框範本單位中指定。 若要將度量單位從對話框範本單位轉換成螢幕單位(圖元),請使用 mapDialogRect函式,它會考慮對話框所使用的字型,並將矩形從對話框範本單位正確轉換成圖元。 對於使用系統字型的對話框,您可以使用 GetDialogBaseUnits 函數自行執行轉換計算,不過使用 MapDialogRect 會比較簡單。

範本必須指定對話框左上角的初始座標。 座標通常相對於擁有者視窗工作區的左上角。 當範本指定DS_ABSALIGN樣式或對話框沒有擁有者時,位置會相對於畫面左上角。 系統會在建立對話框時設定這個初始位置,但允許應用程式在顯示對話方塊之前調整位置。 例如,應用程式可以擷取擁有者視窗的維度、計算在擁有者視窗中置中對話方塊的新位置,然後使用 SetWindowPos 函式來設定位置。

範本應該指定對話框寬度和高度,且不會超過畫面的寬度和高度,並確保所有控制件都在對話框的工作區內。 雖然系統允許對話框是任何大小,但建立太小或太大的對話框可能會防止使用者提供輸入,而使對話框的用途失敗。 當有許多控制件時,許多應用程式會使用多個對話框。 在這種情況下,初始對話方塊通常包含一或多個按鈕,使用者可以選擇顯示下一個對話方塊。

對話框控制件

範本會指定對話框中每個控件的位置、寬度、高度、樣式、標識元和窗口類別。 系統會將此數據傳遞至 createWindowEx函式,以建立每個控件。 控件會按照範本中指定的順序來建立。 範本應該指定適當的控件數目、類型和順序,以確保使用者可以輸入完成與對話框相關聯的工作所需的輸入。

對於每個控件,範本會指定定義控件外觀和作業的樣式值。 每個控制項都是子視窗,因此必須具有 WS_CHILD 樣式。 若要確保顯示對話框時,控件是可見的,每個控件也必須具有 WS_VISIBLE 樣式。 其他常用的視窗樣式包括:對於具有選擇性框線的控件,使用 WS_BORDER;對於在初始建立對話框時應停用的控件,使用 WS_DISABLED;以及對於可以使用鍵盤存取的控件,使用 WS_TABSTOPWS_GROUPWS_TABSTOPWS_GROUP 樣式會與本主題稍後所述的對話框鍵盤介面搭配使用。

範本也可以指定控件窗口類別特有的控件樣式。 例如,指定按鈕控制項的樣本必須提供按鈕控制樣式,例如 BS_PUSHBUTTONBS_CHECKBOX。 系統會透過 WM_CREATE 訊息將控件樣式傳遞至控件視窗程式,讓程式能夠調整控件的外觀和作業。

系統會先將位置座標和寬度和高度度量從對話框基底單位轉換成圖元,再將這些值傳遞 至 createWindowEx。 當系統建立控制項時,它會將對話框指定為父視窗。 這表示系統一律會將控件的位置座標解譯為客戶端座標,參照對話框客戶區域的左上角。

範本會指定每個控制件的視窗類別。 一般對話框包含屬於預先定義控件窗口類別的控件,例如按鈕和編輯控件窗口類別。 在此情況下,範本會提供類別的對應預先定義 Atom 值,以指定視窗類別。 當對話框包含屬於自定義控件窗口類別的控件時,範本會提供該已註冊視窗類別的名稱或目前與名稱相關聯的 Atom 值。

對話框中的每個控件都必須有唯一標識符,才能與其他控件區別。 控件會透過 WM_COMMAND 訊息將資訊傳送至對話框程式,因此控件標識元對於程式而言是判斷傳送指定訊息之控件的必要條件。 此規則的唯一例外是靜態控件的控件識別碼。 靜態控件不需要唯一標識符,因為它們不會傳送任何 WM_COMMAND 訊息。

若要允許使用者關閉對話框,樣本應該至少指定一個按鈕,並將控件識別碼 IDCANCEL。 若要允許使用者選擇完成或取消與對話方塊相關聯的工作,範本應該分別指定兩個按鈕,標籤為 [確定][取消],並分別指定控制標識符 IDOKIDCANCEL

範本也會指定控件的可選文字和創建資料。 文字通常會提供按鈕控件的標籤,或指定靜態文字控件的初始內容。 建立數據是系統在建立控制項時傳遞給控件視窗程式的一或多個字節數據。 生成數據對於需要其初始內容或樣式詳細資訊的控件來說,比其他數據提供更有用的信息。 例如,應用程式可以使用建立數據來設定滾動條控件的初始設定和範圍。

對話框視窗選單

當範本指定 WS_SYSMENU 樣式時,系統會提供對話框視窗選單。 為防止不適當的輸入,系統會自動停用功能表中的所有項目,除了 移動關閉以外。 用戶可以按下 移動 來移動對話方塊。 當使用者按兩下 [關閉 ]時,系統會將 WM_COMMAND 訊息傳送至對話框 程式,並將 wParam 參數設定為 IDCANCEL。 這與使用者點擊 取消 按鈕時所傳送的訊息相同。 此訊息的建議動作是關閉對話框並取消要求的工作。

雖然不建議使用對話框中的其他功能表,但對話框範本可以藉由提供功能表資源的標識碼或名稱來指定功能表。 在此情況下,系統會載入資源,並建立對話框的功能表。 使用範本來建立自定義視窗,而不是對話框時,應用程式通常會在範本中使用功能表標識碼或名稱。

對話框字型

系統會使用對話框字型的平均字元寬度來計算對話框的位置和維度。 根據預設,系統會使用 SYSTEM_FONT 字型,在對話框中繪製所有文字。

若要指定預設以外的對話框字型,您必須使用對話框範本建立對話方塊。 在樣本資源中,使用 FONT 語句。 在對話框範本中,設定 DS_SETFONTDS_SHELLFONT 樣式,並指定點大小和字樣名稱。 即使對話框範本以這種方式指定字型,系統一律會針對對話框標題和對話框功能表使用系統字型。

當對話框具有 DS_SETFONTDS_SHELLFONT 樣式時,系統會將 WM_SETFONT 訊息傳送至對話框程式,並在控件建立控件時傳送給每個控件。 對話方塊程序負責儲存通過 WM_SETFONT 訊息傳遞的字型句柄,並在將文字寫入視窗時將句柄選入顯示設備上下文中。 預先定義的控制項預設會執行此動作。

系統字型可能會因不同版本的 Windows 而有所不同。 若要讓應用程式使用系統字型,無論其執行所在的系統為何,請使用 DS_SHELLFONT 搭配字樣 MS Shell Dlg,並使用 DIALOGEX 資源,而不是使用 DIALOG Resource。 系統會對應此字樣,讓對話框使用Tahoma字型。 請注意,如果字樣不是 MS Shell Dlg,DS_SHELLFONT 就沒有作用。

記憶體中的範本

記憶體中的對話框範本是由描述對話框的標頭所組成,後面接著一或多個描述對話框中每個控件的其他數據區塊。 範本可以使用標準格式或擴充格式。 在標準範本中,標頭是 DLGTEMPLATE 結構,後面接著額外的可變長度陣列。 每個控件的數據是由 DLGITEMTEMPLATE 結構所組成,後面接著額外的可變長度數組。 在擴充的對話框範本中,標頭會使用 DLGTEMPLATEEX 格式,而控件定義則使用 DLGITEMTEMPLATEEX 格式。

若要區分標準範本和擴充範本,請檢查對話框範本的前 16 位。 在延伸範本中,第一個 WORD 是0xFFFF;任何其他值表示標準範本。

如果您在記憶體中建立對話框範本,您必須確定每個 DLGITEMTEMPLATEDLGITEMTEMPLATEEX 控件定義都對齊 DWORD 界限。 此外,在控件定義之後的任何建立數據都必須對齊 DWORD 界限。 對話框範本中所有其他可變長度數組都必須對齊 WORD 邊界。

範本標頭

在對話框的標準和擴充範本中,標頭包含下列一般資訊:

  • 對話框的位置和維度
  • 對話框的視窗和對話框樣式
  • 對話框中的控件數目。 這個值會決定範本中 DLGITEMTEMPLATEDLGITEMTEMPLATEEX 控件定義的數目。
  • 對話框的可選菜單資源。 範本可以指出對話框沒有功能表,也可以指定序數值或 Null 終止的 Unicode 字串,以識別可執行檔中的功能表資源。
  • 對話框的窗口類別。 這可以是預先定義的對話框類別,或是識別已註冊視窗類別的序數值或 Null 終止的 Unicode 字串。
  • 以 Null 結束的 Unicode 字串,指定對話框視窗的標題。 如果字串是空的,對話框的標題列是空白的。 如果對話框沒有 WS_CAPTION 樣式,系統會將標題設定為指定的字串,但不會顯示它。
  • 如果對話方塊具有 DS_SETFONT 樣式,標頭會指定用於對話方塊客戶區和控制元件中文字的字型大小與字型名稱。

在擴充範本中,DLGTEMPLATEEX 標頭也會指定下列其他資訊:

  • 當系統傳送 WM_HELP 訊息時,對話框視窗的說明內容識別符。
  • 如果對話框具有 DS_SETFONTDS_SHELLFONT 樣式,標頭會指定字型粗細,並指出字型是否為斜體。

控制件定義

樣板標頭之後是用來描述對話框控制項的一個或多個控制項定義。 在標準和擴充範本中,對話框標頭有一個成員,指出範本中的控件定義數目。 在標準範本中,每個控件定義都包含一個 DLGITEMTEMPLATE 結構,後面接著額外的可變長度陣列。 在擴充範本中,控件定義會使用 DLGITEMTEMPLATEEX 格式。

在標準和擴充範本中,控制項定義包含下列資訊:

  • 控件的位置和維度。
  • 控制件的視窗和控制件樣式。
  • 控件識別碼。
  • 控件的窗口類別。 這可以是預先定義系統類別的序數值,或是指定已註冊視窗類別名稱的 Null 終止 Unicode 字串。
  • 以 Null 結束的 Unicode 字串,指定控件的初始文字,或識別可執行檔中圖示等資源的序數位值。
  • 創建資料的可選可變長度區塊。 當系統建立控制項時,它會在發送至控制項的 WM_CREATE 訊息的 lParam 參數中,傳遞指針至這個數據。

在擴充範本中,當系統傳送 WM_HELP 訊息時,控件定義也會指定控件的說明內容標識符。