struct
{
int iStyle ;
TCHAR * szText ;
}button[] =
{
BS_PUSHBUTTON, TEXT ("PUSHBUTTON"),
BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"),
BS_CHECKBOX, TEXT ("CHECKBOX"),
BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"),
BS_RADIOBUTTON, TEXT ("RADIOBUTTON"),
BS_3STATE, TEXT ("3STATE"),
BS_AUTO3STATE, TEXT ("AUTO3STATE"),
BS_GROUPBOX, TEXT ("GROUPBOX"),
BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"),
BS_OWNERDRAW, TEXT ("OWNERDRAW")
} ;
以上是一个结构体数组,包含了Windows内定义的集中样式的按钮,包括button,checkbox,radiobox,groupbox
这几个按钮子控件,在主窗口的消息处理函数中,在处理WM_CREATE消息的时候,通过for循环建立
for (i=0 ; i<NUM ;i++)
hwndButton[i] = CreateWindow (TEXT("button"),
button[i].szText,
WS_CHILD | WS_VISIBLE | button[i].iStyle,
cxChar, cyChar * (1 + 2 * i),
20 * cxChar, 7 * cyChar / 4,
hwnd, (HMENU) i,
((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
return 0 ;
在创建完子窗口控件后,即调用CreateWindow后,我们就不必再为子控件做任何事了,任何消息都会由windows中的按钮窗口消息处理函数来维护它们,并处理所有重画的工作。(BS_OWNERDRAW样式的按钮例外,它要求程序绘制它,这些将在后面加以讨论)。
在程序终止时,如果父窗口已经被清除,那么Windows将清除这些按钮。
子窗口向父窗口发消息
用鼠标单击按钮时,子窗口控件就向其父窗口发送一个WM_COMMAND消息。父窗口的消息循环处理函数可以拦截WM_COMMAND消息,并进行处理。
当用鼠标单击按钮时,按钮文字的周围会有虚线,这表示该按钮拥有了输入焦点,所有键盘输入都将传送给子窗口控件,而不是传给父窗口。但是当按钮控件拥有输入焦点时,它将忽略所有的键盘输入,除了space键。space键与鼠标有相同的效果。
父窗口向子窗口发送消息
父窗口的消息处理函数也可以向子窗口控件发送消息。这些消息包括以前缀为WM的许多消息,此外WINUSER.h中还定义了8中按钮苏洪铭消息。
按钮消息 | 值 |
BM_GETCHECK | 0x00F0 |
BM_SETCHECK | 0x00F1 |
BM_GETSTATE | 0x00F2 |
BM_SETSTATE | 0x00F3 |
BM_SETSTYLE | 0x00F4 |
BM_CLICK | 0x00F5 |
BM_GETIMAGE | 0x00F6 |
BM_SETIMAGE | 0x00F7 |
BM_GETCHECK与BM_SETCHECK消息由父窗口发送给子窗口控件,以取得或者设定复选框和单选按钮的选中消息。BM_GETSTATE和BM_SETSTATE消息表示按钮处于正常状态还是按下状态。BM_SETSTYLE消息允许在按钮建立之后改变按钮的样式。
每个子窗口控件都具有一个在其兄弟中唯一的窗口句柄与ID值。对于此两者,知道一个就可以知道另外一个。如
id = GetWindowsLong(hWndChild,GWL_ID);
id = GetDlgCtrlID(hWndAChild);
虽然函数名Dlg部分指的时对话框,但实际上这是一个通用的函数。
知道ID与父窗口句柄,就能获得子窗口的句柄
hWndChild = GetDlgItem(hWndParent,id);