子窗口可以向父窗口发送消息:首先调用hwndParent=GetParent(hwndchild)获取父窗口句柄
再调用函数SendMessage(hwndParent,message,wParam,lParam);
给父窗口发送消息
标准子窗口控件:按钮(button),复选框(check box),编辑框(edit box), 列表框(list box),组合框(combo box),文本字符串(text string) 和滚动条(scroll bar)。这些可以直接用CreateWindow函数创建,并捕获WM_COMMMAND就可以用。其他的一切都由Windows承担.
在使用预定义控件时,不需要注册相应子窗口的类。在调用CreateWindow函数时直接使用该名称作为窗口参数
1.按钮类
这个类的名称都是“button”,对应有10种不同的风格
BS_PUSHBUTTON
BS_DEFPUSHBUTTON
BS_CHECKBOX
BS_AUTOCHECKBOX
BS_RADIOBUTTON
BS_3STATE
BS_AUTO3STATE
BS_GROUPBOX
BS_AUTORADIOBUTTON
BS_OWNERDRAW
一般按钮的窗口样式包括WS_CHILD、WS_VISIBLE、和上面10种中的一种
//返回一个32位的值
//其中低位是字符宽度(x),高位是字符高度(y)
LONG GetDialogBaseUnits(void);
x=LOWORD(GetDialogBaseUnits());
y=HIWORD(GetDialogBaseUnits());
LOWORD(wParam) 控件ID
HIWORD(wParam) 通知码
lParam 子窗口句柄
//创建一个按钮
CreateWindow(L"button", L"BS_PUSHBUTTON", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 200, 100, hwnd, NULL, hInst, NULL);
其中的hInst可以是全局变量,也可以用((LPCREATESTRUCT)lParam)->hInstance这个来获取程序实例句柄还可以用(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE)。
/*
* 按钮通知码
*/
#define BN_CLICKED 0
#define BN_PAINT 1
#define BN_HILITE 2
#define BN_UNHILITE 3
#define BN_DISABLE 4
#define BN_DOUBLECLICKED 5
#if(WINVER >= 0x0400)
#define BN_PUSHED BN_HILITE
#define BN_UNPUSHED BN_UNHILITE
#define BN_DBLCLK BN_DOUBLECLICKED
#define BN_SETFOCUS 6
#define BN_KILLFOCUS 7
#endif /* WINVER >= 0x0400 */
/*
* 按钮控件消息
*/
#define BM_GETCHECK 0x00F0
#define BM_SETCHECK 0x00F1
#define BM_GETSTATE 0x00F2
#define BM_SETSTATE 0x00F3
#define BM_SETSTYLE 0x00F4
#if(WINVER >= 0x0400)
#define BM_CLICK 0x00F5
#define BM_GETIMAGE 0x00F6
#define BM_SETIMAGE 0x00F7
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0600)
#define BM_SETDONTCLICK 0x00F8
#endif /* WINVER >= 0x0600 */
#if(WINVER >= 0x0400)
#define BST_UNCHECKED 0x0000
#define BST_CHECKED 0x0001
#define BST_INDETERMINATE 0x0002
#define BST_PUSHED 0x0004
#define BST_FOCUS 0x0008
#endif /* WINVER >= 0x0400 */
例如:
case WM_CREATE:
CreateWindow(L"button", L"BS_PUSHBUTTON", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 200, 100, hwnd, NULL, hInst, NULL);
return 0;
case WM_COMMAND:
switch (HIWORD(wParam))
{
case BN_CLICKED:
MessageBox(NULL, L"按钮被点击了", L"", 0);
break;
default:
break;
}
获取子窗口ID:id=GetWindowLong(hwndchild,GWL_ID);
或者 id=GetDlgCtrlID(hwndchild);
知道子窗口ID和父窗口句柄后,可以得到子窗口的句柄:hwndchild=GetDlgItem(hwndParent,id);
发送一个WM_SETSTATE消息,可以模拟按键按钮的状态变化
比如下面的语句可以使按钮看上去像被按住一样
SendMessage(hwndButton,BM_SETSTATE,1,0);
//松开
SnedMessage(hwndButton,BM_SETSTATE,0,0);
复选框:
wParam参数设置为1会创建一个选中标记,设置为0则清除标记。
可以像控件发送BM_GETCHECK消息来获取复选框当前的被选择状态
iCheck=(int)SendMessage(hwndButton,BM_GETCHECK,0,0);
切换选中标记
SendMessage((HWND)lParam,BM_SETCHECK,(WPARAM)!SendMessage((HWND)lParam,BM_GETCHECK,0,0),0);
单选按钮:
单击一次选中,第二次单击不会改变其状态,只能通过发送消息使其状态改变
例如:
选中 :SendMessage(hwndButton,BM_SETCHECK,1,0);
取消选中:SendMessage(hwndButton,BM_SERCHECK,0,0);
改变按钮文本:
//要改变文本的窗口句柄,可以是任何窗口
BOOL SetWindowText
(
HWND hWnd, //窗口句柄
LPCTSTR lpString //字符串
);
SetWindowText(hwnd,pszString);
//获取一个窗口的当前文本
int GetWindowText(
HWND hWnd, //窗口句柄
LPTSTR lpString, //存放获取的缓冲区
int nMaxCount //最大字符数
);
iLength=GetWindowText(hwnd,pszBuffer,iMaxLength);
//获取一个窗口的文本长度
iLength=GetWindowTextLength(hwnd);
启用或禁用窗口:
隐藏窗口:ShowWindow(hwndchild,SW_HIDE);
判断窗口是否可见:IsWindowVisible(hwndchild);
禁用子窗口:EnableWindow(hwndchild,FALSE);
重新启用子窗口:EnableWindow(hwndchild,TRUE);