|
rent, idChild) ;
在CHECKER4中,整体变数idFocus用於保存目前输入焦点视窗的子视窗ID。我在前面说过,当您在子视窗上面单击滑鼠时,它们不会自动获得输入焦点。因此,CHECKER4中的父视窗将通过呼叫下面的函式来处理WM_SETFOCUS讯息:
SetFocus (GetDlgItem (hwnd, idFocus)) ;
这样设定一个子视窗为输入焦点。
ChildWndProc处理WM_SETFOCUS和WM_KILLFOCUS讯息。对於WM_SETFOCUS,它将保存在整体变数idFocus中接收输入焦点的子视窗ID。对於这两种讯息,视窗是无效的,并产生一个WM_PAINT讯息。如果WM_PAINT讯息画出了有输入焦点的子视窗,则它将用PS_DASH画笔的风格画一个矩形以表示此视窗有输入焦点。
ChildWndProc也处理WM_KEYDOWN讯息。对於除了Spacebar和Enter键以外的其他讯息,WM_KEYDOWN都将给父视窗发送讯息。另外,视窗讯息处理程式也处理类似WM_LBUTTONDOWN讯息的讯息。
处理方向移动键是父视窗的事情。在风格相似的CHECKER2中,此程式可获得有输入焦点的子视窗的x和y座标,并根据按下的特定方向键来改变它们。然後通过呼叫SetFocus将输入焦点设定给新的子视窗。
拦截滑鼠
一个视窗讯息处理程式通常只在滑鼠游标位於视窗的显示区域,或非显示区域上时才接收滑鼠讯息。一个程式也可能需要在滑鼠位於视窗外时接收滑鼠讯息。如果是这样,程式可以自行「拦截」滑鼠。别害怕,这么做没什么大不了的。
设计矩形
为了说明拦截滑鼠的必要性,请让我们看一下BLOKOUT1程式(如程式7-6所示)。此程式看起来达到了一定的功能,但它却有十分严重的缺陷。
程式7-6 BLOKOUT1 BLOKOUT1.C /*---------------------------------------------------------------------------- BLOKOUT1.C -- Mouse Button Demo Program (c) Charles Petzold, 1998 --------------------------------------------------------------- |