1. #include <Windows.h>
    2. #include <windowsx.h>
    3. #include "resource.h"
    4. // 对于单选框,相关联的选项同一时刻应该只能选中一个,需要通过 GROUP
    5. // 属性进行设置。先设置控件的顺序,让关联的选项位置是连续的,然后找
    6. // 到其中的第一个单选按钮,将他的组设置为 TRUE
    7. // 对话框的回调函数,消息处理了返回 TRUE,没有处理返回 FALSE
    8. INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    9. {
    10. switch (uMsg)
    11. {
    12. // 当用户点击了关闭按钮时产生的消息,对话框要求必须使用 EndDialig 退出
    13. case WM_CLOSE:
    14. {
    15. EndDialog(hDlg, 0);
    16. break;
    17. }
    18. // 对于标准控件,例如按钮,应该使用 WM_COMMAND 进行响应
    19. case WM_COMMAND:
    20. {
    21. // 附加参数:LOWORD(wParam) = id HIWORD(wParam) = NM_(通知消息) lParam = hWnd
    22. // 如果用户点击了第一个按钮,就将用户选中的所有多选框内容进行输出
    23. if (LOWORD(wParam) == IDC_BUTTON1)
    24. {
    25. // 在拖拽控件的时候,三个多选框是连续产生的,所有 id 也是连续的,
    26. // 此时使用第一个多选框的 id 就可以计算出其它的 id,使用 for
    27. // 可以遍历到所有的 id 状态,获取到响应的句柄值
    28. for (int i = 0; i < 3; i++)
    29. {
    30. HWND hCheckBox = GetDlgItem(hDlg, IDC_CHECK1 + i);
    31. // 发送消息获取按钮的选中状态,如果返回 BST_CHECKED 表示被选中了
    32. if (BST_CHECKED == SendMessage(hCheckBox, BM_GETCHECK, 0, 0))
    33. {
    34. // GetWindowTxt \ SendMessage \ Button_GetText
    35. WCHAR wText[0x100]{};
    36. Button_GetText(hCheckBox, wText, 0x100);
    37. MessageBox(hDlg, wText, wText, MB_OK);
    38. }
    39. }
    40. }
    41. if (LOWORD(wParam) == IDC_BUTTON2)
    42. {
    43. for (int i = 0; i < 3; i++)
    44. {
    45. HWND hRadioBox = GetDlgItem(hDlg, IDC_RADIO1 + i);
    46. // 发送消息获取按钮的选中状态,如果返回 BST_CHECKED 表示被选中了
    47. if (BST_CHECKED == Button_GetCheck(hRadioBox))
    48. {
    49. // GetWindowText \ SendMessage \ Button_GetText
    50. WCHAR wText[0x100]{};
    51. Button_GetText(hRadioBox, wText, 0x100);
    52. MessageBox(hDlg, wText, wText, MB_OK);
    53. break;
    54. }
    55. }
    56. }
    57. break;
    58. }
    59. // 对话框的初始化消息是 WM_INITDIALOG,常用于进行控件的初始化
    60. case WM_INITDIALOG:
    61. {
    62. /*
    63. HWND hRadio = GetDlgItem(hDlg, IDC_RADIO2);
    64. Button_SetCheck(hRadio, BST_CHECKED);
    65. */
    66. SendDlgItemMessage(hDlg, IDC_RADIO2, BM_SETCHECK, BST_CHECKED, 0);
    67. break;
    68. }
    69. default:
    70. {
    71. return FALSE;
    72. }
    73. }
    74. return TRUE;
    75. }
    76. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    77. {
    78. // 1. 是实例句柄,用于标识资源所在的位置
    79. // 2. 资源的ID,大多数时候会使用 MAKEINTRESOURCE 进行转换
    80. // 3. 对话框的父窗口,NULL 表示桌面
    81. // 4. 回调函数,用于响应对话框产生的所有消息
    82. DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    83. return 0;
    84. }

    image.png