아래처럼 하믄여 마우스가 라벨에 가믄 글짜색이 변하거든여
근데요 그 라벨을 판넬(panel)위에 올리면 작동을 하지 않는군여
흐흐흐
어케하야 할지 깜깜하군요..
도사님들의 하이테크닉을 부탁혀여~!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
private
{ Private declarations }
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
procedure ChangeColor(Sender: TObject; Msg: Integer);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WndProc(var Message: TMessage);
begin
// 콤포넌트에 마우스가 있으면(over) 폰트의 색상을 바꾼다
if Message.LParam = Longint(Label1) then
ChangeColor(Label1, Message.Msg);
inherited WndProc(Message);
end;
procedure TForm1.ChangeColor(Sender: TObject; Msg: Integer);
Begin
// 마우스가 Label위에 있을때
if Sender is TLabel then
begin
if (Msg = CM_MOUSELEAVE) then
(Sender as TLabel).Font.Color := clWindowText; // 마우스가 떠날때
if (Msg = CM_MOUSEENTER) then
(Sender as TLabel).Font.Color := clBlue; // 마우스가 들어올때
end;
end;
end.
> 아래처럼 하믄여 마우스가 라벨에 가믄 글짜색이 변하거든여
> 근데요 그 라벨을 판넬(panel)위에 올리면 작동을 하지 않는군여
> 흐흐흐
> 어케하야 할지 깜깜하군요..
> 도사님들의 하이테크닉을 부탁혀여~!
>
> unit Unit1;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> StdCtrls;
>
> type
> TForm1 = class(TForm)
> Label1: TLabel;
> Label2: TLabel;
> private
> { Private declarations }
> procedure WndProc(var Message: TMessage); override;
> public
> { Public declarations }
> procedure ChangeColor(Sender: TObject; Msg: Integer);
> end;
>
> var
> Form1: TForm1;
>
> implementation
> {$R *.DFM}
>
> procedure TForm1.WndProc(var Message: TMessage);
> begin
> // 콤포넌트에 마우스가 있으면(over) 폰트의 색상을 바꾼다
> if Message.LParam = Longint(Label1) then
> ChangeColor(Label1, Message.Msg);
> inherited WndProc(Message);
> end;
>
> procedure TForm1.ChangeColor(Sender: TObject; Msg: Integer);
> Begin
> // 마우스가 Label위에 있을때
> if Sender is TLabel then
> begin
> if (Msg = CM_MOUSELEAVE) then
> (Sender as TLabel).Font.Color := clWindowText; // 마우스가 떠날때
> if (Msg = CM_MOUSEENTER) then
> (Sender as TLabel).Font.Color := clBlue; // 마우스가 들어올때
> end;
>
> end;
>
> end.
임펠리테리입니다.
당연합니다. 보여주신 코드는 폼 자체가 LAbel의 직접 패어런트이기 때문에
가능한 것입니다. 폼의 메시지를 처리하는 WndProc() 함수를 오버라이드한거니까요.
패널위에 올렸다면 패널의 메시지를 받아서 처리해야 하는데, 폼이야 직접
프로젝트에서 폼클래스를 작성하니까 쉽지만 패널은 미리 만들어진 vcl 클래스이므로
좀 복잡해지죠.
간단히 트릭으로 해결하시는 건 어떨지?
먼저 레이블을 폼 위의 원하는 위치에 올립니다. 그리고 그 위에 패널을 올립니다.
레이블이 패널뒤로 가려져버렸죠? 패널에서 마우스 오른쪽 클릭을 하면
Send to back이란 메뉴가 있습니다. 이 항목을 클릭하면 패널이 레이블 뒤로
가면서 레이블이 패널 위에 있는 것처럼 보입니다.
그냥 단순한.. 시각적인 트릭이지만 효과는 똑같죠.
그럼 참고하시길...
임펠리테리 박지훈이었습니다.
(http://myhome.thrunet.com/~cbuilder)