對話框是 Windows 應用程式最常見的介面形式,資源驅動設計讓介面編輯與程式邏輯分離,開發效率媲美 Visual Basic。本文詳細說明對話框資源腳本編寫、DialogBoxParam 模態對話框建立流程、訊息處理迴路,並提供 MASM 完整範例實作編輯框顯示與退出功能。
資源檔(.rc)定義對話框佈局與控件,可用 VC++ 資源編輯器視覺化編輯,或手寫腳本。範例:
#include "\masm32\include\resource.h"
#define IDC_EDIT 3000
#define IDC_BUTTON 3001
#define IDC_EXIT 3002
MyDialog DIALOG 10, 10, 205, 60
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "我的對話框"
BEGIN
EDITTEXT IDC_EDIT, 15, 17, 111, 13, ES_AUTOHSCROLL | ES_LEFT
DEFPUSHBUTTON "顯示編輯框中的內容", IDC_BUTTON, 141, 10, 52, 13
PUSHBUTTON "退出程序", IDC_EXIT, 141, 26, 52, 13
END
關鍵點:
DIALOG x, y, w, h:座標單位為對話框單位(非像素),依系統字型縮放STYLE:組合視窗樣式與對話框專用樣式(DS_CENTER 置中、DS_MODALFRAME 模態邊框、DS_3DLOOK 立體外觀)EDITTEXT、DEFPUSHBUTTON(預設按鈕,Enter 觸發)、PUSHBUTTON#define 管理rsrc.rc,選擇 Project → Compile Resource File對話框程式無傳統 WinMain 訊息迴圈,直接呼叫 DialogBoxParam 進入模態迴圈,由系統內部處理訊息分派:
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke DialogBoxParam, hInstance, ADDR DlgName, NULL, ADDR DlgProc, NULL
invoke ExitProcess, eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
; 訊息處理...
ret
DlgProc endp
end start
DialogBoxParam 參數:實例控制碼、對話框資源名/ID、父視窗(NULL=無)、對話框程式指標、建立參數(lParam 傳給 WM_INITDIALOG)。
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_INITDIALOG
; 初始化:設定焦點、載入資料等
invoke GetDlgItem, hWnd, IDC_EDIT
invoke SetFocus, eax
.ELSEIF uMsg==WM_CLOSE
; 必須處理,否則標題列關閉鈕無效
invoke EndDialog, hWnd, NULL
.ELSEIF uMsg==WM_COMMAND
mov eax, wParam
.IF eax==IDC_BUTTON
invoke GetDlgItemText, hWnd, IDC_EDIT, ADDR buffer, 512
invoke MessageBox, NULL, ADDR buffer, ADDR AppName, MB_OK
.ELSEIF ax==IDC_EXIT
invoke EndDialog, hWnd, NULL
.ENDIF
.ELSE
mov eax, FALSE
ret
.ENDIF
mov eax, TRUE
ret
DlgProc endp
回傳值慣例:處理過訊息回傳 TRUE,未處理回傳 FALSE 讓系統預設處理。
| 函式 | 用途 |
|---|---|
GetDlgItem(hDlg, nIDDlgItem) | 取得控件控制碼 |
SetFocus(hWnd) | 設定鍵盤焦點 |
GetDlgItemText(hDlg, nID, lpString, nMaxCount) | 取得編輯框文字 |
SetDlgItemText(hDlg, nID, lpString) | 設定控件文字 |
EndDialog(hDlg, nResult) | 結束模態對話框 |
SendDlgItemMessage(hDlg, nID, Msg, wParam, lParam) | 直接發送訊息給控件 |
CheckDlgButton / IsDlgButtonChecked | 核取/選項按鈕狀態 |