Win32单选按钮使用和分组

⌚Time: 2023-01-10 23:08:40

👨‍💻Author: Jack Ge

RadioButton获取与设置选中状态

发送消息函数


LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)

参数

hWnd:指定要接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

Msg:指定被发送的消息。

wParam:指定附加的消息特定信息。

lParam:指定附加的消息特定信息。

返回值:返回值指定消息处理的结果,依赖于所发送的消息。

查看IDC_RADIO_BUTTON_0单选按钮的选中状态,发送消息BM_GETCHECK,参数wParam和IParam都是0

返回BST_CHECKED(选中状态) BST_UNCHECKED (未选中状态)


SendMessage(GetDlgItem(hwnd,IDC_RADIO_BUTTON_0), BM_GETCHECK, 0, 0)

设置IDC_RADIO_BUTTON_0单选按钮选中状态,发送消息BM_SETCHECK,wParam参数为BST_CHECKED/BST_UNCHECKED ,IParam是0


SendMessage(GetDlgItem(hwnd,IDC_RADIO_BUTTON_0), BM_SETCHECK,BST_CHECKED, 0);

RadioButton分组

RadioButton根据tab键顺序,如果一个RadioButton设置WS_GROUP样式,排在它后面顺序的RadioButton将和它一组,直到新的RadioButton有WS_GROUP样式为止

默认情况下,Tab 键顺序与创建控件的顺序相同

假设Radio0、Radio1、Radio2、 Radio3的tab顺序分别是21、22、23、24。Radio0和Radio2具有WS_GROUP属性,那么,Radio0和Radio1是一组,Radio2、 Radio3是另外一组。

简单的说,为radiobutton分组,就是给每组的第一个radio按钮添加WS_GROUP样式

测试程序


#include <windows.h>

#include <stdio.h>

//定义按钮资源ID

#define IDC_RADIO_BUTTON_0 1000

#define IDC_RADIO_BUTTON_1 1001

#define IDC_RADIO_BUTTON_2 1002

#define IDC_RADIO_BUTTON_3 1003

#define IDC_RADIO_BUTTON_4 1004

//声明窗体过程回调函数

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

//win32函数入口

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)

{

    //设计窗体类

    const char CLASS_NAME[]  = "Sample Window Class";



    WNDCLASSA wc = { };



    wc.lpfnWndProc   = WindowProc;

    wc.hInstance     = hInstance;

    wc.lpszClassName = CLASS_NAME;

    //注册窗体类

    RegisterClassA(&wc);



    //创建窗体



    HWND hwnd = CreateWindowExA(

        0,                              // Optional window styles.

        CLASS_NAME,                     // Window class

        "Test Button",    // Window text

        WS_OVERLAPPEDWINDOW,            // Window style



        // Size and position

        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,



        NULL,       // Parent window    

        NULL,       // Menu

        hInstance,  // Instance handle

        NULL        // Additional application data

        );



    if (hwnd == NULL)

    {

        return 0;

    }

    //显示窗体

    ShowWindow(hwnd, nCmdShow);



    //启动消息循环



    MSG msg = { };

    while (GetMessage(&msg, NULL, 0, 0) > 0)

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }



    return 0;

}



LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

    switch (uMsg)

    {

    case WM_CREATE://窗体建立消息

        {



            //创建按钮

            HWND hRadioButton0 = CreateWindow("BUTTON",

                "radio 0",  

                WS_CHILD | WS_VISIBLE| BS_AUTORADIOBUTTON | WS_GROUP,

                10,10, 70, 30,

                hwnd,

                (HMENU)IDC_RADIO_BUTTON_0,

                ((LPCREATESTRUCT)lParam)->hInstance,

                NULL);

            HWND hRadioButton1 = CreateWindow("BUTTON",

                "radio 1",  

                WS_CHILD | WS_VISIBLE| BS_AUTORADIOBUTTON,

                10,30, 70, 30,

                hwnd,

                (HMENU)IDC_RADIO_BUTTON_1,

                ((LPCREATESTRUCT)lParam)->hInstance,

                NULL);

            HWND hRadioButton2 = CreateWindow("BUTTON",

                "radio 2",  

                WS_CHILD | WS_VISIBLE| BS_AUTORADIOBUTTON | WS_GROUP,

                100,10, 70, 30,

                hwnd,

                (HMENU)IDC_RADIO_BUTTON_2,

                ((LPCREATESTRUCT)lParam)->hInstance,

                NULL);

            HWND hRadioButton3 = CreateWindow("BUTTON",

                "radio 3",  

                WS_CHILD | WS_VISIBLE| BS_AUTORADIOBUTTON,

                100,30, 70, 30,

                hwnd,

                (HMENU)IDC_RADIO_BUTTON_3,

                ((LPCREATESTRUCT)lParam)->hInstance,

                NULL);

            HWND hRadioButton4 = CreateWindow("BUTTON",

                "radio 4",  

                WS_CHILD | WS_VISIBLE| BS_AUTORADIOBUTTON,

                100,50, 70, 30,

                hwnd,

                (HMENU)IDC_RADIO_BUTTON_4,

                ((LPCREATESTRUCT)lParam)->hInstance,

                NULL);

                //发送BM_SETCHECK消息BST_CHECKED设置选中BST_UNCHECKED未选中

                SendMessage(hRadioButton0, BM_SETCHECK,BST_CHECKED, 0);

                SendMessage(hRadioButton2, BM_SETCHECK,BST_CHECKED, 0);

        }

        return 0;

    case WM_COMMAND:

        switch(wParam)

        {

        case IDC_RADIO_BUTTON_0:

            printf("radiobutton 0 !\n");

            break;

        case IDC_RADIO_BUTTON_1:

            printf("radiobutton 1 !\n");

            break;

        case IDC_RADIO_BUTTON_2:

            printf("radiobutton 2 !\n");

            break;

        case IDC_RADIO_BUTTON_3:

            printf("radiobutton 3 !\n");

            break;

        case IDC_RADIO_BUTTON_4:

            printf("radiobutton 4 !\n");

            break;

        }

        

        return DefWindowProc(hwnd, uMsg, wParam, lParam);

    case WM_DESTROY://窗体销毁消息

        PostQuitMessage(0);

        return 0;

    case WM_PAINT://重绘消息

        {

        PAINTSTRUCT ps;

        HDC hdc = BeginPaint(hwnd, &ps);



        // All painting occurs here, between BeginPaint and EndPaint.



        FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));



        EndPaint(hwnd, &ps);

        }

        return 0;

    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);

}