Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Vista Balloon Tip (https://www.delphipraxis.net/109822-vista-balloon-tip.html)

Prototypjack 15. Mär 2008 15:23

Re: Vista Balloon Tip
 
Moin,

So (aber das wussten wir ja schon ;) Dieser Code erzeugt leider nur das normale Balloon-Window):

Delphi-Quellcode:
procedure ShowBalloonTip(Control: TWinControl; Icon: integer; Title: pchar;
  Text: PWideChar);
const
  TOOLTIPS_CLASS = 'tooltips_class32';
  TTS_ALWAYSTIP = $01;
  TTS_NOPREFIX = $02;
  TTS_BALLOON = $40;
  TTF_SUBCLASS = $0010;
  TTF_TRANSPARENT = $0100;
  TTF_CENTERTIP = $0002;
  TTM_ADDTOOL = $0400 + 50;
  TTM_SETTITLE = (WM_USER + 32);
  ICC_WIN95_CLASSES = $000000FF;
type
  TOOLINFO = packed record
    cbSize: Integer;
    uFlags: Integer;
    hwnd: THandle;
    uId: Integer;
    rect: TRect;
    hinst: THandle;
    lpszText: PWideChar;
    lParam: Integer;
  end;
var
  hWndTip: THandle;
  ti: TOOLINFO;
  hWnd: THandle;
begin
  hWnd   := Control.Handle;
  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
    SetWindowPos(hWndTip, HWND_TOPMOST, 0, 0, 0, 0,
      SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    ti.cbSize := SizeOf(ti);
    ti.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS;
    ti.hwnd := hWnd;
    ti.lpszText := Text;
    Windows.GetClientRect(hWnd, ti.rect);
    SendMessage(hWndTip, TTM_ADDTOOL, 1, Integer(@ti));
    SendMessage(hWndTip, TTM_SETTITLE, Icon mod 4, Integer(Title));
  end;
end;
Aufruf:
Delphi-Quellcode:
ShowBalloonTip(Button1, 2, 'Empty Value!',
    'Please enter something, ANYTHING(!)' +sLineBreak + 'in the edit box!');
Grüße,
Max

delphin06 15. Mär 2008 15:24

Re: Vista Balloon Tip
 
Ach so meintest du das...ich dachte jez du hättest teile vom c++ code ind delphi umgeschrieben

delphin06 15. Mär 2008 16:25

Re: Vista Balloon Tip
 
Ich hab nochmal ein bisschen gegoogled und folgendes gefunden:

Vista Balloon Hints

So wie es aussieht entscheidet Vista welcher Balloon Style verwendet wird.

Zitat:

Based on my limited testing, the system seems to style the balloon using Style #1 when no windows are visible on the screen. If there is a window, it tends to use Style #2.

In dem C++ Code wird auch ein Fenster erstellt, was Transparent ist.

Man müsste jetzt wissen, nach welchen Kriterien Vista da vorgeht um jeweils den einen oder den anderen Style zu verwenden...

TurboMartin 15. Mär 2008 17:50

Re: Vista Balloon Tip
 
Hab grad was gefunden, was dir helfen kann: TTM_SETWINDOWTHEME hab ich in der CommCtrl.h gefunden


MS VisualStudio 05 - Hilfe

TTM_SETWINDOWTHEME Message

--------------------------------------------------------------------------------

Sets the visual style of a ToolTip control.

Syntax


To send this message, call the SendMessage function as follows.
lResult = SendMessage( // returns nothing in lResult (HWND) hWndControl, // handle to destination control (UINT) TTM_SETWINDOWTHEME, // message ID (WPARAM) wParam, // = 0; not used, must be zero (LPARAM) lParam // = (LPARAM) (LPWSTR) pwStr; );
Parameters

wParam
Must be zero.
pwStr
Pointer to a Unicode string that contains the ToolTip visual style to set.
Return Value

The return value is not used.

Remarks

Note To use this API, you must provide a manifest specifying Comclt32.dll version 6.0. For more information on manifests, see Using Windows XP Visual Styles.
Message Information

Header commctrl.h
Minimum operating systems Windows XP


--------------------------------------------------------------------------------

© 2005 Microsoft Corporation. All rights reserved.

Quelle: ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/shellcc/platform/commctls/tooltip/messages/ttm_setwindowtheme.htm

delphin06 15. Mär 2008 18:59

Re: Vista Balloon Tip
 
Ich komm da nich wirklich weiter und vergeude viel zu viel zeit damit...also wenn keiner eine Lösung hat dann lass ichs und nimm die normalen Balloon Tips...

Gruß

Garfield 16. Mär 2008 13:51

Re: Vista Balloon Tip
 
Der Beitrag hinter dem LInk
entspricht in etwa dem von Prototypjack geposteten. Der scheint einige Tests wert zu sein.

http://msdn2.microsoft.com/en-us/lib...52(VS.85).aspx

Saarpoint 16. Mär 2008 14:54

Re: Vista Balloon Tip
 
Wieso macht ihr euch so viel Arbeit?

Nutze doch einfach eine eigene Form welche unten rechts in der Ecke angezeigt wird.
Die meisten Entwickler machen das.
Erstens kannst du dann deine Inhalte (was und wie sie angezeigt werden) selbst gestalten und
kannst dir auch sicher sein, dass es auch angezeigt wird.
Die meisten Nutzer haben, entweder selbst oder über ein Tuning-Tool, die Balloons abgeschaltet.

Andreas

Garfield 16. Mär 2008 17:09

Re: Vista Balloon Tip
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht macht es Spass?

Prototypjack 16. Mär 2008 17:55

Re: Vista Balloon Tip
 
Zitat:

Zitat von Saarpoint
Wieso macht ihr euch so viel Arbeit?

Nutze doch einfach eine eigene Form welche unten rechts in der Ecke angezeigt wird.
Die meisten Entwickler machen das.
Erstens kannst du dann deine Inhalte (was und wie sie angezeigt werden) selbst gestalten und
kannst dir auch sicher sein, dass es auch angezeigt wird.
Die meisten Nutzer haben, entweder selbst oder über ein Tuning-Tool, die Balloons abgeschaltet.

Andreas

Wo wäre dann die Herausforderung? Und wichtiger noch: Wo wäre dann die Konformität zu den Vista-Standards?
Solche Geschichten wie dieses Tooltip hier sind einfach tolle, kleine Herausforderungen, denen man, ohne Termindruck oder etc. nachgehen kann. Es macht einfach Spaß ;)

Edit: Ich hab's!

Ich hätte es auch schon viel länger haben können, hätte ich mich nicht vom C++ Beispiel durcheinanderbringen lassen...

Ich baue das eben noch in handliche Funktionen um..

Prototypjack 16. Mär 2008 18:58

Re: Vista Balloon Tip
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz