在part.3中我们遗留了一个问题,当程序获取到当前的命令ID为IDM_ABOUT
这个时候程序运行了DialogBox
函数创建并显示一个模态对话框,函数将消息发送到指定的对话框过程(About
),用于处理对话框的消息。
int wmId = LOWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
}
那么这个对话框过程About
又具体做了哪些事情呢,接下来我们就根据模板中给到的About
对话框过程的具体代码来进行剖析,代码如下:
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
函数声明
函数声明部分我们在part.1已经做过详细描述,为了阅读方便,在文中我们再次进行体现。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
INT_PTR: 函数返回一个整数类型的值,适用于32位和64位系统。
CALLBACK: 指定调用约定,表示这是一个回调函数。
About: 函数名,通常与对话框相关联。
HWND hDlg: 句柄,表示对话框窗口。
UINT message: 消息标识符,表示当前正在处理的消息。
WPARAM wParam: 附加的消息特定信息(通常是一个整型值或句柄)。
LPARAM lParam: 附加的消息特定信息(通常是一个指针或整型值)。
函数主体部分:
UNREFERENCED_PARAMETER(lParam):
这个宏用于消除未使用参数的警告。在这个函数中,lParam
未被使用,因此使用该宏来避免编译器警告。
消除警告后接着就是需要进行消息处理了;switch (message)
: 根据接收到的消息类型进行不同的处理;
case WM_INITDIALOG:
return (INT_PTR)TRUE;
当接收到的消息为WM_INITDIALOG
时return (INT_PTR)TRUE;
表示会话框初始化完成。当接收到的消息为WM_COMMAND
(WM_COMMAND
消息通常在用户与对话框中的控件交互时发送,比如按钮点击);这个时候会执行一下代码:
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
这个时候就使用if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
代码进行低位字的检查,LOWORD(wParam)
取得 wParam
的低位字。检查低位字是否等于 IDOK
(“确定”按钮的标识符)或 IDCANCEL
(“取消”按钮的标识符);这个检查确保只有当用户点击了“确定”或“取消”按钮时,才会执行下面的代码。
EndDialog(hDlg, LOWORD(wParam));
:EndDialog
函数用于关闭对话框;hDlg
是对话框的句柄。LOWORD(wParam)
是传递给 EndDialog
的返回值,可以是 IDOK
或 IDCANCEL
,这个函数调用将关闭对话框,并将点击按钮的标识符返回给创建对话框的程序。
return (INT_PTR)TRUE;
:返回 TRUE
表示消息已经处理完毕;这个返回值告诉系统,WM_COMMAND
消息已经被处理,不需要进一步处理。
break;
:结束 case WM_COMMAND:
代码块。