关于鼠标的实际位置(50分)

  • 主题发起人 主题发起人 touip
  • 开始时间 开始时间
T

touip

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
PopupMenu1.Popup(X, Y);
end;

问题是:如果form1不是最大化时,popupmenu1的位置与button1相差很远,

好象X,Y只是鼠标在form1的相对位置,而不是屏幕的真实位置,而

popupmenu1的popup参数是屏幕的真实位置,请问如何进行转换 --

有人告诉我 用TPOint类
然后调用GETCUSSORPOS方法
可我还是没能解决



 
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
FX, FY: integer;
begin
FX:= Form1.ClientLeft + X;
FY:= Form1.ClientTop + Y;
if Button = mbLeft then
PopupMenu1.Popup(FX, FY);
end;

 
popupmenu1.popup(Mouse.CursorPos.x,Mouse.CursorPos.y)

就可以了
 
其实这是屏幕坐标系和客户坐标系的关系而已,用ClientToScreen()就可以了。反之一样。
 
DELPHI6里有个例子写的很好
DELPHI6/DEMOS/Ipcdemos/
仔细的看看。
 
To silicon:
Form类没有ClientLeft和ClientTop属性
To lukee:
不行
 
在Delphi 中有一个鼠标位置映射函数
MapWindowPoints,你可以查看帮助
下面是调试成功的程序代码
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;

type
TForm1 = class(TForm)
Button1: TButton;
PopupMenu1: TPopupMenu;
dfgsd1: TMenuItem;
dfgsd2: TMenuItem;
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
x1,y1 :integer;
implementation

{$R *.dfm}
procedure MoveMouseIntoControl(AWinControl :TWinControl);
var
rtControl :TRect;
begin
rtControl :=AWinControl.BoundsRect;
MapWindowPoints(AwinControl.Parent.Handle,0,rtControl,2);
SetCursorPos(rtControl.Left,rtControl.top);
x1:=rtControl.Left;//重新定位好的鼠标x坐标
y1:=rtControl.Top;//重新定位好的鼠标y坐标
end;
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MoveMouseIntoControl(Button1);
if Button = mbLeft then
PopupMenu1.Popup(x1, y1);
end;

end.
 
ClientToScreen()参数最少,
MapWindowPoints不错,
感谢各位的回答
 
可以把SetCursorPos(rtControl.left,rtControl.top)这一行注释掉,这只是Cursor重定位
函数。
 
后退
顶部