第七章 子窗口控件(上)
/**************************************************************************/
基础知识
通过呼叫GetParent,子窗口消息处理程序能确定其父窗口的窗口句柄:
hwndParent = GetParent (hwnd) ;
其中,hwnd是子窗口的窗口句柄。它可以向其父窗口消息处理程序发送消息:
SendMessage (hwndParent, message, wParam, lParam) ;
我们可以通过呼叫CreateWindow来建立一个按钮,我们所需要做的就是拦截wm_command消息来通知窗口消息处理程序。
在建立普通窗口时,首先定义窗口类别,并使用RegisterClass将其注册到Windows中,然后用CreateWindow命令依据该窗口类别建立一个普通窗口,从第三章开始,我们就是这么做的。但是,当您使用预先定义的某个控件时,不必为子窗口注册窗口类别,窗口类别已经存在于Windows之中,并且有一个预先定义的名字。CreateWindow中的窗口样式参数准确地定义了子窗口控件的外形和功能。Windows内建了处理发送给依据这些窗口类别建立的子窗口消息的窗口消息处理程序。
/**************************************************************************/
按钮类别
一共有十种基本的标准之窗口按钮控件。
单击按钮时,按钮就给父窗口消息处理程序发送一个wm_command消息。
下面是CreateWindow的原型
CreateWindow( class name,
Windows text,
Windows style,
X position,
Y positino,
Width,
Height,
Parent window handle,
Child window ID,
Instance handle,
Extro parameters)
在创建时,ID必须强制转化HMENU: (HMENU)id.
在呼叫CreateWindow之后,我们不必再为这些子窗口做任何事情,由Windows中的按钮窗口消息处理程序负责维护它们,并处理所有的重画工作(BS_OWNERDRAW样式的按钮例外,它要求程序绘制它)。在程序终止时,如果父窗口已经被清除,那么Windows将清除这些子窗口。
/********************************************************************************/
子窗口向父窗口发送消息
子窗口向父窗口发送wm_command消息时,wParam和lparam含义如下:
LOWORD(wParam) 子窗口ID
HIWORD(wParam) 通知码
lParam 子窗口句柄
常用的几个通知码的定义:BN_CLICKED 0; BN_DOUBLECLICKED 5;BN_SETFOCUS 6;BN_KILLFOCUS;
/***************************************************************************/
父窗口向子窗口发送消息
我们可以使用SendMessage(hwnd,msg,wparam,lparam)来向子窗口发送消息。
按钮消息同通常有以下几个:
BM_GETCHECK 取得按钮的选中标记
BM_SETCHECK 设定按钮的选中标记
BM_GETSTATE 得到按钮处于正常状态还是按下状态
BM_SETSTATE 设定按钮正常状态还是按下状态
BM_SETSTYLE 设定按钮风格
BM_CLICK (MSDN An application sends a BM_CLICK message to simulate the user clicking a button. This message causes the button to receive the WM_LBUTTONDOWN and WM_LBUTTONUP messages, and the button's parent window to receive a BN_CLICKED notification message.)
BM_GETIMAGE
BM_SETIMAGE
我们通过GetWindowLong来获得一些窗口的内容:
Id = GetWindowLong(hwndChild,GWL_ID);
知道id和父窗口句柄,就可以获得子窗口的句柄:
hwndChild = GetDlgItem(hwndParent,id);
/***********************************************************************/
按键
两种型态的按钮控件有两种窗口样式,分别叫做BS_PUSHBUTTON BS_DEFPUSHBUTTON,总体来说,两种控件的差别还是不大的。当鼠标按下时,按钮将会使用三维阴影重画自己,当鼠标释放按钮时,按钮就回复原来的样子,并向父窗口发送一个wm_command消息和BN_CLICKED通知码。
我们可以通过给窗口发送BM_SETSTATE消息来仿真按钮闪动:
SendMessage(hwndButton,BM_SETSTATE,1,0);
使用SendMessage(hwndButton,BM_SETSTATE,0,0)来让按钮回复正常。
/********************************************************************/
复选框
复选框是一个文字方块,功能如同一个开关:单击框一次显示勾选标记,再次单击清除勾选标记。
有两种常用样式;
BS_CHECKBOX
BS_AUTOCHECKBOX
在使用BS_CHECKBOX时,需要自己向该控件发送BM_SETCHECK来设定勾选标记。wParam参数为1时设定勾标记,设为0时清楚勾选标记。通过向该控件发送BM_GETCHECK消息,可以得到该复选框的目前状态。在处理来自控件的wm_command消息时,可以使用如下的指令来翻转X标记:
SendMessage((HWND)lParam,BM_SETCHECK,(WPARAM)
!SendMessage((HWND)lParam,BM_SETCHECK,0,0),0);
对于BS_AUTOBCHECKBOX样式,按钮将自己触发勾选标记的开关,我们可以不用处理wm_command消息,需要按钮目前的状态时,可以发送BM_GETSTATE消息:
iCheck = SendMessage(hwndButton,BM_GETCHECK,0,0);
当iCheck为非零时,则按钮被选中,否则不菲选中。
/*******************************************************/
可见的和启用的按钮
如果建立字窗口时,没有将WS_VISIBLE包含在窗口类别中,那么必须呼叫ShowWindow来显示子窗口:
ShowWindow(hwndChild,SW_SHOWNORMAL);
ShowWindow(hwndChild,SW_HIDE);
我们也可以使子窗口被启用和不被启用:
EnableWindow(hwndChild,TRUE);
EnableWindow(hwndChild,FALSE);