如何让鼠标正好落在Grid上?(100分)

  • 主题发起人 主题发起人 帅义庭
  • 开始时间 开始时间

帅义庭

Unregistered / Unconfirmed
GUEST, unregistred user!
各位朋友:
我在编写一个矢量图编辑程序的过程中需要让在移动鼠标时让鼠标在任何
时候都能正好处在Grid的一个点上,就向autoCAD中选中Snape那样,另外如
何在画布上实现Grid栅格?
 
在 mousedown 事件中得到鼠标的位置,再找一个你所需要的最近的
点再选中不就行了吗。
 
SetCursorPos(x, y); 可以精确定位鼠标位置(x, y为屏幕坐标)
因此你可以在OnmouseMove中判断并置位.
可以在OnPaint事件中画Grid
 
定义一个全局的坐标变量OldP,其初始值为MouseDown里的X,Y,在MouseMove
的开始把当前鼠标位置与OldP对比,判断鼠标移动的方向,使Grid的Row
或者Col增减,Mouse完以后把当前鼠标位置赋给OldP.

用 MyGrid.CellRect(MyGrid1.Col,MyGrid1.Row)得到Cell的对Grid的相对
坐标,再加上Grid本身的Left和Top 偏移,获得Cell在Form上的相对坐标,
最后用ClientToScreen得到绝对坐标,然后SetCursorPos即可。
 
各位朋友:
procedure TfrmMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var p:TPOINT;
BEGIN
GetCursorPos(P);//取得光标位置
SetCursorPos(Round(p.x/10)*10,Round(p.y/5)*5);//光标移到10和5的
//整数倍上
end;

这样后我的程序启动特别慢,菜单需要2分钟才出来,而且运行过程中,鼠标移动极为
不灵活,请问哪位高手可帮我解决问题或有更好的方法实现其上功能?
 
当然了, 你要它在特定位置定位,看起来就一顿一顿的,就好象不灵活。
我想你该把它放在你要定位的控件上。

至于启动为什么慢了, 不清楚。
 
哪位朋友有较好的方法吗?
 
为什么慢? 很简单嘛. SetCursorPos又会触发WM_MOUSEMOVE消息, 然后又会调用
form.OnMouseMove事件.
死循环那有不慢的
 
多人接受答案了。
 
后退
顶部