#include <Windows.h>
#include <windowsx.h>
#include "resource.h"
// 对于单选框,相关联的选项同一时刻应该只能选中一个,需要通过 GROUP
// 属性进行设置。先设置控件的顺序,让关联的选项位置是连续的,然后找
// 到其中的第一个单选按钮,将他的组设置为 TRUE
// 对话框的回调函数,消息处理了返回 TRUE,没有处理返回 FALSE
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// 当用户点击了关闭按钮时产生的消息,对话框要求必须使用 EndDialig 退出
case WM_CLOSE:
{
EndDialog(hDlg, 0);
break;
}
// 对于标准控件,例如按钮,应该使用 WM_COMMAND 进行响应
case WM_COMMAND:
{
// 附加参数:LOWORD(wParam) = id HIWORD(wParam) = NM_(通知消息) lParam = hWnd
// 如果用户点击了第一个按钮,就将用户选中的所有多选框内容进行输出
if (LOWORD(wParam) == IDC_BUTTON1)
{
// 在拖拽控件的时候,三个多选框是连续产生的,所有 id 也是连续的,
// 此时使用第一个多选框的 id 就可以计算出其它的 id,使用 for
// 可以遍历到所有的 id 状态,获取到响应的句柄值
for (int i = 0; i < 3; i++)
{
HWND hCheckBox = GetDlgItem(hDlg, IDC_CHECK1 + i);
// 发送消息获取按钮的选中状态,如果返回 BST_CHECKED 表示被选中了
if (BST_CHECKED == SendMessage(hCheckBox, BM_GETCHECK, 0, 0))
{
// GetWindowTxt \ SendMessage \ Button_GetText
WCHAR wText[0x100]{};
Button_GetText(hCheckBox, wText, 0x100);
MessageBox(hDlg, wText, wText, MB_OK);
}
}
}
if (LOWORD(wParam) == IDC_BUTTON2)
{
for (int i = 0; i < 3; i++)
{
HWND hRadioBox = GetDlgItem(hDlg, IDC_RADIO1 + i);
// 发送消息获取按钮的选中状态,如果返回 BST_CHECKED 表示被选中了
if (BST_CHECKED == Button_GetCheck(hRadioBox))
{
// GetWindowText \ SendMessage \ Button_GetText
WCHAR wText[0x100]{};
Button_GetText(hRadioBox, wText, 0x100);
MessageBox(hDlg, wText, wText, MB_OK);
break;
}
}
}
break;
}
// 对话框的初始化消息是 WM_INITDIALOG,常用于进行控件的初始化
case WM_INITDIALOG:
{
/*
HWND hRadio = GetDlgItem(hDlg, IDC_RADIO2);
Button_SetCheck(hRadio, BST_CHECKED);
*/
SendDlgItemMessage(hDlg, IDC_RADIO2, BM_SETCHECK, BST_CHECKED, 0);
break;
}
default:
{
return FALSE;
}
}
return TRUE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 1. 是实例句柄,用于标识资源所在的位置
// 2. 资源的ID,大多数时候会使用 MAKEINTRESOURCE 进行转换
// 3. 对话框的父窗口,NULL 表示桌面
// 4. 回调函数,用于响应对话框产生的所有消息
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
return 0;
}
