Registriert seit: 2. Feb 2003
611 Beiträge
Delphi 2009 Professional
|
Re: Vista Balloon Tip
16. Mär 2008, 19:58
Moin,
So, ich denke das war's.
Hier ist nochmal eine etwas verbesserte Version meines vorherigen Tooltip-Codes (etwas erweitert) und dann des Rätsels Lösung - die fixierte Balloontip Box.
Da diese Box fixiert ist, wird ein Handle zurückgegeben, mit welchem man mit der Hide-Procedure selbiges wieder unsichtbar machen kann (denn es gibt nur 2 Wege: Entweder ein Klick auf einen etwaigen Close-Button, oder die Hide-Procedure).
Delphi-Quellcode:
type
TTOOLINFO = packed record
cbSize: Integer;
uFlags: Integer;
hwnd: THandle;
uId: Integer;
rect: TRect;
hinst: THandle;
lpszText: PWideChar;
lParam: Integer;
end;
const
TOOLTIPS_CLASS = 'tooltips_class32';
TTS_ALWAYSTIP = $01;
TTS_NOPREFIX = $02;
TTS_BALLOON = $40;
TTS_CLOSE = $80;
TTF_SUBCLASS = $0010;
TTF_TRANSPARENT = $0100;
TTF_CENTERTIP = $0002;
TTM_ADDTOOL = $0400 + 50;
TTM_SETTITLE = (WM_USER + 32);
ICC_WIN95_CLASSES = $000000FF;
function ShowBalloonTipFixed(AControl: TWinControl; AIcon: Integer;
ATitle: string; AText: WideString; ACloseButton: Boolean; X: Integer;
Y: Integer): THandle;
var
lToolInfo: TTOOLINFO;
lParentHandle: THandle;
lParameters: Cardinal;
begin
lParentHandle := AControl.Handle;
lParameters := WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP;
if ACloseButton then
begin
lParameters := lParameters or TTS_CLOSE;
end;
Result := CreateWindow(TOOLTIPS_CLASS, nil, lParameters,
0, 0, 0, 0, lParentHandle, 0, HInstance, nil);
if Result <> 0 then
begin
SetWindowPos(Result, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
lToolInfo.cbSize := SizeOf(lToolInfo);
lToolInfo.uFlags := TTF_TRANSPARENT or TTF_SUBCLASS or TTF_TRACK;
lToolInfo.hwnd := lParentHandle;
lToolInfo.lpszText := PWideChar(AText);
Windows.GetClientRect(lParentHandle, lToolInfo.rect);
SendMessage(Result, TTM_ADDTOOL, 1, Integer(@lToolInfo));
SendMessage(Result, TTM_SETTITLE, AIcon mod 4, Integer(PChar(ATitle)));
SendMessage(Result, TTM_TRACKPOSITION, 0, MakeLong(X, Y));
SendMessage(Result, TTM_TRACKACTIVATE, Ord(True), Integer(@lToolInfo));
end;
end;
function ShowBalloonTip(AControl: TWinControl; AIcon: Integer; ATitle: string;
AText: WideString; ACloseButton: Boolean; ACenterTip: Boolean): THandle;
var
lToolInfo: TTOOLINFO;
lParentHandle: THandle;
lParameters: Cardinal;
begin
lParentHandle := AControl.Handle;
lParameters := WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP;
if ACloseButton then
begin
lParameters := lParameters or TTS_CLOSE;
end;
Result := CreateWindow(TOOLTIPS_CLASS, nil, lParameters,
0, 0, 0, 0, lParentHandle, 0, HInstance, nil);
if Result <> 0 then
begin
SetWindowPos(Result, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
lToolInfo.cbSize := SizeOf(lToolInfo);
lToolInfo.uFlags := TTF_TRANSPARENT or TTF_SUBCLASS;
if ACenterTip then
begin
lToolInfo.uFlags := lToolInfo.uFlags or TTF_CENTERTIP;
end;
lToolInfo.hwnd := lParentHandle;
lToolInfo.lpszText := PWideChar(AText);
Windows.GetClientRect(lParentHandle, lToolInfo.rect);
SendMessage(Result, TTM_ADDTOOL, 1, Integer(@lToolInfo));
SendMessage(Result, TTM_SETTITLE, AIcon mod 4, Integer(PChar(ATitle)));
end;
end;
procedure HideBalloonTipFixed(AToolTip: THandle);
begin
SendMessage(AToolTip, TTM_TRACKACTIVATE, Ord(False), 0);
end;
Ich ärgere mich, denn das war genau mein letzter Gedanke, bevor ich mich dem C++ Code zugewandt hatte, welcher durch seine scheinbar identische Aufrufsprozeduren meine Theorie verworfen hatte.
Viel Spass damit & Grüße,
Max
Edit: Möglicherweise ist dieser Code ja was für die Code-Lib? Ich habe im Internet bis jetzt noch keine fixierte BalloonTip Funktion gefunden.
Hmm, mal sehen.
Max „If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
|