關於對話方塊

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

此概觀包含下列主題:

如需通用對話方塊的詳細資訊,請參閱 通用對話方塊程式庫

使用對話方塊的時機

大部分的應用程式會使用對話方塊來提示需要使用者輸入之功能表項目的其他資訊。 使用對話方塊是應用程式擷取輸入的唯一建議方式。 例如,一般的 [開啟 ] 功能表項目需要開啟的檔案名,因此應用程式應該使用對話方塊提示使用者輸入名稱。 在這種情況下,當使用者按一下功能表項目,並在使用者提供資訊之後立即終結對話方塊時,應用程式會建立對話方塊。

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

若要支援應用程式使用對話方塊的不同方式,有兩種類型的對話方塊:強制回應和無模式。 強制回應對話方塊需要使用者提供資訊或取消對話方塊,才能允許應用程式繼續。 應用程式會使用強制回應對話方塊搭配需要其他資訊的功能表項目,才能繼續進行。 無強制回應對話方塊可讓使用者提供資訊並返回上一個工作,而不需關閉對話方塊。 強制回應對話方塊比無強制回應對話方塊更容易管理,因為它們是建立、執行其工作,並藉由呼叫單一函式來終結。

若要建立強制回應或無強制回應對話方塊,應用程式必須提供對話方塊範本來描述對話方塊樣式和內容;應用程式也必須提供對話方塊程式來執行工作。 對話方塊範本是對話方塊及其包含之控制項的二進位描述。 開發人員可以將此範本建立為要從應用程式的可執行檔載入的資源,或在應用程式執行時于記憶體中建立。 對話方塊程式是應用程式定義的回呼函式,當系統有對話方塊的輸入或對話方塊要執行的工作時,系統會呼叫該函式。雖然對話方塊程式與視窗程式類似,但其責任不相同。

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

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

對話方塊擁有者視窗

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

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

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

當無強制回應對話方塊沒有擁有者時,當應用程式中的其他視窗隱藏或終結時,系統都不會隱藏或終結對話方塊。 雖然這不會破壞無強制回應對話方塊的目的,但需要應用程式執行特殊處理,以確保對話方塊在適當時間隱藏和終結。

訊息方塊

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

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

訊息方塊是強制回應對話方塊,而系統會使用 DialogBox 所使用的相同內部函式來建立該對話方塊。 如果應用程式在呼叫MessageBox 或 MessageBoxEx時指定擁有者視窗,系統就會停用擁有者。 應用程式也可以指示系統在建立對話方塊時指定 MB_TASKMODAL 值,以停用屬於目前線程的所有最上層視窗。

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

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

應用程式會使用 DialogBox 或DialogBoxIndirect函式來建立強制回應對話方塊。 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 樣式,否則系統不會自動顯示對話方塊。

應用程式會使用CreateDialog 或 CreateDialogIndirect函式建立無強制回應對話方塊。 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_BORDERWS_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_SETFONT或DS_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;任何其他值表示標準範本。

如果您在記憶體中建立對話方塊範本,您必須確定每個DLGITEMTEMPLATE 或 DLGITEMTEMPLATEEX控制項定義都對齊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 訊息時,控制項定義也會指定控制項的說明內容識別碼。