먼저 소스입니다.unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ExtCtrls, jpeg ;
type
TCMMouseEnter = packed record
Msg: Cardinal;
Unused: Integer;
Sender: TControl;
Result: Longint;
end;
TCMMouseLeave = TCMMouseEnter;
TfrmCoolMain = class(TForm)
pnlCoolMain: TPanel;
SpeedButton1: TSpeedButton;
Image1: TImage;
procedure CMMouseEnter(var msg: TCMMouseEnter); message CM_MOUSEENTER;
procedure CMMouseLeave(var msg: TCMMouseLeave); message CM_MOUSELEAVE;
private
public
{ Public declarations }
end;
var
frmCoolMain: TfrmCoolMain;
implementation
{$R *.dfm}
procedure TfrmCoolMain.CMMouseEnter(var msg: TCMMouseEnter);
begin
if Assigned(Msg.Sender) then
begin
if Msg.Sender.Name = 'SpeedButton1' then
begin
SpeedButton1.Glyph.LoadFromFile('c:icon_01_02.bmp');
end;
end;
end;
procedure TfrmCoolMain.CMMouseLeave(var msg: TCMMouseEnter);
begin
if Assigned(Msg.Sender) then
begin
if Msg.Sender.Name = 'SpeedButton1' then
begin
SpeedButton1.Glyph.LoadFromFile('c:icon_01_01.bmp');
end;
end;
end;
end.
마우스가 버튼 위에 올라가면 스피드 버튼의 Glyph속성을 바꿔주는 소스입니다.
그런데 panel만 넣으면 작동을 안합니다.
panel없이 form위에 바로 button을 올려 놓을 경우 Msg.Sender가 butto이 되면서 잘 작동을 합니다.
하지만 form위에 panel을 올리고 그 위에 button을 올리면 버튼위에 마우스를 올려 놓아도
Msg.Sender가 button이 되는게 아니라 panel로 인식이 되네요.
뭐가 잘못된건지 모르겠습니다. T_T 아시는 분은 가르쳐 주세요.
이 방법이 아니라 다른 방법이라도 좋습니다.
panel위에 올려진 버튼위에 마우스가 올라가면 버튼의 이미지가 바뀌게 하는 방법을 알려주세요.
감사합니다.
전역변수
var
Wnd : TWndMethod;
procedure TForm1.WndProc(var Msg: TMessage);
begin
if Msg.Msg = CM_MOUSEENTER then
begin
ShowMessage('a');
end;
Wnd(Msg);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Wnd := Panel1.WindowProc;
Panel1.WindowProc:=WndProc;
end;