delphi限制鼠标移动的范围
限制鼠标移动的范围
有时为了操作方便,需要将鼠标的移动范围限制在一定区域内。本实例的窗体中有两个按钮,当单击第1 个按钮后,鼠标被限制在第2 个按钮上移动;当单击第2 个按钮后,鼠标可以在屏幕上自由移动。
函数ClipCursor 可以限定鼠标活动区域。该函数原型如下:
BOOL ClipCursor( CONST RECT *lpRect ) ;
其中参数RECT 为指向一个矩形区域的指针,坐标为屏幕坐标。如果设置为0,则鼠标可以在整个屏幕中自由移动。
因为ClipCursor 需要屏幕坐标作为参数,所以通过调用函数MapWindowPoints 将点相对坐标转换为屏幕坐标。该函数原型如下:
int MapWindowPoints(
HWND hWndFrom, // handle of window to be mapped from
HWND hWndTo, // handle of window to be mapped to
LPPOINT lpPoints, // address of structure array with points to map
UINT cPoints // number of structures in array
);
其中的4 个参数含义如下。
• hWndFrom:转换前作为坐标原点的窗体,如果为NULL 或HWND_DESKTOP 则表示屏幕。
• hWndTo:转换后作为坐标原点的窗体,如果为NULL 或HWND_DESKTOP 则表示屏幕。
• lpPoints:存储需要转换的点的数组地址。
• cPoints:需要转换的点的个数。
下面使用一个示例来说明如何限制鼠标移动位置。
(1)创建一个新的Delphi 项目,给窗体Form1 添加两个Button 组件,Caption 属性分别设定为“将鼠标限定在下面的按钮中移动”和“取消鼠标移动范围的限定”,按钮的名称保留默认值。
(2)响应“将鼠标限定在下面的按钮中移动”按钮的单击事件,代码如下:
//单击“将鼠标限定在下面的按钮中移动”限制鼠标移动范围
procedure TForm1.Button1Click(Sender: TObject);
var
rtButton2: TRect;
begin
//获取Button2 的坐标
rtButton2 := Button2.BoundsRect;
//将坐标转换为屏幕坐标
MapWindowPoints(handle, 0, rtButton2, 2);
//将鼠标移动的范围限制在Button2 按钮上
ClipCursor( @rtButton2 );
end ;
(3)响应“取消鼠标移动范围的限定”按钮的单击事件,代码如下:
//单击“取消鼠标移动范围的限定”按钮取消限制
procedure TForm1.Button2Click(Sender: TObject);
begin
//取消鼠标移动范围的限制
ClipCursor( 0 );
end;