气泡提示实现(50分)

靴子

Unregistered / Unconfirmed
GUEST, unregistred user!
unit SherryHint;

interface

uses
Windows, Messages, Classes, Controls, Forms, CommCtrl;

type
THintWin=class(THintWindow)
private
FLastActive: Tpoint;
public
titlestr : string;
procedure ActivateHint(Rect:TRect;Const AHint:string);override;
end;

implementation

procedure AddTipTool(hWnd: DWORD; IconType: Integer; Title, Text: PChar);
const
TTS_BALLOON =$0040;
TTM_SETTITLE=WM_USER + 32;
var
hWndTip: DWORD;
ToolInfo: TToolInfo;
begin
hWndTip:=CreateWindow(TOOLTIPS_CLASS, nil,
WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP,
0, 0, 0, 0, hWnd, 0, HInstance, nil);
if (hWndTip<>0) then
begin
ToolInfo.cbSize:=SizeOf(ToolInfo);
ToolInfo.uFlags:=TTF_IDISHWND or TTF_SUBCLASS or TTF_TRANSPARENT;
ToolInfo.uId:=hWnd;
ToolInfo.lpszText:=Text;
SendMessage(hWndTip,TTM_ADDTOOL,1,Integer(@ToolInfo));
SendMessage(hWndTip,TTM_SETTITLE,IconType,Integer(Title));
end;
InitCommonControls();
end;

procedure THintWin.ActivateHint(Rect:TRect;const AHint:string);
begin
if (FLastActive.X<>Mouse.CursorPos.X) or (FLastActive.y<>Mouse.CursorPos.y) then

AddTipTool(WindowFromPoint(Mouse.CursorPos),1,PChar(titlestr), PChar(AHint));//Application.Hint));
FLastActive:=Mouse.CursorPos;
end;

initialization
Application.HintPause:=0;
Application.ShowHint:=False;
HintWindowClass:=THintWin;
Application.ShowHint:=True;
end.

以上是实现的语句。我想实现下面的功能,如果点击,就出现气泡提示,不点击时不出现。代码如下。
procedure TForm1.Panel1Click(Sender: TObject);
var
aa : THintWin;
bb : Trect;
Button: TMouseButton;
str : string;
begin
aa := THintWin.Create(self);
aa.titlestr := '时间:2006-12-1 9:00:00';
str :='4#:123456' ;
aa.ActivateHint(bb,str);
aa.Free;
end;

问题是:如果点击panel出现气泡提示后,以后只要鼠标移动到panel上,提示都会出现。由于对消息不熟悉,请教高手!
 
看了代码,好象是一个Hint
 
就是一个hint。哈哈~~有眼力
 
有没有人知道?我想实现这样的功能:只有单击要有提示的控件时才出现提示,鼠标在上边移动时不出现提示信息。
 
www.2ccc.com 上有现成的例子
自己去找
 
看来是我没有说清楚。上边的代码能够实现鼠标移动上面时,自动出现提示。但是我不想是鼠标移动出现提示的方式,而是想鼠标单击才出现提示,鼠标上面移动时不出现任何提示信息。
 
THintWindow 里有这样一个函数 ,应该是判断怎么捕捉事件的,重新写一个,修改事件应该可以解决问题(我没有测试)。
function THintWindow.IsHintMsg(var Msg: TMsg): Boolean;
begin
with Msg do
Result := ((Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST)) or
((Message = CM_ACTIVATE) or (Message = CM_DEACTIVATE)) or
(Message = CM_APPKEYDOWN) or (Message = CM_APPSYSCOMMAND) or
(Message = WM_COMMAND) or ((Message > WM_MOUSEMOVE) and
(Message <= WM_MOUSELAST)) or (Message = WM_NCMOUSEMOVE);
end;
 
起初创建时Application.ShowHint:=False;
加入MouseDown的消息或事件;
Application.ShowHint:=True;
sleep(2000);
Application.ShowHint:=False;
 
顶部