對話框程式設計考慮
本概觀討論有關對話框的一些程式設計考慮。
概觀包含下列主題。
對話框流程
對話框程式類似於視窗程式,當系統有要提供或執行工作的資訊時,會將訊息傳送至程式。不同於視窗程式,對話框程序永遠不會呼叫 DefWindowProc 函式。 相反地,如果處理了訊息,則傳回 TRUE;如果未處理訊息,則傳回 FALSE。
每個對話框程式都有下列格式:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// Place message cases here.
default:
return FALSE;
}
}
程序參數的作用與在視窗程式中相同,hwndDlg 參數接收對話框的視窗句柄。
大部分的對話框程式都會處理控件所傳送的 WM_INITDIALOG 訊息和 WM_COMMAND 訊息,但若有任何其他訊息,則處理很少。 如果對話框程式未處理訊息,它必須傳回 FALSE,以指示系統在內部處理訊息。 此規則的唯一例外是 WM_INITDIALOG 訊息。 對話框程序必須傳回 TRUE,以指示系統進一步處理 WM_INITDIALOG 訊息。 在任何情況下,程式都不得呼叫 DefWindowProc。
WM_INITDIALOG訊息
系統不會將 WM_CREATE 訊息傳送至對話框程式。 相反地,它會在建立對話方塊及其所有控件之後,但在顯示對話方塊之前,傳送 WM_INITDIALOG 訊息。 此程式應該執行任何必要的初始化,以確保對話框會顯示與工作相關聯的目前設定。 例如,當對話框包含顯示目前磁碟驅動器和目錄的控件時,程式必須判斷目前的磁碟驅動器和目錄,並將控件設定為該值。
此程式可以使用 SetDlgItemText 和 checkDlgButton 等函式來初始化控件。 因為控制元件是視窗,因此程序可以使用視窗管理功能來操作它們,例如 EnableWindow 和 SetFocus。 程式可以使用 GetDlgItem 函式來擷取控制項的視窗句柄。
對話框程式可以視需要變更任何控件的內容、狀態和位置。 例如,在包含檔名清單框和 [開啟] 按鈕的對話框中,程式可以停用 [開啟] 按鈕,直到使用者從清單中選取檔案為止。 在此範例中,對話框範本會指定 Open 按鈕的 WS_DISABLED 樣式,而系統會在建立時自動停用按鈕。 當對話框程式從清單方塊收到通知訊息,指出使用者已選取檔案時,程式會呼叫 EnableWindow 函式來啟用 [開啟 ] 按鈕。
若要在對話框的標題列上顯示自定義圖示,您的 WM_INITDIALOG 處理程式可以將 WM_SETICON 訊息傳送至對話方塊。
如果應用程式使用 DialogBoxParam、DialogBoxIndirectParam、CreateDialogParam或 CreateDialogIndirectParam的其中一個函式來建立對話框,則 WM_INITDIALOG 訊息的 lParam 參數包含傳遞至函式的額外參數。 應用程式通常會使用這個額外的參數,將指標傳遞至對話框程式的其他初始化資訊,但對話框程式必須判斷參數的意義。 如果應用程式使用另一個函式來建立對話框,系統會將 lParam 參數設定為 NULL。
從 WM_INITDIALOG 訊息傳回之前,程式應該判斷它是否應該將輸入焦點設定為指定的控件。 如果對話框程式傳回 TRUE,系統會自動將輸入焦點設定為視窗句柄位於 wParam 參數中的控件。 如果接收預設焦點的控件不合適,則可以使用 setFocus 函式,將焦點設定為適當的控件。 如果程式設定輸入焦點,它必須傳回 FALSE 以防止系統設定預設焦點。 接收預設輸入焦點的控件一律是範本中指定的第一個控件,該控件為可見、未停用,且具有 WS_TABSTOP 樣式。 如果不存在這類控件,系統會將預設輸入焦點設定為範本中的第一個控件。
WM_COMMAND訊息
當使用者在控件中執行動作時,控制項可以將 WM_COMMAND 訊息傳送至對話框程式。 這些訊息稱為通知訊息,會通知使用者輸入的程式,並允許它執行適當的回應。
除了靜態控件之外,所有預先定義的控件都會傳送所選使用者動作的通知訊息。 例如,每當使用者按鍵時,按鈕就會傳送 BN_CLICKED 通知訊息。 在所有情況下,wParam 參數的低序字包含控件標識碼、wParam 的高階字包含通知碼,而 lParam 參數 包含控件視窗句柄。
對話框程式應該監視和處理通知訊息。 特別是,程式必須處理具有IDOK或IDCANCEL標識碼的訊息;這些訊息代表使用者關閉對話框的要求。 此程式應該使用模態對話框的 EndDialog 函式,以及非模態對話框的 DestroyWindow 函式來關閉對話框。
如果對話框具有功能表,例如 視窗 功能表,而且使用者按單擊功能表項,系統也會將 WM_COMMAND 訊息傳送至對話框程式。 特別是,每當使用者在對話框視窗功能表中 按兩下 [關閉],系統就會傳送 wParam 參數設定為 IDCANCEL 的 WM_COMMAND 訊息。 訊息與 [取消] 按鈕所傳送的通知訊息幾乎完全相同,而且應該以完全相同的方式處理。
WM_PARENTNOTIFY訊息
每當使用者指向控件時按下滑鼠按鈕時,控件就會傳送 WM_PARENTNOTIFY 訊息。 某些應用程式會將此訊息解譯為訊號,以執行與控件相關的動作,例如顯示描述控件用途的文字行。
當系統建立及終結視窗時,系統也會傳送 WM_PARENTNOTIFY 訊息,但不會傳送從對話框範本建立的控件。 當建立控制項時,系統會指定 WS_EX_NOPARENTNOTIFY 樣式來防止這些訊息。 除非應用程式為對話框建立自己的控件,否則無法覆寫此預設設定。
Control-Color 訊息
當控件和系統想要對話框程式使用特定筆刷和色彩來繪製控件或其他視窗的背景時,控件和系統就可以傳送控件色彩訊息。 當應用程式覆寫對話方塊及其控件中使用的預設色彩時,這非常有用。 以下是已取代 WM_CTLCOLOR 訊息的控件色彩訊息。
- WM_CTLCOLORBTN
- WM_CTLCOLORDLG
- WM_CTLCOLOREDIT
- WM_CTLCOLORLISTBOX
- WM_CTLCOLORSCROLLBAR
- WM_CTLCOLORSTATIC
控制件會在繪製自己的背景之前,將控制項色彩訊息傳送至對話框程式。 訊息可讓程式指定要使用的筆刷,以及設定背景和前景色彩。 此程序透過傳回筆刷句柄來指定筆刷。 若要設定背景和前景色彩,程式會使用控制項的顯示設備上下文中的 SetBkColor 和 SetTextColor 函式。 控件色彩訊息會將句柄傳遞至訊息的 wParam 參數中的程式。
如果程式未處理 WM_ERASEBKGND 訊息,系統會將 WM_CTLCOLORDLG 訊息傳送至對話框程式。 預先定義的對話框類別沒有類別背景筆刷,因此此訊息可讓程式定義自己的背景,而不需要包含程式代碼來執行工作。
在任何情況下,當對話框程式未處理控件色彩訊息時,系統會使用具有預設視窗色彩的筆刷來繪製所有控件和視窗的背景,但滾動條除外。 應用程式可以將 COLOR_WINDOW 值傳遞 至 getSysColor 函式,以擷取預設視窗色彩。 繪製背景時,顯示裝置內容的前景色彩會設定為預設文字色彩(COLOR_WINDOWTEXT)。 對於滾動條,系統會使用具有默認滾動條色彩的筆刷(COLOR_SCROLLBAR)。 在此情況下,顯示裝置內容的背景和前景色彩分別設定為白色和黑色。
對話框預設訊息處理
預先定義對話框類別的視窗程式會針對對話框程式未處理的所有訊息執行預設處理。 當對話框程式傳回任何訊息 FALSE 時,預先定義的視窗程式會檢查訊息並執行下列預設動作:
消息 | 默認動作 |
---|---|
DM_GETDEFID | 您可以將此訊息傳送至對話框。 如果對話框有一個,對話框會傳回默認按鈕的控制標識符;否則,它會傳回零。 |
DM_REPOSITION | 您可以將此訊息傳送至最上層對話框。 對話框會重新定位本身,使其符合桌面區域。 |
DM_SETDEFID | 您可以將此訊息傳送至對話框。 對話框會將預設的按鈕設定為 wParam 參數中控件識別碼所指定的控制項。 |
WM_ACTIVATE | 如果啟動對話框,請將輸入焦點還原至先前儲存的句柄所識別的控件。 否則,程式會將句柄儲存至具有輸入焦點的控件。 |
WM_CHARTOITEM | 傳回零。 |
WM_CLOSE | 將 BN_CLICKED 通知訊息張貼至對話框,並將 IDCANCEL 指定為控件識別碼。 如果對話框具有 IDCANCEL 控件識別符,且控件目前已停用,則程式會發出警告,且不會張貼訊息。 |
WM_COMPAREITEM | 傳回零。 |
WM_ERASEBKGND | 使用從 WM_CTLCOLORDLG 訊息傳回的筆刷或預設視窗色彩填滿對話框工作區。 |
WM_GETFONT | 傳回應用程式定義對話框字型的控制代碼。 |
WM_INITDIALOG | 傳回零。 |
WM_LBUTTONDOWN | 將 CB_SHOWDROPDOWN 訊息傳送至具有輸入焦點的下拉式方塊,並指示控件隱藏其下拉式清單框。 此程式會呼叫 DefWindowProc 來完成默認動作。 |
WM_NCDESTROY | 釋放配置給對話框中編輯控件的全域記憶體(適用於指定 DS_LOCALEDIT 樣式的對話框),並釋放任何應用程式定義的字型(適用於指定 DS_SETFONT 或 DS_SHELLFONT 樣式的對話框)。 此程式會呼叫 DefWindowProc 函式來完成預設動作。 |
WM_NCLBUTTONDOWN | 將 CB_SHOWDROPDOWN 訊息傳送至具有輸入焦點的組合框,指示控件隱藏其下拉列表框。 此程式會呼叫 DefWindowProc 來完成默認動作。 |
WM_NEXTDLGCTL | 將輸入焦點設定為對話框中的下一個或上一個控件、wParam 參數中句柄所識別的控件,或設定為對話框中第一個可見、未停用且具有 WS_TABSTOP 樣式的控件。 如果具有輸入焦點的目前視窗不是控件,則程式會忽略此訊息。 |
WM_SETFOCUS | 將輸入焦點設定為先前儲存的控件視窗句柄所識別的控件。 如果不存在這類句柄,程式會將輸入焦點設定為對話框範本中可見、未停用且具有 WS_TABSTOP 樣式的第一個控件。 如果不存在這類控件,程式會將輸入焦點設定為範本中的第一個控件。 |
WM_SHOWWINDOW | 如果隱藏對話框,請將句柄儲存至具有輸入焦點的控件,然後呼叫 DefWindowProc 來完成預設動作。 |
WM_SYSCOMMAND | 如果對話框最小化,請將句柄儲存至具有輸入焦點的控件,然後呼叫 DefWindowProc 來完成預設動作。 |
WM_VKEYTOITEM | 傳回零。 |
預先定義的視窗程式會將所有其他訊息傳遞給 DefWindowProc 以進行默認處理。
對話框鍵盤介面
系統提供對話方塊用的特殊鍵盤介面,針對數個特定按鍵進行特殊處理。 介面會產生對應至對話框中特定按鈕的訊息,或將輸入焦點從某個控件變更為另一個控件。 以下是此介面中使用的鍵及其對應的功能。
鑰匙 | 行動 |
---|---|
ALT+助記鍵 | 將輸入焦點移至包含指定助記鍵的靜態控件之後的第一個控件(具有 WS_TABSTOP 樣式)。 |
下 | 將輸入焦點移至群組中的下一個控制件。 |
進入 | 將 WM_COMMAND 訊息傳送至對話框程式。 wParam 參數 被設定為 IDOK 或是預設按鈕的控制識別碼。 |
ESC | 將 WM_COMMAND 訊息傳送至對話框程式。 wParam 參數設為 IDCANCEL。 |
左 | 將輸入焦點移至群組中的上一個控制件。 |
助記鍵 | 將輸入焦點移到具有 WS_TABSTOP 樣式的第一個控制項,此控制項位於包含指定助記鍵的靜態控制項之後。 |
右 | 將輸入焦點移至群組中的下一個控制件。 |
SHIFT+TAB | 將輸入焦點移至具有 WS_TABSTOP 樣式的上一個控件。 |
標籤 | 將輸入焦點移至具有 WS_TABSTOP 樣式的下一個控件。 |
向上 | 將輸入焦點移至群組中的上一個控制件。 |
系統會自動為所有強制回應對話框提供鍵盤介面。 除非應用程式呼叫 isDialogMessage 函式來篩選主要訊息迴圈中的訊息,否則不會提供無模式對話框的介面。 這表示應用程式必須在從消息佇列擷取訊息之後,立即將訊息傳遞至 IsDialogMessage。 函式會處理用於對話框的訊息,並傳回非零值,指出訊息已處理,且不得傳遞至 TranslateMessage 或 DispatchMessage 函式。
因為對話框鍵盤介面使用方向鍵在對話框中的控件間移動,所以應用程式無法使用這些按鍵來捲動任何模態對話框的內容,或是呼叫 IsDialogMessage 的任何非模態對話框。 當對話框具有滾動條時,應用程式必須提供滾動條的替代鍵盤介面。 請注意,當系統包含滑鼠時,可以使用捲動的滑鼠介面。
WS_TABSTOP樣式
WS_TABSTOP 樣式會指定使用者可以按下 TAB 鍵或 SHIFT+TAB 鍵來移動的控制件。
當使用者按下 TAB 或 SHIFT+TAB 時,系統會先判斷目前具有輸入焦點的控件是否處理這些按鍵。 它會傳送 WM_GETDLGCODE 訊息給控件,如果控件傳回 DLGC_WANTTAB,則系統會將按鍵傳遞給該控件。 否則,系統會使用 GetNextDlgTabItem 函式來找出下一個控件,該控件為可見、未停用,且具有 WS_TABSTOP 樣式。 搜尋會從目前具有輸入焦點的控件開始,然後依控件建立的順序繼續進行,也就是在對話框範本中定義控件的順序。 當系統找到具有必要特性的控件時,系統會將輸入焦點移至該控件。
如果搜尋具有 WS_TABSTOP 樣式的下一個控制項時,遇到具有 WS_EX_CONTROLPARENT 樣式的視窗,系統會遞迴搜尋該視窗的子系。
應用程式也可以使用 GetNextDlgTabItem 來尋找具有 WS_TABSTOP 樣式的控件。 函式會取得具有 WS_TABSTOP 樣式的下一個或上一個控件的窗口句柄,而不會移動輸入焦點。
WS_GROUP樣式
根據預設,每當使用者按下方向鍵時,系統會將輸入焦點移至下一個或上一個控件。 只要目前具有輸入焦點的控件不會處理這些按鍵,且下一個或上一個控件不是靜態控件,系統就會繼續透過對話框中的所有控件移動輸入焦點,因為使用者繼續按下方向鍵。
應用程式可以使用 WS_GROUP 樣式來修改此預設行為。 樣式會標示控件群組的開頭。 如果用戶開始按下方向鍵時,群組中的控件具有輸入焦點,焦點會保留在群組中。 一般而言,群組中的第一個控件必須具有 WS_GROUP 樣式,而且群組中的所有其他控件都不能有此樣式。 群組中的所有控件都必須是連續的,也就是說,它們必須連續建立,且沒有介入的控件。
當使用者按下方向鍵時,系統會先判斷目前取得輸入焦點的控制項是否能夠處理方向鍵。 系統會將 WM_GETDLGCODE 訊息傳送至控制項,如果控制項傳回 DLGC_WANTARROWS 值,則將該按鍵傳遞給控制項。 否則,系統會使用 GetNextDlgGroupItem 函式來判斷群組中的下一個控件。
GetNextDlgGroupItem 依建立順序或反向順序尋找控制項。 如果使用者按下 RIGHT 或 DOWN 鍵,GetNextDlgGroupItem 如果該控件沒有 WS_GROUP 樣式,則會傳回下一個控件。 否則,函式會反轉搜尋的順序,並傳回具有 WS_GROUP 樣式的第一個控件。 如果使用者按下 LEFT 或 UP 鍵,則函式會傳回上一個控件,除非目前的控件已經有 WS_GROUP 樣式。 如果目前的控制項具有此樣式,則函式會反轉搜尋的順序、找出具有 WS_GROUP 樣式的第一個控件,並傳回緊接在找到控件之前的控件。
如果搜尋群組中的下一個控制項遇到具有WS_EX_CONTROLPARENT 樣式的視窗,系統會遞迴搜尋該視窗的子系。
系統有下一個或上一個控件之後,它會將 WM_GETDLGCODE 訊息傳送至控件,以判斷控件類型。 如果輸入焦點不是靜態控件,那麼系統會將輸入焦點移到控件上。 如果控件是自動單選按鈕,系統就會傳送 BM_CLICK 訊息給它。 應用程式也可以使用 GetNextDlgGroupItem 來尋找群組中的控件。
一般而言,群組中的第一個控件會結合 WS_GROUP 和 WS_TABSTOP 樣式,讓使用者可以使用 TAB 鍵從群組移至群組。 如果群組包含單選按鈕,應用程式應該只將 WS_TABSTOP 樣式套用至群組中的第一個控件。 當使用者在群組中的控件之間移動時,系統會自動移動樣式。 這可確保當使用者使用 TAB 鍵移至群組時,輸入焦點一律會放在最近選取的控件上。
記憶術
助記符是按鈕標籤或靜態控制元件的文字中選擇的字母或數字。 每當使用者按下對應至助記鍵的按鍵,或按這個按鍵和 ALT 鍵組合時,系統就會將輸入焦點移至與助記鍵相關聯的控件。 記憶法可讓使用者使用鍵盤快速移至指定的控件。
應用程式會在控件的標籤或文字中選取的字母或數位之前,立即插入 ampersand (&) 來建立控制元件的助記鍵。 在大部分情況下,對話框範本中控件所提供的 Null 終止字串包含 ampersand。 不過,應用程式可以隨時使用 SetDlgItemText 函式取代控制項的現有標籤或文字,以建立助記鍵。 每個控制項只能指定一個助記鍵。 雖然建議使用,但對話框中的助記鍵不一定是唯一的。
當使用者按下字母或數字鍵時,系統會先判斷目前有輸入焦點的控件是否處理該按鍵。 系統會將 WM_GETDLGCODE 訊息傳送給控件,如果控件傳回 DLGC_WANTALLKEYS 或 DLG_WANTMESSAGE 值,系統就會將索引鍵傳遞至控件。 否則,它會搜尋快捷鍵符合指定字母或數字的控件。 它會繼續搜尋,直到找到控件或已檢查所有控件為止。 在搜尋期間,它會略過任何具有 SS_NOPREFIX 樣式的靜態控件。
如果搜尋具有相符助憶鍵的控件遇到具有 WS_EX_CONTROLPARENT 樣式的視窗,系統會遞迴地搜尋視窗的子系。
如果系統找到靜態控件且控件未停用,則系統會將輸入焦點移至靜態控件之後的第一個控件,該控件為可見、未停用,且具有 WS_TABSTOP 樣式。 如果系統找到具有相符助記鍵的其他控件,則會將輸入焦點移至該控件。 如果控件是預設的按鈕,系統會將 BN_CLICKED 通知訊息傳送至對話框程式。 如果控件是另一種按鈕樣式,而且對話框中沒有其他控件具有相同的助記鍵,則系統會將 BM_CLICK 訊息傳送給控件。
對話框設定
對話框設定是對話框中控件的目前選擇和數值。 建立對話框時,對話框程式會負責初始化這些設定的控件。 它也負責先從控件擷取目前的設定,再終結對話方塊。 用來初始化和擷取設定的方法取決於控件的類型。
如需詳細資訊,請參閱下列主題:
單選按鈕和複選框
對話框會使用單選按鈕和複選框,讓使用者從選項清單中選擇。 單選按鈕讓使用者能從互斥選項中進行選擇;核取方塊則允許使用者選擇一組選項的組合。
對話框程式可以使用 checkDlgButton函式來設定複選框的初始狀態,以設定或清除複選框。 對於一組互斥單選按鈕中的單選按鈕,對話框程式可以使用 CheckRadioButton 函式來設定適當的單選按鈕,並自動清除任何其他單選按鈕。
對話框終止之前,對話框程式可以使用 IsDlgButtonChecked 函式來檢查每個單選按鈕的狀態和複選框,此函式會傳回按鈕的目前狀態。 對話框通常會儲存此資訊,以在下一次建立對話框時初始化按鈕。
對話框編輯控制件
許多對話框都有可讓使用者提供文字做為輸入的編輯控件。 大部分的對話框程式會在對話框第一次啟動時初始化編輯控件。 例如,對話框程式可能會將建議的檔名放在控件中,然後使用者可以選取、修改或取代。 對話框程式可以使用 setDlgItemText 函式來設定編輯控件中的文字,其會將文字從指定的緩衝區複製到編輯控件。 當編輯控制件收到輸入焦點時,它會自動選取要編輯的完整文字。
由於編輯控制項不會自動將其文字傳回對話框,因此對話框程式必須在結束之前擷取文字。 它可以使用 getDlgItemText函式擷取文字,將編輯控件文字複製到緩衝區。 對話框程式通常會儲存此文字,以便稍後初始化編輯控件,或將它傳遞給父視窗進行處理。
某些對話框使用可讓使用者輸入數位的編輯控制件。 對話框程式可以使用 GetDlgItemInt 函式,從編輯控制項擷取文字,並將文字轉換成十進位數值。 使用者以十進位數輸入數位。 它可以是有符號或無符號。 對話框程式可以使用 SetDlgItemInt 函式來顯示整數。 SetDlgItemInt 會將帶正負號或不帶正負號的整數轉換為十進位數的字串。
清單框、下拉式方塊和目錄清單
某些對話框會顯示使用者可以從中選取一或多個名稱的名稱清單。 例如,若要顯示檔名清單,對話框通常會使用清單框和 DlgDirList 和 DlgDirSelectEx 函式。 DlgDirList 函式會自動將目前目錄中的檔名填入清單框。 DlgDirSelect 函式會從清單框擷取選取的檔名。 這兩個函式一起提供方便的方式,讓對話框顯示目錄清單,讓使用者不需要輸入其名稱和位置即可選取檔案。
對話框也可以使用下拉式方塊來顯示檔名清單。 DlgDirListComboBox 函數會自動將組合方塊中的清單框部分填入目前目錄中的檔案名稱。 DlgDirSelectComboBoxEx 函式會從清單框部分擷取選取的檔名。
對話框控件訊息
許多控件可辨識控件接收的預先定義訊息,導致它們執行某些動作。 例如,BM_SETCHECK 訊息會設定複選框的勾選狀態,而 EM_GETSEL 訊息會擷取控制項中目前選取的文字部分。 控件訊息可讓對話框程式比標準函式更有彈性地存取控件,因此在對話框需要與用戶進行複雜的互動時,通常會使用它們。
對話框程式可以藉由提供控件標識符並使用 SendDlgItemMessage 函式來傳送訊息給控件,這與 sendMessage函式相同,不同之處在於它會使用控件標識符,而不是視窗句柄來識別接收訊息的控件。 指定的訊息可能需要對話框程式傳送具有訊息的參數,而且訊息可能會有對應的傳回值。 每個控件訊息的作業和需求取決於訊息的用途,以及處理它的控件。
如需控件訊息的詳細資訊,請參閱 Windows 控件。
自訂對話框
應用程式可以使用對話框的應用程式定義窗口類別,而不是使用預先定義的對話框類別來建立自定義對話方塊。 當對話框是主視窗時,應用程式通常會使用此方法,但對於具有標準重疊視窗的應用程式來說,這個方法也很有用,可以用來建立模態和非模態對話框。
應用程式定義的視窗類別可讓應用程式定義對話框的視窗程式,並在傳送訊息至對話框程式之前處理訊息。 它也可讓應用程式定義類別圖示、類別背景筆刷,以及對話框的類別功能表。 應用程式必須先註冊窗口類別,才能嘗試建立對話框,而且必須提供對話框範本與窗口類別的 Atom 值或名稱。
許多應用程式會先擷取預先定義的對話框類別類別的類別資訊,然後將它傳遞至 getClassInfo函式,以填滿 WNDCLASS 結構的資訊,以建立新的對話框類別。 應用程式會修改結構的個別成員,例如類別名稱、筆刷和圖示,然後使用 registerClass函式註冊新類別。 如果應用程式自行填入 WNDCLASS 結構,則必須將 cbWndExtra 成員設定為 DLGWINDOWEXTRA,這是系統針對每個對話框所需的額外位元組數目。 如果應用程式也會針對每個對話框使用額外的位元組,則必須超過系統所需的額外位元組。
自訂對話框的視窗程式與任何其他視窗程式具有相同的參數和需求。 不過,不同於其他視窗程式,此對話框的視窗程式應該針對它未處理的訊息呼叫 DefDlgProc 函式,而不是 DefWindowProc 函式。 DefDlgProc 會執行與預先定義對話框視窗程式相同的預設訊息處理,其中包括呼叫對話框程式。
應用程式也可以藉由子類別化預先定義對話框的視窗程式,來建立自定義對話方塊。 SetWindowLong 函式可讓應用程式指定指定視窗的視窗程式。 應用程式也可能嘗試使用 SetClassLong 函式來子類化,但這樣做會影響系統中的所有對話框,而不只是屬於應用程式的對話框。
建立自訂對話框的應用程式有時會提供對話框的替代鍵盤介面。 對於無模式對話框,這可能表示應用程式不會呼叫 IsDialogMessage 函式,而是改由自定義視窗程序來處理所有鍵盤輸入。 在這種情況下,應用程式可以使用 WM_NEXTDLGCTL 訊息,將輸入焦點從一個控件移至另一個控件所需的程式代碼降到最低。 此訊息傳遞至 DefDlgProc時,會將輸入焦點移至指定的控件,並更新控件的外觀,例如移動預設的按鈕框線或設定自動單選按鈕。