其它常用控件
单选按钮(Radio Button)和复选框(Check Box)是常见的Windows控件,用于从给出的选项中选择一项或多项
单选按钮是互斥的,只能选择其中一项;而复选框没有限制,可以选择一项或多项。
单选按钮和复选框都是一种特殊的按钮,窗口类名称都是button,只不过增加了一些特殊的窗口样式罢了。单选按钮的样式为BS_AUTORADIOBUTTON,复选框的样式为BS_AUTOCHECKBOX。例如:
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("女"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
60, 90, 40, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
//创建一个复选框
CreateWindow(
TEXT("button"), TEXT("复选框"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX/ *复选框* /,
95, 70, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
单选按钮一般是分组的,一组单选按钮之间是互斥的,只能选择其中一个。一个窗口可以包含多组单选按钮。
要想为单选按钮分组,可以增加WS_GROUP样式。设置了 WS_GROUP 样式的单选框为一组中的首元素,随后的所有单选按钮都和它在同一组,直到下一个设置了 WS_GROUP 样式的单选按钮。
请看代码:
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("男"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/| WS_GROUP,
10, 90, 40, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("女"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
60, 90, 40, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("黄色"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/| WS_GROUP,
10, 130, 60, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("蓝色"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
80, 130, 60, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
结果:
请看复选框:
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("吃"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
20, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("喝"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
75, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("拉"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
130, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("撒"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
185, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("黄"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
240, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
结果:
使用分组框控件(GroupBox)可以对单选按钮、复选框进行更好的分组.
分组框控件也是一种特殊的按钮,它的样式为BS_GROUPBOX,
m_GroupSex = CreateWindow(
TEXT("button"), TEXT("性别"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
2, 80, 160, 50,
hwnd, (HMENU)1, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("男"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/ | WS_GROUP,
10, 96, 60, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("女"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
80, 96, 60, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
需要注意的是:单选按钮的父窗口为分组框控件 hGroupSex,而不是顶级窗口 句柄hwnd。
完整代码如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
HDC hdc; //设备环境句柄
PAINTSTRUCT ps;
RECT rect;
//定义两个画刷,请定义为静态变量
static HWND m_btn;
static HFONT m_font;
static HBRUSH hSolidBrush;
static HBRUSH hHatchBrush;
static HBRUSH hBrush ;
static HWND m_edit1;
static HWND m_static1;
static HWND m_edit2;
static HWND m_static2;
static HWND m_GroupSex;
switch (message){
case WM_CREATE:
hSolidBrush = CreateSolidBrush(RGB(0, 100, 0));
hBrush = CreateSolidBrush(RGB(0x41, 0x96, 0x4F));
m_font = CreateFont(
-14/*高度*/, -7/*宽度*/, 0/*不用管*/, 0/*不用管*/, 400 /*一般这个值设为400*/,
FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,
DEFAULT_CHARSET, //这里我们使用默认字符集,还有其他以 _CHARSET 结尾的常量可用
OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管
DEFAULT_QUALITY, //默认输出质量
FF_DONTCARE, //不指定字体族*/
L"华文行楷" //字体名
);
m_static1 = CreateWindow(L"static", L"姓名:",
WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ ,
10, 10, 60, 30, hwnd, (HMENU)101, m_hinst, 0);
m_edit1 = CreateWindow(L"edit", L"",
WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/ | ES_AUTOHSCROLL | ES_LEFT,
80, 10, 150, 30, hwnd, (HMENU)102, m_hinst, 0);
m_static2 = CreateWindow(L"static", L"年龄:",
WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ /*带边框*/,
10, 45, 60, 30, hwnd, (HMENU)103, m_hinst, 0);
m_edit2 = CreateWindow(L"edit", L"",
WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/ | ES_AUTOHSCROLL | ES_LEFT,
80, 45, 150, 30, hwnd, (HMENU)104, m_hinst, 0);
m_btn = CreateWindow(L"button", L"确定",
WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/ | BS_CENTER | BS_VCENTER | BS_FLAT,
235, 12, 100, 60, hwnd, (HMENU)1001, m_hinst, 0);
m_GroupSex = CreateWindow(
TEXT("button"), TEXT("性别"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
2, 80, 160, 50,
hwnd, (HMENU)1, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("男"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/ | WS_GROUP,
10, 96, 60, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("女"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
80, 96, 60, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
m_GroupSex = CreateWindow(
TEXT("button"), TEXT("人物类型"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
2, 140, 160, 50,
hwnd, (HMENU)1, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("君子"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/| WS_GROUP,
10, 160, 60, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("小人"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
80, 160, 60, 26,
hwnd, (HMENU)1002, m_hinst, NULL
);
HWND m_GroupSex2 = CreateWindow(
TEXT("button"), TEXT("会什么"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
10, 200, 280, 60,
hwnd, (HMENU)1, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("吃"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
20, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("喝"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
75, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("拉"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
130, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("撒"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
185, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
CreateWindow(
TEXT("button"), TEXT("黄"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
240, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
//设置控件字体
SendMessage(
m_btn, //欲设置字体的控件句柄
WM_SETFONT, //消息名(消息类型)
(WPARAM)m_font, //字体句柄
NULL //传空值即可
);
//设置控件字体
SendMessage(
m_edit1, //欲设置字体的控件句柄
WM_SETFONT, //消息名(消息类型)
(WPARAM)m_font, //字体句柄
NULL //传空值即可
);
//设置控件字体
SendMessage(
m_edit2, //欲设置字体的控件句柄
WM_SETFONT, //消息名(消息类型)
(WPARAM)m_font, //字体句柄
NULL //传空值即可
);
break;
//窗口绘制消息
case WM_PAINT:
{
}
break;
case WM_CTLCOLORSTATIC:
{
HDC m_staticHdc = (HDC)wParam;
SetTextColor(m_staticHdc, RGB(255, 0, 0));
SetBkMode(m_staticHdc,TRANSPARENT);
return (INT_PTR)GetStockObject(NULL_BRUSH); //这里必须返回画刷句柄
}
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch (wmId)
{
case 1001: //按下按钮
//更改文本框的内容
{
wchar_t buf1[24] = {0};
GetWindowText(m_edit1,buf1,24);
wchar_t buf2[4] = { 0 };
GetWindowText(m_edit2, buf2, 4);
wchar_t buf3[32] = { 0 };
wsprintf(buf3,L"姓名:%s\n年龄:%s",buf1,buf2 );
MessageBox(NULL, buf3, TEXT("提示"), 0);
}
break;
default:
//不处理的消息一定要交给 DefWindowProc 处理。
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
break;
//窗口销毁消息
case WM_DESTROY:
//释放资源
DeleteObject(m_font);//删除创建的字体
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}