请提示:如何获得 在 无鼠标左键单击事件的控件上 单击鼠标左键处的鼠标坐标。(下含自写错误代码)

sup9527 2007-12-08 07:41:39
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, SHDocVw, ExtCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Timer1: TTimer;
Panel1: TPanel;
procedure CMMouseEnter(var Msg: TMessage); message WM_LBUTTONDOWN;
private
{ Private declarations }
public
{ Public declarations }
end;
type
TPanel1= class(TPanel)
procedure cCMMouseEnter(var Msg: TMessage); message WM_LBUTTONDOWN;
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.DFM}

procedure Tform1.CMMouseEnter(var Msg: TMessage);
var
anObject : TObject;
point:TPoint;
m:string;
begin

anObject := TObject(Msg.lParam);
if anObject <> nil then
begin
GetCursorPos(point);
m:='x:'+inttostr(point.X )+','+'y:'+inttostr(point.Y );
showmessage(m);
end;
end; /////////鼠标左键单击form1,成功获得showmessage提示。

procedure TPanel1.cCMMouseEnter(var Msg: TMessage);
var
anObject1 : TObject;
point1:TPoint;
m1:string;
begin

anObject1 := TObject(Msg.lParam);
if anObject1 <> nil then
begin
GetCursorPos(point1);
m1:='x:'+inttostr(point1.X )+','+'y:'+inttostr(point1.Y );
showmessage(m1);
end; //////////鼠标在控件 panel 上单击左键,不能获得showmessage提示。
end;

end.
//////////////不一定是panel,可以是任意一个没有鼠标单击事件的控件////////////////////////
//1.怎么获取鼠标在控件(没有鼠标单击左键事件)上单击左键时的鼠标坐标?
//2.我的思路是否争取,应该怎样考虑?
...全文
185 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sup9527 2007-12-17
  • 打赏
  • 举报
回复
感谢四楼的哥们 ,我现在知道了 我在弄一个派生类,该类有自己新加的 事件等。
刚起步不好意思啊。我以为我的分数都用完了所以。。。不好意思啊
8楼的哥们 你好像还没明白我的意思,单纯form1事件 我是知道的 ,换句话说 form1的mousemove 事件效果 怎么能让他也在 panel上表现出来?

所以我做了一个新的panel类 继承老panel类的所有东西,新加 消息过程cCMMouseEnter ,该过程可以 当监控的消息出现时候触发该过程。
DONKEY_1 2007-12-10
  • 打赏
  • 举报
回复
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
form1.Caption:=Pchar(IntToStr(X)+','+IntToStr(Y));
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Application.MessageBox(Pchar(IntToStr(X)),Pchar(IntToStr(Y)));
end;
这是完整代码,不过还是想说你太小气了
无条件为你 2007-12-10
  • 打赏
  • 举报
回复
分太少了,不过你的问题也太简单了。

你直接使用mouse.CursorPos.X和mouse.CursorPos.X即可,其中mouse是自带的全局变量。

你想说的还有一个是鼠标放上去的事件,而不是单击事件。这个事件早就有了,就是OnMouseEnter事件!
stgsd 2007-12-09
  • 打赏
  • 举报
回复
anObject1:=TObject(Msg.lParam);
因为Msg.lParam不是对象,
如果你声明anObject1:tpanel;
就可以写成anObject1:=tpanel(Msg.lParam);
其实在调用TPanel1.cCMMouseEnter(var Msg: TMessage); 时
ebx是控件指针,eax是self。
sup9527 2007-12-08
  • 打赏
  • 举报
回复
谢谢楼上的兄弟啊!
能解释下anObject1 := TObject(Msg.lParam);是什么意思么?
强制类型转换?
edongxu 2007-12-08
  • 打赏
  • 举报
回复
你只声明了这个自定义的类,没有创建啊,这个TPanel1
看你的Panel1: TPanel;就知道这个Panel1不是你定义的TPanel1



code=Delphi(Pascal)]
.................................
var
Form1: TForm1;
Panel1:TPanel1; //声明对象,你定义的TPanel1

implementation

procedure TForm1.FormCreate(Sender: TObject);//在主窗口创建事件中加入
begin
Panel1:=TPanel1.Create(self); //创建对象
Panel1.Parent := Form1;
end;
[[/code]

这样在窗口左上角就可以看到这个Panel了,这个Panel才有自定义的事件procedure TPanel1.cCMMouseEnter(var Msg: TMessage);
sup9527 2007-12-08
  • 打赏
  • 举报
回复
谢谢二楼的哥们 再仔细看下 谢谢!
三楼的哥们,anObject1 := TObject(Msg.lParam); 具体我也没查清楚,它结合上面的 东西,可以当鼠标 单击左键的时候 触发自定义事件 CMMouseEnter。

谢谢啊 继续等待大侠们的,哪怕是一个小小的提示!谢谢!
手指风 2007-12-08
  • 打赏
  • 举报
回复
anObject1 := TObject(Msg.lParam);
不知道你上面代码放在这干吗用,鼠标WM_LBUTTONDOWN的消息里已经包含了坐标了,你用GetCursorPos可能要经过转换的
stgsd 2007-12-08
  • 打赏
  • 举报
回复
procedure TForm1.Panel1Click(Sender: TObject);
begin
showmessage('a');
end;
//都有啊

16,746

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧