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 (未选中状态)
设置IDC_RADIO_BUTTON_0单选按钮选中状态,发送消息BM_SETCHECK,wParam参数为BST_CHECKED/BST_UNCHECKED ,IParam是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);
}
