请教大虾们一个问题!(50分)

  • 主题发起人 主题发起人 jiegong_swpi
  • 开始时间 开始时间
J

jiegong_swpi

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在C++builder中处理鼠标离开一个控件的事件。
如果要用windows的消息处理,如何做?
谢谢!
 
参考以下 delphi ,原理一样:
37. 再谈Leave事件
在孜孜的文章《TButton增加MouseLeave事件》中,谈到了 CM_MOUSELEAVE,这是一个Inprise公司中未归档的消息,发生于离开控件的时候;同样还有一个CM_MOUSEENTER消息,发生于进入控件时,因此我在下面编写了一个关于超链接的Label类。
unit ZeroLinkLabelUnit;
//Zero Studio Delphi Link Label Component
//panying@sina.com
//Version 1.1
{
Unit ZeroLinkLabelUnit
A label when click will lead to an url CopyRight 2001, Zero Studio
Web Site:http://zeroworld.533.net
or http://zeroworld.yes8.com
Version 1.1
New Feature:
When mouse move on label,the label will add underline.
Version 1.0
Initial Version
Attention:
This software is provided 'as-is', without any express or implied warranty. In no event will the author be held liable for any damages arising from the use of this software.
This unit is free to use but the origin of this software must not be misrepresented, you must not claim that you wrote the original software.
Feel free to use this component in your product including commercial applications.
If You alert this component's code to make it better, please remember to tell me about it , let's to make it better together.
This attention may not be removed or altered from any source distribution.
}
interface
uses Stdctrls,Classes,Controls,Forms,Windows,Graphics,ShellAPI,Messages;
type
TZeroLinkLabel=class(TLabel)
private
fUrl: string;
procedure LinkTo;
procedure ZeroMouseLeave(var Msg:TMessage);message CM_MOUSELEAVE;
procedure ZeroMouseEnter(var Msg:TMessage);message CM_MOUSEENTER;
procedure SetUrl(const Value: string);
protected
procedure Click;override;
published
property Url:string read fUrl write SetUrl;
public
constructor Create(AOwner: TComponent);override;
end;

procedure Register;
implementation
procedure Register;
begin

RegisterComponents('Samples', [TZeroLinkLabel]);
end;

{ TZeroLinkLabel }
procedure TZeroLinkLabel.Click;
begin

if not (csDesigning in ComponentState)and (fUrl <>'') then
LinkTo;
inherited Click;
end;


constructor TZeroLinkLabel.Create(AOwner: TComponent);
begin

inherited;
//set default font
Font.Color:=clBlue;
//set default cursor
Cursor:=crHandPoint;
end;

procedure TZeroLinkLabel.LinkTo;
begin

ShellExecute(Application.handle,'open',pchar(fUrl),nil,nil,SW_SHOWNORMAL);
end;

procedure TZeroLinkLabel.SetUrl(const Value: string);
begin

fUrl:=Value;
end;

procedure TZeroLinkLabel.ZeroMouseEnter(var Msg: TMessage);
begin

Font.Style:=Font.Style+[fsUnderLine];
end;

procedure TZeroLinkLabel.ZeroMouseLeave(var Msg: TMessage);
begin

Font.Style:=Font.Style-[fsUnderLine];
end;

end.

38. 为TButton增加MouseLeave事件(转载)
DELPHI等快速编程工具,使用最多的一定是各种控件了,用自带的控件编出的程序往往千篇一律,为了使自己的程序更个性化或者为了使控件的功能更强,我们需要自己编控件,大家不要以为自己编控件好难,看完这篇文章,保证人人都能编自己的控件,就算编不了控件,了解了解控件的原理也是不错的,就算不能了解控件的原理,学习学习……:)
首先,我们做的这个控件是为了给TBotton控件增加Mouseleave事件,有了这个事件,我们就可以编出类似网页中的悬停按钮的效果,首先打开Delphi,选Component|new Component出现对话框,我们的控件类名为Tbutton1,父类为Tbutton,库单元文件名为Button1。单击确定按钮,Component Wizard粗略的生成模板样式的代码,其中有类声明,全局变量声明及传递到RegisterComponent方法中的参数等,编译好的整个文件的
程序清单如下:
unit Button1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TButton1 = class(TButton)
private
FOnMouseLeave: TNotifyEvent;
procedure WZMouseLeave(var Msg:TMessage);
message CM_MOUSELEAVE;
{ Private declarations }
protected
  { Protected declarations }
public
{ Public declarations }
published
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
{ Published declarations }
end;

procedure Register;
implementation
procedure Register;
begin

//在系统中注册控件
RegisterComponents('Samples', [TButton1]);
end;

{ TButton1 }
procedure TButton1.WZMouseLeave(var Msg: TMessage);
begin

inherited;//继承父类
if csLButtonDown in ControlState then

begin

Self.MouseUp(mbLeft,[ssLeft],0,0);
end;
if Assigned (FonMouseLeave) then
FOnMouseLeave(Self);
end;

end.

代码添加完后,编译后,一个名为Button1的控件即加入Simples项中,新建一个项目,试试以下的代码:
procedure TForm1.Button11MouseMove(Sender: TObject;
Shift: TShiftState;
X, Y: Integer);
begin

label1.Caption:='在';
end;

procedure TForm1.Button11MouseLeave(Sender: TObject);
begin

label1.Caption:='不在';
end;

怎么样,是不很简单。(话后音:快,干嘛?试代码。)以上在Delphi5.0调试通过。
XJD注:其实OnEnter 和 OnExit 中对应的,表示焦点的进入和退出。
WM_MOUSEMOVE表示鼠标在控件上移动,这时肯定鼠标已进入控件。
CM_MOUSELEAVE是鼠标离开控件时的消息。消息的处理不一定要注册控件,也可按以下进行。
type
Mybtn=class(TButton)
procedure WZMouseLeave(var Msg:TMessage);
message CM_MOUSELEAVE;
procedure WZMousemove(var Msg:TMessage);
message WM_MOUSEMOVE;
public
end;
procedure Mybtn.WZMouseLeave(var Msg: TMessage);
begin
caption:='Out';
end;
procedure Mybtn.WZMousemove(var Msg: TMessage);
begin
caption:='In';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
bb:=mybtn.Create (self);
bb.parent:=self;
bb.visible:=true;
bb.left:=10; bb.top:=10;
bb.width:=50; bb.height:=50;
end;
 
兄弟,给个C++的如何?Dephi看起有点困难。
 
我把问题描述清楚一点:
我在一个Form上放了若干按钮,我想取得按钮的鼠标离开事件。现在我写如下代码:
在Form类中:
void __fastcall mouse(TMessage &amp;Message);
protected:
begin
_MESSAGE_MAP
MESSAGE_HANDLER(CM_MOUSELEAVE,TMessage,mouse)
END_MESSAGE_MAP(TForm)
有如下问题:
1.不能处理鼠标离开按钮的事件,只能处理Form。
2.将CM_MOUSELEAVE换成WM_MOUSELEAVE不工作。请问两者有什么区别。
谢谢!!!
 
应该从按钮中继承,然后再捕获,不然,写在FORM里就应该是FORM的捕获了。
 
coaco说得没错,
 
接受答案了.
 
后退
顶部