在自己做的控件包含2个别的控件,怎么响应不同的MOUSEMOVE过程?(100分)

  • 主题发起人 主题发起人 hukaijt
  • 开始时间 开始时间
H

hukaijt

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个控件,是从CUSTOMECONTROL继承来的,里面要有2个LABEL,
现在遇到的问题是,我要鼠标移动到每个LABEL上的时候都有不同
的响应,这个过程在新做的控件里应该怎么写呢?谢谢大家!
 
从CustomControl继承不好吧,应该从TWinControl继承
当MouseMove的时候,用TWinControl.ControlAtPos得到鼠标下的控件(TControl)
然后就可以做你的事情了
 
Label的OnMouseMove事件中有一个参数Sender,你试试用如下代码来判断一下:
if (TLabel(Sender)=Label1) then
...
else if (TLabel(Sender)=Label2) then
...
 
创建 Label 时对它们的 MouseMove 事件先赋值

TYourControl = class(TCustomControl)
...
private
procedure SubMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
public
constructor Create(AOwner: TComponent); override;
end;

implememtation
...
constructor TYourControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FLabel1 := TLabel.Create(Self);
FLabel1.Parent := Self;
FLabel1.OnMouseMove := SubMouseMove;
...
FLabel2 := TLabel.Create(Self);
FLabel2.Parent := Self;
FLabel2.OnMouseMove := SubMouseMove;
...
end;

procedure TYourControl.SubMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
Point: TPoint;
begin
with TControl(Sender).Parent do
if Assign(OnMouseMove) then
begin
Point.x := X;
Point.y := Y;
ScreenToClient(TControl(Sender).ClientToScreen(Point));
OnMouseMove(Sender, Shift, Point.x, Point.y);
end;
end;
...
然后可以在 YourControl 的 MouseMove 事件中照教父说的那样去区分Label。
 
bbkxjy说的是个好思路,要不干脆就写两个SubMouseMove,这样最简单了。
 
教父:具体如何写,谢谢!
 
bbkxjy不是已经说得很清楚了吗?你只要再定义一个SubMouseMove就行了

procedure SubMouseMove1(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Showmessage('这是Label1');
end;

procedure SubMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Showmessage('这是Label2');
end;

然后在OnCreate中:
FLabel1.OnMouseMove:=SubMouseMove1;
FLabel2.OnMouseMove:=SubMouseMove2;

呵呵,这样是不是很简单啊?这个功劳要记在bbkxjy身上 :)
 
多人接受答案了。
 
后退
顶部