其他控件的事件处理
在实际开发中,我们往往需要知道哪个按钮被选中了,才能进行下一步的操作。例如对于一组单选按钮,只有一个选项能被选中,最好的办法是将这组按钮作为参数传入一个函数,通过函数返回值判断哪个按钮被选中了。
但遗憾的是,在Windows中不能一次性获得一组按钮的选中状态,只能一个一个地遍历。复选框也是如此。
可以通过SendMessage函数发送BM_GETCHECK消息来获取按钮的选中状态,返回 BST_CHECKED 表示按钮被选中,返回 BST_UNCHECKED 是未被选中。
SendMessage 原型为:
LRESULT WINAPI SendMessage(
HWND hWnd, //窗口(控件)句柄
UINT Msg, //消息类型
WPARAM wParam, //附加消息1
LPARAM lParam //附加消息2
);
注意:发送 BM_GETCHECK 消息时,wParam 和 lParam 两个参数必须都为 0。
下面的代码会判断一个按钮是否被选中。如果被选中,那么会获取按钮文本并保存到缓冲区:
if( SendMessage(hCheckBox, BM_GETCHECK, 0, 0) == BST_CHECKED ){
GetWindowText(hCheckBox, szBuffer, 10);
}
请看代码:
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;
static TCHAR szBufSex[10] = {0}; //保存性别
static TCHAR szBufPeopleType[10] = { 0 }; //人物类型
static TCHAR szBufCanDo[100] = { 0 }; //会什么
static TCHAR szBufTemp[4] = { 0 }; //会什么
static HWND m_eatHwnd;
static HWND m_drinkHwnd;
static HWND m_laHwnd;
static HWND m_saHwnd;
static HWND m_YellowHwnd;
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)2, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("女"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
80, 96, 60, 26,
hwnd, (HMENU)3, m_hinst, NULL
);
m_GroupSex = CreateWindow(
TEXT("button"), TEXT("人物类型"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
2, 140, 160, 50,
hwnd, (HMENU)4, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("君子"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/| WS_GROUP,
10, 160, 60, 26,
hwnd, (HMENU)5, m_hinst, NULL
);
//创建一个单选按钮
CreateWindow(TEXT("button"), TEXT("小人"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
80, 160, 60, 26,
hwnd, (HMENU)6, 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
);
///创建一个复选框
m_eatHwnd = CreateWindow(
TEXT("button"), TEXT("吃"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
20, 220, 50, 26,
hwnd, (HMENU)8, m_hinst, NULL
);
///创建一个复选框
m_drinkHwnd = CreateWindow(
TEXT("button"), TEXT("喝"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
75, 220, 50, 26,
hwnd, (HMENU)9, m_hinst, NULL
);
///创建一个复选框
m_laHwnd = CreateWindow(
TEXT("button"), TEXT("拉"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
130, 220, 50, 26,
hwnd, (HMENU)10, m_hinst, NULL
);
///创建一个复选框
m_saHwnd = CreateWindow(
TEXT("button"), TEXT("撒"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
185, 220, 50, 26,
hwnd, (HMENU)11, m_hinst, NULL
);
///创建一个复选框
m_YellowHwnd = CreateWindow(
TEXT("button"), TEXT("黄"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
240, 220, 50, 26,
hwnd, (HMENU)12, 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);
if (wmEvent == BN_CLICKED)
{
switch (wmId)
{
//性别
case 2:
case 3:
GetWindowText((HWND)lParam, szBufSex, 10);
break;
//人物类型
case 5:
case 6:
GetWindowText((HWND)lParam, szBufPeopleType, 10);
break;
//会什么
case 8:
case 9:
case 10:
case 11:
case 12:
memset(szBufCanDo, 0, sizeof(szBufCanDo));
if (SendMessage(m_eatHwnd,BM_GETCHECK,0,0) == BST_CHECKED)
{
GetWindowText(m_eatHwnd, szBufTemp, 4);
wsprintf(szBufCanDo,L"%s,%s", szBufCanDo, szBufTemp);
}
if (SendMessage(m_drinkHwnd, BM_GETCHECK, 0, 0) == BST_CHECKED)
{
GetWindowText(m_drinkHwnd, szBufTemp, 4);
wsprintf(szBufCanDo, L"%s,%s", szBufCanDo, szBufTemp);
}
if (SendMessage(m_laHwnd, BM_GETCHECK, 0, 0) == BST_CHECKED)
{
GetWindowText(m_laHwnd, szBufTemp, 4);
wsprintf(szBufCanDo, L"%s,%s", szBufCanDo, szBufTemp);
}
if (SendMessage(m_saHwnd, BM_GETCHECK, 0, 0) == BST_CHECKED)
{
GetWindowText(m_saHwnd, szBufTemp, 4);
wsprintf(szBufCanDo, L"%s,%s", szBufCanDo, szBufTemp);
}
if (SendMessage(m_YellowHwnd, BM_GETCHECK, 0, 0) == BST_CHECKED)
{
GetWindowText(m_YellowHwnd, szBufTemp, 4);
wsprintf(szBufCanDo, L"%s,%s", szBufCanDo, szBufTemp);
}
break;
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);
TCHAR buf[128] = { 0 };
wsprintf(buf, L"%s\n性别:%s\n人物类型:%s\n会做:%s\n", buf3, szBufSex, szBufPeopleType, szBufCanDo);
MessageBox(NULL, buf, TEXT("提示"), 0);
}
break;
default:
break;
}
}
switch (wmId)
{
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);
}
结果: