#include <Windows.h>#include <windowsx.h>#include "resource.h"// 对于单选框,相关联的选项同一时刻应该只能选中一个,需要通过 GROUP// 属性进行设置。先设置控件的顺序,让关联的选项位置是连续的,然后找// 到其中的第一个单选按钮,将他的组设置为 TRUE// 对话框的回调函数,消息处理了返回 TRUE,没有处理返回 FALSEINT_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;}
