對話方塊程式設計考量

本概觀討論有關對話框的一些程式設計考慮。

概觀包含下列主題。

對話框程式

對話框程式類似於視窗程式,當系統有要提供或執行工作的資訊時,會將訊息傳送至程式。不同於視窗程式,對話框程序永遠不會呼叫 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 函式擷取控件的視窗句柄。

對話框程式可以視需要變更任何控件的內容、狀態和位置。 例如,在包含檔名清單框和 [開啟] 按鈕的對話框中,程式可以停用 [開啟] 按鈕,直到使用者從清單中選取檔案為止。 在此範例中,對話框範本會指定 [開啟] 按鈕的WS_DISABLED樣式,而系統會在建立按鈕時自動停用該按鈕。 當對話框程式從清單框收到通知訊息,指出使用者已選取檔案時,程式會呼叫 EnableWindow 函式來啟用 [開啟] 按鈕。

若要在對話框的 標題 列上顯示自定義圖示,您的WM_INITDIALOG處理程式可以將WM_SETICON訊息傳送至對話方塊。

如果應用程式使用其中一個函數 DialogBoxParam、DialogBoxIndirectParamCreateDialogParam 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 樣式,以防止這些訊息。 除非應用程式為對話框建立自己的控件,否則應用程式無法覆寫此預設行為。

控制色彩訊息

當控件和系統想要對話框程式使用特定筆刷和色彩來繪製控件或其他視窗的背景時,控件和系統就可以傳送控件色彩訊息。 當應用程式覆寫對話方塊及其控件中使用的預設色彩時,這非常有用。 以下是已取代WM_CTLCOLOR訊息的控件色彩訊息。

控制件會在繪製自己的背景之前,將控制項色彩訊息傳送至對話框程式。 訊息可讓程式指定要使用的筆刷,以及設定背景和前景色彩。 此程式會傳回筆刷控點來指定筆刷。 若要設定背景和前景色彩,程式會使用 SetBkColorSetTextColor 函式搭配控件的顯示裝置內容。 控件色彩訊息會將句柄傳遞至訊息 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_SETFONTDS_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 樣式)。
DOWN 將輸入焦點移至群組中的下一個控制件。
ENTER 將WM_COMMAND訊息傳送至對話框程式。 wParam 參數會設定為預設按鈕的IDOK或控制標識碼。
ESC 將WM_COMMAND訊息傳送至對話框程式。 wParam 參數設定為 IDCANCEL。
LEFT 將輸入焦點移至群組中的上一個控制件。
記憶 將輸入焦點移至包含指定助記鍵的靜態控件之後的第一個控件(具有 WS_TABSTOP 樣式)。
RIGHT 將輸入焦點移至群組中的下一個控制件。
SHIFT+TAB 將輸入焦點移至具有 WS_TABSTOP樣式的 上一個控件。
TAB 將輸入焦點移至具有 WS_TABSTOP樣式的 下一個控件。
UP 將輸入焦點移至群組中的上一個控制件。

系統會自動為所有強制回應對話框提供鍵盤介面。 除非應用程式呼叫 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 鍵,如果該控件沒有WS_GROUP樣式,GetNextDlgGroupItem 會傳回下一個控件。 否則,函式會反轉搜尋的順序,並傳回具有 WS_GROUP 樣式的第一個控件。 如果使用者按下 LEFT 或 UP 鍵,則函式會傳回上一個控件,除非目前的控件已經有 WS_GROUP 樣式。 如果目前控制項具有此樣式,則函式會反轉搜尋的順序、找出具有 WS_GROUP 樣式的第一個控件,並傳回緊接在所找到控件之前的控件。

如果搜尋群組中的下一個控件遇到具有WS_EX_CONTROLPARENT樣式的視窗,系統會遞歸搜尋視窗的子系。

系統有下一個或上一個 控件之後,它會將WM_GETDLGCODE 訊息傳送至控件,以判斷控件類型。 然後,如果輸入焦點不是靜態控件,系統就會將輸入焦點移至控件。 如果控件是自動單選按鈕,系統就會傳送 BM_CLICK 訊息給它。 應用程式也可以使用 GetNextDlgGroupItem 來尋找群組中的控件。

一般而言,群組中的第一個控件會結合WS_GROUPWS_TABSTOP樣式,讓使用者可以使用 TAB 鍵從群組移至群組。 如果群組包含單選按鈕,應用程式應該只將WS_TABSTOP樣式套用至群組中的第一個控件。 當使用者在群組中的控件之間移動時,系統會自動移動樣式。 這可確保當使用者使用 TAB 鍵移至群組時,輸入焦點一律會放在最近選取的控件上。

助記鍵

助記鍵是按鈕標籤或靜態控件文字中選取的字母或數位。 每當使用者按下對應至助記鍵的按鍵,或按這個按鍵和 ALT 鍵組合時,系統就會將輸入焦點移至與助記鍵相關聯的控件。 助記鍵可讓使用者使用鍵盤快速移至指定的控制件。

應用程式會在控件的標籤或文字中,緊接在選取的字母或數位之前插入 ampersand (&) 來建立控制元件的助記鍵。 在大部分情況下,對話框範本中控件所提供的 Null 終止字串包含 ampersand。 不過,應用程式可以隨時使用 SetDlgItemText 函式取代控件的現有標籤或文字,以建立助記鍵。 每個控制項只能指定一個助記鍵。 雖然建議使用,但對話框中的助記鍵不一定是唯一的。

當使用者按下字母或數字鍵時,系統會先判斷目前控件是否讓輸入焦點處理按鍵。 系統會將 WM_GETDLGCODE 訊息傳送給控件,如果控件傳回 DLGC_WANTALLKEYSDLG_WANTMESSAGE 值,系統就會將索引鍵傳遞至控件。 否則,它會搜尋助記鍵符合指定字母或數位的控件。 它會繼續搜尋,直到找到控件或已檢查所有控件為止。 在搜尋期間,它會略過具有 SS_NOPREFIX 樣式的任何靜態控件。

如果搜尋具有相符助記音鍵的控件遇到具有WS_EX_CONTROLPARENT樣式的視窗,系統會遞歸地搜尋視窗的子系。

如果系統找到靜態控件且控件未停用,則系統會將輸入焦點移至靜態控件之後的第一個控件,該控件為可見、未停用,且具有 WS_TABSTOP 樣式。 如果系統找到一些具有相符助記鍵的其他控件,則會將輸入焦點移至該控件。 如果控件是預設的按鈕,系統會將BN_CLICKED通知訊息傳送至對話框程式。 如果控件是另一種按鈕樣式,而且對話框中沒有其他控件具有相同助記鍵,則系統會將BM_CLICK訊息傳送給控件。

對話框 設定

對話框設定是對話框中控制件的目前選取專案和值。 建立對話框時,對話框程式會負責初始化這些設定的控件。 它也負責先從控件擷取目前的設定,再終結對話方塊。 用來初始化和擷取設定的方法取決於控件的類型。

如需詳細資訊,請參閱下列主題:

單選按鈕和複選框

對話框會使用單選按鈕和複選框,讓使用者從選項清單中選擇。 單選按鈕可讓使用者從互斥選項中選擇;選取框可讓使用者挑選選項的組合。

對話框程式可以使用 CheckDlgButton 函式來設定複選框的初始狀態,以設定或清除複選框。 對於一組互斥單選按鈕中的單選按鈕,對話框程式可以使用 CheckRadioButton 函式來設定適當的單選按鈕,並自動清除任何其他單選按鈕。

對話框終止之前,對話框程式可以使用IsDlgButtonChecked函式來檢查每個單選按鈕和複選框的狀態,這會傳回按鈕的目前狀態。 對話框通常會儲存此資訊,以在下一次建立對話框時初始化按鈕。

對話框編輯控制件

許多對話框都有可讓使用者提供文字做為輸入的編輯控件。 大部分的對話框程式會在對話框第一次啟動時初始化編輯控件。 例如,對話框程式可能會將建議的檔名放在控件中,然後使用者可以選取、修改或取代。 對話框程式可以使用 SetDlgItemText 函式,將文字從指定的緩衝區複製到編輯控件,以設定編輯控制項中的文字。 當編輯控制件收到輸入焦點時,它會自動選取要編輯的完整文字。

由於編輯控制項不會自動將其文字傳回對話框,因此對話框程式必須在結束之前擷取文字。 它可以使用 GetDlgItemText 函式來擷取文字,此函式會將編輯控件文字複製到緩衝區。 對話框程式通常會儲存此文字,以便稍後初始化編輯控件,或將它傳遞給父視窗進行處理。

某些對話框使用可讓使用者輸入數位的編輯控制件。 對話框程式可以使用 GetDlgItemInt 函式,從編輯控件擷取數位,從編輯控件擷取文字,並將文字轉換成十進位值。 使用者以十進位數輸入數位。 它可以是已簽署或未簽署。 對話框程式可以使用 SetDlgItemInt 函式來顯示整數 SetDlgItemInt 會將帶正負號或不帶正負號的整數轉換為十進位數的字串。

清單框、下拉式方塊和目錄清單

某些對話框會顯示使用者可以從中選取一或多個名稱的名稱清單。 例如,若要顯示檔名清單,對話框通常會使用清單框和 DlgDirListDlgDirSelectEx 函式。 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 時,會將輸入焦點移至指定的控件,並更新控件的外觀,例如行動預設的按鈕框線或設定自動單選按鈕。