1.建立子视窗:
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) ;
代码中指明了建立的按键窗口(按钮)的文字,风格,大小,位置,ID hInstance 等信息,
并返回了NUM个窗口相对应的按钮句柄,建立窗口后,子窗口的所有信息都由window来维护,完成重绘工作等,当父视窗被销毁时,子视窗随着消失。
2.子视窗向父视窗发送消息:
子视窗向父视窗发送WM_COMMAND消息,
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_COMMAND, // the message to send
WPARAM wParam, // notification code and identifier(ID)
LPARAM lParam // handle to control (HWND) From Function CreateWindow
)
notification code:
BN_CLICKED
BN_DOUBLECLICKED
BN_DBLCLK
……
当子视窗(按钮)获得焦点时,所有键盘消息都会被屏蔽,除了sPaseBar 键,
3. 父视窗向子视窗发送消息
BM_GETCHECK 和 BM_SETCHECK 讯息由父视窗发送给子视窗控制项, 以取得或
者设定核取方块和单选按钮的选中标记。
按钮讯息 值
BM_GETCHECK 0x00F0
BM_SETCHECK 0x00F1
BM_GETSTATE 0x00F2
BM_SETSTATE 0x00F3
BM_SETSTYLE 0x00F4
BM_CLICK 0x00F5
BM_GETIMAGE 0x00F6
BM_SETIMAGE 0x00F7
4.每个子视窗控制项都由唯一的窗口句柄,和ID,知道二者之中的一个便可知道另一个的值。
id = GetWindowLong (hwndChild, GWL_ID) ;
hwndChild = GetDlgItem (hwndParent, id) ;
5.按钮:(PUSHBUTTON)
当滑鼠游标在按钮中时,按下滑鼠按键将使按钮用三维阴影重画自己,就好像真的被按下一样。放开滑鼠按键时,就恢复按钮的原貌,并父视窗发送一个 WM_COMMAND 讯息和 BN_CLICKED 通知码。与其他按钮型态相似,当按钮拥有输入焦点时,在文字的周围就有虚线,按下及释放 Spacebar 键与按下及释放滑鼠按键具有相同的效果。
以下的操作将导致按钮被按下:
SendMessage (hwndButton, BM_SETSTATE, 1, 0) ;
下面的呼叫使按钮恢复正常:
SendMessage (hwndButton, BM_SETSTATE, 0, 0) ;
6.复选框CHECKBOX
核取方块最常用的两种样式是 BS_CHECKBOX 和 BS_AUTOCHECKBOX ,当您需要按钮目前的状态时,可以向控制项发送 BM_GETCHECK 讯息:
iCheck = (int) SendMessage (hwndButton, BM_GETCHECK, 0, 0) ;
如果该按钮被选中,则 iCheck 的值为 TRUE 或者非零数;如果按钮末被选中,则 iCheck 的值为 FALSE 或 0。
7.单选框:(RADIOBUTTON)
当您收到来自单选按钮的 WM_COMMAND 讯息时, 应该向它发送 wParam 等於 1
的 BM_SETCHECK 讯息来显示其选中状态:
SendMessage (hwndButton, BM_SETCHECK, 1, 0) ;
对同组中的其他所有单选按钮,您可以通过向它们发送 wParam 等於 0 的BM_SETCHECK 讯息来显示其未选中状态:
SendMessage (hwndButton, BM_SETCHECK, 0, 0) ;
8.组合框(GROUPBOX)
样式为 BS_GROUPBOX , 用来包含其他的按钮控制项 ,它既不处理 键盘 鼠标消息,也不处理WM_COMMAND消息。
9. 改变按钮文字
您可以通过 SetWindowText 来改变按钮(或者其他任何视窗)内的文字:
SetWindowText (hwnd, pszString) ;
您也可以取得视窗目前的文字:
iLength = GetWindowText (hwnd, pszBuffer, iMaxLength) ; // iMaxLength 指定复制到 pszBuffer 指向的缓冲区中的最大字元数。
10.WM_SETFOCUS&&WM_KILLFOCUS
Windows 将输入焦点从一个视窗(例如一个父视窗)转换到另一个视窗(例如一个子视窗控制项)时,它首先给正在失去输入焦点的视窗发送一个 WM_KILLFOCUS 讯息, wParam 参数是接收输入焦点的视窗的代号。然後, Windows 正在接收输入焦点的视窗发送一个 WM_SETFOCUS 讯息,同时 wParam 是还在失去输入焦点的视窗的代号(在这两种情况中,wParam值可能为 NULL,它表示没有视窗拥有或者正在接收输入焦点。
通过处理 WM_KILLFOCUS 讯息, 父视窗可以阻止子视窗控制项获得输入焦点。
SetFocus(hwnd)后就会产生WM_SETFOCUS消息!
case WM_KILLFOCUS :
if (hwnd == GetParent ((HWND) wParam))
SetFocus (hwnd) ;
return 0 ;
11.SetClassLong( ) && GetClassLong ( )
改变WNDCLASSEX 结构的参数,例如改变窗口类的背景画刷,窗口过程WNDPROC
的地址 。。。
SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)
CreateSolidBrush (RGB (color[0], color[1], color[2]))) ;
Value :
GCL_HBRBACKGROUND
GCL_WNDPROC
GCL_HICON...
12.视窗子类别化:
用GetWIndowLong( ) 函数可以获得 WndProc 的地址,用SetWindowLong( )可以设定新的WndProc地址。它能让您给现存的视窗。讯息处理程式设定「挂勾」,以便在自己的程式中处理一些讯息,同时将其他所有讯息传递给旧的(原来的)视窗讯息处理程式。
代码如下:
OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], GWL_WNDPROC, (LONG) ScrollProc) ;
设定 hwndScroll[i] 的新窗口过程函数 为 ScrollProc(函数), 旧的窗口过程函数为 OldScroll[i] ,卷动列控制项是区别于窗口控制项(WndProc) 的过程函数,是卷动列的窗口处理过程!注意区别!