efWindowProc (hwnd, message, wParam, lParam) ; }
图7-3是CHECKER1的显示。程式画的25个矩形的宽度和高度均相同。这些宽度和高度保存在cxBlock和cyBlock中,当显示区域大小发生改变时,将重新对这些值进行计算。WM_LBUTTONDOWN处理过程使用滑鼠座标来确定在哪个矩形中按下了键,它在fState阵列中标志目前矩形的状态,并使该矩形区域失效,从而产生WM_PAINT讯息。

如果显示区域的宽度和高度不能被5整除,那么在显示区域的左边和下边将有一小条区域不能被矩形所覆盖。对於错误情况,CHECKER1通过呼叫MessageBeep回应此区域中的滑鼠按键操作。
当CHECKER1收到WM_PAINT讯息时,它通过GDI的Rectangle函式来重新绘制显示区域。如果设定了fState值,那么CHECKER1将使用MoveToEx和LineTo函式来绘制两条直线。在处理WM_PAINT期间,CHECKER1在重新绘制之前并不检查每个矩形区域的有效性,尽管它可以这样做。检查有效性的一种方法是在回圈中为每个矩形块建立RECT结构(使用与WM_LBUTTONDOWN处理程式中相同的公式),并使用IntersectRect函式检查它是否与无效矩形(ps.rcPaint)相交。
使用键盘模拟滑鼠
CHECKER1只能在装有滑鼠情况下才可执行。下面我们在程式中加入键盘介面,就如同第六章中对SYSMETS程式所做的那样。不过,即使在一个使用滑鼠游标作为指向用途的程式中加入键盘介面,我们还是必须处理滑鼠游标的移动和显示问题。
即使没有安装滑鼠,Windows仍然可以显示一个滑鼠游标。Windows为这个游标保存了一个「显示计数」。如果安装了滑鼠,显示计数会被初始化为0;否则,显示计数会被初始化为-1。只有在显示计数非负时才显示滑鼠游标。要增加显示计数,您可以呼叫:
要减少显示计数,可以呼叫:
您在使用Sho |