Thema: Delphi Vista Balloon Tip

Einzelnen Beitrag anzeigen

Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#30

Re: Vista Balloon Tip

  Alt 16. Mär 2008, 18: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
  Mit Zitat antworten Zitat