|
ar图素高。那么每栏可填入的档案数就是:
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 |