delphi에서 마우스가 컨트롤에 들어오거나 나가는 것에 응답하는 방법
3207 단어 delphi 개발
CM_MOUSEENTER = CM_BASE + 19; CM_MOUSELEAVE = CM_BASE + 20;
여기서 CMBASE = $B000
다음과 같은 두 가지 방법으로 사용할 수 있습니다.
방식 1: 사용자 정의 컨트롤에 응답 이벤트를 추가하여 실현
방식2: 창에 이벤트에 직접 응답하고 다른 컨트롤을 판단합니다
다음 코드는 인터넷에서 참고한 후에 수정하고 실행됩니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TMyPanel=class(tpanel)
public
procedure MSGEnter(var msg:TMessage);message CM_MOUSEENTER;//
procedure MSGLeave(var msg: TMessage);message CM_MOUSELEAVE;//
end;
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
procedure FormCreate(Sender: TObject);
private
MYpanel:TMyPanel;
panel:tpanel;
procedure MSGEnter(var msg:TMessage);message CM_MOUSEENTER;//
procedure MSGLeave(var msg: TMessage);message CM_MOUSELEAVE;//
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// :
{ TMyPanel }
procedure TMyPanel.MSGEnter(var msg: TMessage);
begin
Color:=clyellow;
end;
procedure TMyPanel.MSGLeave(var msg: TMessage);
begin
Color:=clred;
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
MyPanel:=TMyPanel.Create(self);
MyPanel.Parent:=self;
MyPanel.Caption:=' , ';
Panel:=TPanel.Create(self);
Panel.Parent:=self;
panel.top:=100;
end;
// :
procedure TForm1.MSGEnter(var msg: TMessage);
var
myobj : TObject;
begin
myobj := TObject(msg.LParam);// LParam
if (myobj <> nil) and (myobj is TPanel) then
TPanel(myobj).Caption := 'enter';
end;
procedure TForm1.MSGLeave(var msg: TMessage);
var
myobj : TObject;
begin
myobj := TObject(msg.LParam);
if (myobj <> nil) and (myobj is TPanel) then
TPanel(myobj).Caption := 'leave';
end;
end.
디자인 단계에서 응답을 위해 이벤트를 직접 추가하려면 컨트롤을 사용자 정의하고 시각화 컨트롤로 등록할 수 있습니다.
방법은 다음과 같습니다. (다음 코드는 테스트되지 않았습니다.)
unit MyEdit;
interface
uses
Classes, Controls, Messages, StdCtrls;
type
TMyEdit = class(TEdit)
private
FOnMouseLeave: TNotifyEvent;
FOnMouseEnter: TNotifyEvent;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
procedure CMMouseEnter(var Msg:TMessage);message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg:TMessage);message CM_MOUSELEAVE;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [TMyEdit]);
end;
{ TMyEdit }
procedure TMyEdit.CMMouseEnter(var Msg: TMessage);
begin
inherited;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;
procedure TMyEdit.CMMouseLeave(var Msg: TMessage);
begin
inherited;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
end.