onhint 的问题(100分)

M

Marlowe

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现在鼠标移到一个Label构件上,Label的字体变为红色。
我试过用onmousemove事件,不过由于我的Label之间没有间隔
颜色怎么变回来呐?
所以,我想用onhint。
Pocedure TformMain.create(sender:Tobject);
begin
Application.Hint := DisplayHint;
end;

procedure TformMain.displayHint;
begin
Application.Font.color := clred;
end;

不过我不想所有的构件都变呀,那位有什么好办法?
另外,我听说有一种类似的构件,哪位有?

//抱拳一揖
 
T

tqz

Unregistered / Unconfirmed
GUEST, unregistred user!
这个简单,响应CM_MOUSEENTER 和CM_MOUSELEAVE事件
 
M

Marlowe

Unregistered / Unconfirmed
GUEST, unregistred user!
能不能再写详细一点,我一直对事件响应不了解
 
T

tqz

Unregistered / Unconfirmed
GUEST, unregistred user!
从TCustomLabel继承:
type

TMyLabel = class(TCustomLabel)
private
...
procedure MouseEnter(var Msg:TMessage);message CM_MOUSEENTER;
procedure MouseLeave(var Msg:TMessage);message CM_MOUSELEAVE;
...
end;

implementation

...

procedure TMyLabel.MouseEnter(var Msg:TMessage);
begin
Font.Color:=clRed;
...
Refresh;
end;

procedure TMyLabel.MouseLeave(var Msg:TMessage);
begin
Font.Color:=clblue;
...
Refresh;
end;

 

李颖

Unregistered / Unconfirmed
GUEST, unregistred user!
1、tqz的方法是响应Windows消息,
不是Delphi事件

2、TLabel.Color修改背景颜色,
Font.Color修改字体颜色,即前景颜色
两者结合效果更好
TLabel.Transparent为True时有透明效果

3、响应Windows消息的方法需要自己继承VCL组件,
对初学者不太方便,当然自己写组件时是很好的习惯。
在此问题我个人认为用以下方法解决更好:

a、Label1.OnMouseMove事件中修改颜色

b、虽然没有鼠标离开的事件,但可以在Form.OnMouseMove事件中解决

如下:
procedure TForm1.Label1MouseMove(Sender: TObject
Shift: TShiftState
X,
Y: Integer);
begin
Label1.Font.Color:=clRed;
end;

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

优点:简单

缺点:必须Form必须及时响应OnMouseMove事件,保证Label的颜色正确变化。


 

李颖

Unregistered / Unconfirmed
GUEST, unregistred user!
再多说几句
将两个Label设置为相同的文本,不同的颜色,
横向、纵向错开一个像素,Transparent设置为
True,可以得到不错的3D效果
 
Y

yifeng

Unregistered / Unconfirmed
GUEST, unregistred user!
private
procedure CMMouseLeave(var Msg: TMessage)
message CM_MOUSELEAVE;

implementation

procedure TCourseForm.CMMouseLeave(var Msg: TMessage);
var anobject:TObject;
begin
anObject := TObject(Msg.lParam);
if anObject <> nil then begin
{ First, you must find WHICH is the control }
{ the mouse cursor has just left, }
{ then, determine what action to do, etc... }
if anObject.classname='TPanel' then
begin
Label1.Font.Style:=[];
Label1.Font.Color :=clNavy;
end;
end;
end;
 
M

Marlowe

Unregistered / Unconfirmed
GUEST, unregistred user!
我正是因为不能及时响应Form.onmousemove才想用Onhint事件的。
不过这几天我试了另外一种方法,就是响应CM_MouseLeave事件,
算是达到了目的,感谢三位。
不过我还是想就Onhint问题进一步讨论一下,我觉得Onhint事件并不是
每次MouseEnter都触发,而是hint<>''时才触发。
 

李颖

Unregistered / Unconfirmed
GUEST, unregistred user!
Marlowe,为什么你的Form不能及时响应
OmMouseMove事件呢?是因为有Panel之类
的东西挡住了吗?

可以在你的Label的Container的OnMouseMove
事件里将颜色改回来啊,除非你的Label四
面八方都没有东西,直接就是其他程序的窗
口,不太可能吧?

我觉得总是可以将颜色该回来的。
 
M

Marlowe

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个Panel 上并排放了许多Label,所以不能用Panel.OnMouseMOve.
虽然我感兴趣的Onhint没弄明白,不过问题毕竟解决了。
在此感谢三位(tqz,yifeng和李颖).我还有一个300分的问题(MDI问题),
请大家继续帮忙。
谢。
 

Similar threads

回复
0
查看
647
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部