iNumInCol = cyClient / cyChar ;
接收到一个滑鼠单击讯息後,您就能从lParam获得cxMouse和cyMouse座标。然後可以用下面的公式来计算使用者所指的是哪一列的档案名:
iColumn = cxMouse / cxColWidth ;
相对於列顶端的档案名位置为:
iFromTop = cyMouse / cyChar ;
现在您就可以计算szFileNames阵列的下标:
iIndex = iColumn * iNumInCol + iFromTop ;
如果iIndex超过了阵列中的档案数,则表示使用者是在显示器的空白区域内按滑鼠按键。
在许多情况下,命中测试要比本例更加复杂。在显示一幅包含许多小图形的图像时,您必须决定要显示的每个小图形的座标。在命中计算中,您必须从座标找到物件。但这将在使用不确定字体大小的字处理程式中变得非常凌乱,因为您必须找到字元在字串中的位置。
范例程式
程式7-2所示的CHECKER1程式展示了一些简单的命中测试,此程式把显示区域分为5×5的25个矩形。如果您在某个矩形中按下滑鼠按键,那么在该矩形中将出现一个「X」。如果您再按一次,那么「X」将被删除。
程式7-2 CHECKER1
CHECKER1.C
/*-------------------------------------------------------------------------
CHECKER1.C -- Mouse Hit-Test Demo Program No. 1
(c) Charles Petzold, 1998
--------------------------------------------------------------------------*/
#include <windows.h>
#define DIVISIONS 5
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{ static TCHAR szAppName[] = TEXT ("Checker1") ;
H
CHECKER1.C
/*-------------------------------------------------------------------------
CHECKER1.C -- Mouse Hit-Test Demo Program No. 1
(c) Charles Petzold, 1998
--------------------------------------------------------------------------*/
#include <windows.h>
#define DIVISIONS 5
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{ static TCHAR szAppName[] = TEXT ("Checker1") ;
H