編譯警告:回調函數參數類型不匹配。運行時對話框閃退或不顯示。
// 正確原型
BOOL CALLBACK DialogProc(
HWND hwndDlg, // 對話框窗口句柄
UINT uMsg, // 消息標識
WPARAM wParam, // 消息參數
LPARAM lParam // 消息參數
);
| 錯誤寫法 | 問題 | 後果 |
|---|---|---|
void DialogProc(...) | 返回類型應為 BOOL | 棧平衡破壞,崩潰 |
BOOL DialogProc(HWND, int, int, int) | 缺 CALLBACK、類型寬度錯 | 64位下參數截斷 |
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM) | 參數名無所謂,類型必須對 | 正確 |
#include
BOOL CALLBACK MyDialogProc(HWND hDlg, UINT msg, WPARAM w, LPARAM l) {
switch (msg) {
case WM_INITDIALOG:
return TRUE; // 讓系統設置默認焦點
case WM_COMMAND:
if (LOWORD(w) == IDOK || LOWORD(w) == IDCANCEL) {
EndDialog(hDlg, LOWORD(w));
return TRUE;
}
break;
}
return FALSE; // 未處理消息交給系統
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) {
DialogBox(hInst, MAKEINTRESOURCE(IDD_MYDIALOG), NULL, MyDialogProc);
return 0;
}
IDD_MYDIALOG DIALOGEX 0, 0, 200, 150
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "標題"
FONT 9, "微軟雅黑"
BEGIN
DEFPUSHBUTTON "確定", IDOK, 50, 120, 50, 14
PUSHBUTTON "取消", IDCANCEL, 110, 120, 50, 14
LTEXT "內容文本", IDC_STATIC, 10, 10, 180, 80
END
OutputDebugString 追蹤回調進入MAKEINTRESOURCE 一致嚴格遵循 BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM) 簽名,是 Win32 對話框正常運行的前提。