對話框本質上就是一種視窗(控制項也可視為子視窗)。最簡單的對話框莫過於 MessageBox,但若要自訂介面與互動邏輯,就需要建立對話框資源並撰寫對話框程序。
.rc 檔,或從「檢視」→「資源檢視」→專案右鍵→「加入」→「資源」。IDD_MYDLG)。IDC_DISP、IDC_BTN)。



在主視窗的 WM_CREATE 中呼叫 CreateDialog 建立非模態對話框,父視窗為主視窗:
case WM_CREATE:
hdlg = CreateDialog(hgapp, MAKEINTRESOURCE(IDD_MYDLG), hwnd, (DLGPROC)DlgProc);
if (hdlg) ShowWindow(hdlg, SW_NORMAL);
return 0;
注意:對話框程序 DlgProc 必須先宣告(前置宣告),否則編譯器會找不到。回傳型別為 INT_PTR CALLBACK,切勿 在內部呼叫 DefDlgProc,否則會導致無限遞迴。
使用者點擊標題列關閉鈕會觸發 WM_SYSCOMMAND(wParam == SC_CLOSE),此時應呼叫 DestroyWindow 銷毀對話框:
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) {
DestroyWindow(hdlg); // 會觸發 WM_DESTROY
}
return 0;
按鈕點擊產生 WM_COMMAND,LOWORD(wParam) 為控制項 ID。取得靜態文字控制項控制代碼需用 GetDlgItem(hdlg, IDC_DISP),然後以 SetWindowText 更新內容:
case WM_COMMAND:
if (LOWORD(wParam) == IDC_BTN) {
nCount++;
HWND hStatic = GetDlgItem(hdlg, IDC_DISP);
WCHAR str[MAXCHAR];
int n = wsprintf(str, L"你點擊了%d次按鈕。", nCount);
str[n] = L'\0';
SetWindowText(hStatic, str);
}
return 0;


#include <Windows.h>
#include "resource.h"
LRESULT CALLBACK WinMainProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);
HINSTANCE hgapp;
int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow) {
LPCWSTR cn = L"My";
WNDCLASS wc = { sizeof(WNDCLASS) };
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hInstance = hThisApp;
wc.lpfnWndProc = WinMainProc;
wc.lpszClassName = cn;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
HWND hwnd = CreateWindow(cn, L"主視窗", WS_OVERLAPPEDWINDOW,
30, 22, 360, 280, NULL, NULL, hThisApp, NULL);
if (!hwnd) return 0;
hgapp = hThisApp;
ShowWindow(hwnd, nShow);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinMainProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
HWND hdlg;
switch (msg) {
case WM_CREATE:
hdlg = CreateDialog(hgapp, MAKEINTRESOURCE(IDD_MYDLG), hwnd, (DLGPROC)DlgProc);
if (hdlg) ShowWindow(hdlg, SW_NORMAL);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) {
static int nCount = 0;
switch (msg) {
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) DestroyWindow(hdlg);
return 0;
case WM_COMMAND:
if (LOWORD(wParam) == IDC_BTN) {
nCount++;
HWND hStatic = GetDlgItem(hdlg, IDC_DISP);
WCHAR str[MAXCHAR];
int n = wsprintf(str, L"你點擊了%d次按鈕。", nCount);
str[n] = L'\0';
SetWindowText(hStatic, str);
}
return 0;
}
return (INT_PTR)FALSE;
}
CreateDialog + ShowWindowDefDlgProcWM_SYSCOMMAND / SC_CLOSE → DestroyWindowGetDlgItem(hDlg, controlID)SetWindowText / WM_SETTEXT / Static_SetText