如何判断鼠标当前是否还在次区域内?(100分)

  • 主题发起人 主题发起人 Babyfloppy
  • 开始时间 开始时间
我是新手,这次因误操作没选择分数就发了,现在只剩下70分了,希望以后
我给的分少时各位也能帮忙.谢了.
其实我想作一个类似于主页的东东,如:mouse划过一个字时,那个字会变色,
鼠标变成handpoint,但我用label时,不能实现当mouse 不在该区域时把字再变
回去,各位能否帮我想个办法.
 
对了,最好还能让mouse在次区域时字突起,不在时恢复原样
 
是这个问题太简单了,没人肯回答?
 
MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave)
写一个 CM_MOUSEENTER/CM_MOUSELEAVE消息的处理程序
 
摘自http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=104640
 
thank you cytown, but
除了这个办法外,难道没有其他更简单的办法了么?
 
我有个办法,不知合不合你意,不过代码我要找一下,很久的东西了;)
 
如果仅仅是为判断是否在范围内,可以用PtInRect API来做!
 
>能实现当mouse 不在该区域时把字再变回去
代码如下:
unit testu;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, StdCtrls;
type
TForm1 = class(TForm)
SpeedButton1: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyLabel=class(Tlabel)
procedure CMMouseEnter(var Message: TMessage);
message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage);
message CM_MOUSELEAVE;
end;
var
Form1: TForm1;
implementation
var
ml:TMylabel=nil;
min:boolean=false;
{$R *.DFM}
procedure TMyLabel.CMMouseEnter(var Message: TMessage);
begin
inherited;
if not min then
begin
font.Style :=font.style+[fsUnderline];
min:=true;
Repaint;
end;
end;
procedure TMyLabel.CMMouseLeave(var Message: TMessage);
begin
inherited;
if min then
begin
font.Style :=font.style-[fsUnderline];
min:=false;
Invalidate;
end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if ml<>nil then
exit;
ml:=tmylabel.Create(self);
ml.parent:=form1;
ml.left:=50;
ml.top:=50;
ml.width:=50;
ml.height:=50;
ml.caption:='abcdefghijklmnopqrstuvwxyz';
ml.show;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if ml<>nil then
ml.free;
end;

end.
>对了,最好还能让mouse在次区域时字突起,不在时恢复原样
修改TMyLabel.CMMouseEnter为:
procedure TMyLabel.CMMouseEnter(var Message: TMessage);
var
PaintRect: TRect;
begin
inherited;
if not min then
begin
// font.Style :=font.style+[fsUnderline];
PaintRect := Rect(0, 0, Width, Height);
DrawEdge(Canvas.Handle, PaintRect, BDR_RAISEDINNER,
BF_RECT);
min:=true;
// Repaint;
end;
end;
试一试吧!
 
多人接受答案了。
 
后退
顶部