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

| 图7-3 CHECKER1的萤幕显示 |
如果显示区域的宽度和高度不能被5整除,那么在显示区域的左边和下边将有一小条区域不能被矩形所覆盖。对於错误情况,CHECKER1通过呼叫MessageBeep回应此区域中的滑鼠按键操作。
当CHECKER1收到WM_PAINT讯息时,它通过GDI的Rectangle函式来重新绘制显示区域。如果设定了fState值,那么CHECKER1将使用MoveToEx和LineTo函式来绘制两条直线。在处理WM_PAINT期间,CHECKER1在重新绘制之前并不检查每个矩形区域的有效性,尽管它可以这样做。检查有效性的一种方法是在回圈中为每个矩形块建立RECT结构(使用与WM_LBUTTONDOWN处理程式中相同的公式),并使用IntersectRect函式检查它是否与无效矩形(ps.rcPaint)相交。