超简单问题,高手请进,在线急等之……(10分)

  • 主题发起人 主题发起人 lcmlhs
  • 开始时间 开始时间
L

lcmlhs

Unregistered / Unconfirmed
GUEST, unregistred user!
Tbitbtn按钮,当鼠标移到上面时,按钮字体变色,移出时变回原来的颜色,请高手指点……,在线急等之!!!!
 
关键是当鼠标移下来时,怎么写代码??
 
在其他控件的事件里写还原
 
这样不好吧,怎样写呢?
 
方法1:重新继承个bitbtn,响应CM_MOUSEENTER、CM_MOUSELEAVE消息并产生事件
然后再事件里写代码,简单方便,但是要生成新控件

TMyBitBtn = class(TBitBtn)
private
FOnMouseEnter:TNotifyEvent;
FOnMouselevel:TNotifyEvent;
procedure CMMouseEnter(var msg:TMessage);message CM_MOUSEENTER;
procedure CMMouseLeave(var msg:TMessage);message CM_MOUSELEAVE;
protected
{ Protected declarations }
public
Constructor Create(AOwner:TComponent);override;
Destructor Destroy;override;
published
property OnMouseEnter:TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouselevel:TNotifyEvent read FOnMouselevel write FOnMouselevel;
end;

implementation

procedure TMySkinSizeButton.CMMouseEnter(var msg: TMessage);
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TMySkinSizeButton.CMMouseLeave(var msg: TMessage);
begin
if Assigned(FOnMouselevel) then FOnMouselevel(Self);
inherited
end;

constructor TMySkinSizeButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;

destructor TMySkinSizeButton.Destroy;
begin
inherited Destroy ;
end;

方法2:在ApplicationEvents1.OnMessage事件里判断鼠标位置.....麻烦 而且效率低
 
这样的话,小弟以前做的按钮都要换成这样的啦,可是按钮好多噢……
 
这个其实很简单,代码如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
bitbtn1.Font.Color:= clred;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
bitbtn1.Font.Color:= clwindowtext;
end;

end.
 
如果bitbtn1是在窗体上,那么最后一个过程是窗体的,如果是在别的控件上,则最后一个过程要改成别的控件的。
 
MouseMove 事件
 
是的,只是这一个事件。
 
好,谢谢大家,散分了,多谢各位,小弟有礼了了了了了
to xxagri:
我没有想到form的onmousemove事件,哈哈,散分
 
lcmlhs兄,智人千虑,必有一失。
 
5? 怎么还是我的分高.....

我再补充下哈~用FormMouseMove确实简单.....不过有个缺点:如果需要变颜色的button比较多,就需要在FormMouseMove里把每个button的字体颜色都恢复.....那样以后维护就变的麻烦喽~
而且,如果需要变色的button的容器不是form,就需要在他们各自的容器里都要写mousemove事件.....相比之下,还是重新封装个控件比较方便,可以使用统一的事件代码来修改颜色,维护也简单的多
 
那就要看实际情况,哪个代码比较少就用哪个,但我看大多情况还是用MouseMove比较简单。
 
to khs-kill:救 我,不幸被 你言中了,呀:

procedure TMyBitBtn.CMMouseEnter(var msg: TMessage);
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
Self.Font.Color:=clblue;
end;

procedure TMyBitBtn.CMMouseLeave(var msg: TMessage);
begin
if Assigned(FOnMouselevel) then FOnMouselevel(Self);
inherited ;
Self.Font.Color:=clblack;
end;
我的问题是:在设计时也变颜色,就是怎样在创建按钮时把它的颜色默认为黑色呀,当运行时有效果就行了……
 
有没有人啊
 
哦 哈哈 加2行代码 把设计阶段屏蔽掉:

procedure TMyBitBtn.CMMouseEnter(var msg: TMessage);
begin
if not (csDesigning in ComponentState) then begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
Self.Font.Color:=clblue;
end;
end;

procedure TMyBitBtn.CMMouseLeave(var msg: TMessage);
begin
if not (csDesigning in ComponentState) then begin
if Assigned(FOnMouselevel) then FOnMouselevel(Self);
inherited ;
Self.Font.Color:=clblack;
end;
end;
 
你是个高手,小弟佩服!!!!!!!!!!!
 
to hs-kill:
你是个高手,以后要多多请教你啦
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
851
DelphiTeacher的专栏
D
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部