delphi에서 마우스가 컨트롤에 들어오거나 나가는 것에 응답하는 방법

3207 단어 delphi 개발
Delphi는 Mouse Enter와 Mouse Leave의 이벤트가 없습니다. 인터넷에서 CM 에 응답할 수 있다고 합니다.MOUSEENTER 및 CMMOUSELEAVE 메시지가 표시됩니다.이 두 메시지는 VCL이 스스로 정의한 메시지입니다. Delphi의 Controls를 보았습니다.pas 역시 다음 두 줄이 있습니다.
  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.

 

좋은 웹페이지 즐겨찾기