Delphi-PRAXiS

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)

delphin06 8. Mär 2008 12:02


Vista Balloon Tip
 
Hi

Ich wollte ganz gerne in meinem Programm Balloon Tips verwenden. Da ich mit dem JvTrayIcon arbeite würde das ja ganz einfach z.B. über den Aufruf von

Delphi-Quellcode:
jvtrayicon1.BalloonHint('titel', 'text', btinfo, 5000, true);
gehen.

Das würde dann den Standard Balloon anzeigen. Ich will aber lieber den Ballon im Vista Design.
Nach einigem Suchen in den Delphi Foren bin ich dann auf folgenden Link gestoßen:

Vista Balloon

Das ist genau das was ich brauche. Allerdings ist das Beispiel in C geschrieben und ich kann kein C. Bevor ich mich da anmelde und mir das mal anschaue, wollte ich deshlab erstmal hier nachfragen.

Also weiß Jemand wie ich diesen Vista Balloon realisieren kann?

Danke schonmal


Gruß

Assertor 8. Mär 2008 13:02

Re: Vista Balloon Tip
 
Hallo delphin06,

ich verstehe Deine Frage nicht ganz. Du sprichts von Balloonhints, aber der Link zeigt ein Tooltip. Das sind doch zwei unterschiedliche Dinge.

Was genau suchst Du, das BalloonHint für das TrayIcon der TNA ist afaik bei TTrayIcon automatisch im Vista Stil. Die Tooltips sicher nicht, hier gibt es immernoch keinen Ansatz von Codegear. Hierzu habe ich vor langer Zeit mal ein QC Ticket eröffnet, steht aber noch auf Open. Mal sehen ob Tiburón hier was neues bringt.

Das Problem ist hier, daß alle HintWindow nicht die Tooltips Class von Win verwenden, sondern ein eigenes borderless Window in der Forms.pas der VCL definiert wird.

Möglich ist ein override mittels HintWindowClass.

Gruß Assertor

delphin06 8. Mär 2008 13:37

Re: Vista Balloon Tip
 
Liste der Anhänge anzeigen (Anzahl: 2)
Also ich mein schon das was da gezeigt wird. Ich habe gedacht das wäre ein balloon tip.

Ich hab mich jetzt mal da angemeldet und mir den code angeschaut. Allerdings versteh ich den nicht so ganz. Wie gesagt ich kann kein C. Ich habe mal die Sachen in den Anhang gepackt. vieleicht kann den code ja jemand für Delphi übersetzen.

delphin06 9. Mär 2008 14:09

Re: Vista Balloon Tip
 
Kann mir denn keiner weiter helfen? Schade..

Garfield 10. Mär 2008 19:03

Re: Vista Balloon Tip
 
So etwas sollte es in Delphi geben. Zumindest benutzt ImgBurn solche Tooltips und das ist wohl in Delphi geschrieben.

Achso vielleicht:
http://www.delphitricks.com/source-c...i_program.html
http://www.swissdelphicenter.ch/de/showcode.php?id=1587
http://www.delphipraxis.net/internal...t.php?p=579456
http://delphiportal.de/326-balloon-tooltips-erstellen
http://www.michael-puff.de/Developer...orials_pdf.pdf
http://www.delphi3000.com/articles/article_3504.asp
http://www.koders.com/delphi/fid2C11...3F7678C82.aspx

delphin06 12. Mär 2008 16:19

Re: Vista Balloon Tip
 
Danke dir..allerdings sind die ersten Links schonmal nicht das was ich suche. diese zeigen nur die normalen Balloon Hints an. Aber die wollte ich ja gar nich (die funktionieren bei mir auch) Ich wollte diese Vista Hints haben die mehr so eckig sind und nicht so abgerundet

Aber ich guck mir die anderen mal genauer an und wenn der Richtige dabei ist, dann sag ich bescheid

Garfield 12. Mär 2008 17:45

Re: Vista Balloon Tip
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die Vista Hints bekommst Du unter Vista, unter XP sind es eben nur die XP Hints. Zumindest habe ich bei der Demo auch nur die abgerundeten.

delphin06 12. Mär 2008 19:27

Re: Vista Balloon Tip
 
Liste der Anhänge anzeigen (Anzahl: 2)
nee bei Vista gibt es die abgerundeten auch noch!
Aber es gibt auch diese neuen Hints.

Im Anhang hab ich mal screenshots. Wenn ich einmal auf Test klicke bekomme ich den runden Balloon und wenn ich auf OK klicke bekomme ich den Vista Balloon den ich auch haben will :)

Ich weiß nich vieleicht kann da jemand was rausfinden aus dem code. is ja in C geschrieben.

Garfield 13. Mär 2008 19:12

Re: Vista Balloon Tip
 
Bei mir sehen beide gleich aus.

In dem Artikel steht, dass die Common Controls Version 6 benötigt werden. Bei mir ist eine 5er comctl32.dll unter Windows\System32 zu finden. Mehrere 6er Versionen finden sich in den Verzeichnissen vom Windows Update. Ist wohl der Grund, weshalb der Vista Hint nicht funktioniert.
Manifest Resources

Dann müssen sicher noch die Parameter für CreateWindowEx angepasst werden.

delphin06 15. Mär 2008 09:31

Re: Vista Balloon Tip
 
Jo unter Windows XP SP2 sehen bei mir auch beide gleich aus. Ich hab mir mal den c-code genauer angeschaut aber irgendwie werde ich daraus nich schlau...Ich bin schon kurz davor das einfach sein zu lassen...Dann nimm ich halt die normalen Ballons

TurboMartin 15. Mär 2008 13:54

Re: Vista Balloon Tip
 
Schau doch mal hier.

Prototypjack 15. Mär 2008 14:08

Re: Vista Balloon Tip
 
Moin,

Ich bin völlig unerfahren wenn es um C++ geht, aber ich denke mir ist da etwas aufgefallen:

Das Beispielprogramm ist in der Lage beide Hints aufzurufen (entweder mit OK, oder mit Test), jedoch führen, soweit ich den Code verstehe, beide zu einem nahezu identischen Aufruf:

Code:
// Soweit ich das verstanden habe, ist das hier der OK-Btn-Code (TTestDlg.cpp, Line 36)
CBalloonMsg::ShowForCtrl( IDS_ERR_TITLE, IDS_ERR_BODY, &m_ctrlEdit, (HICON) 2 );
Code:
// Und das hier der Test-Btn-Code (TTestDlg.cpp, Line 106)
CBalloonMsg::ShowForCtrl( _T("Test Title"), _T("Test Text"), &m_ctrlEdit, (HICON) 1 );
Egal ob eine gesonderte Klasse oder was-auch-immer dahinter steht und den Aufruf verarbeitet, woher soll das Ding wissen, welchen Hint es aufrufen soll?

Ich bin zugegeben etwas verwirrt.

Grüße,
Max

Die Muhkuh 15. Mär 2008 14:22

Re: Vista Balloon Tip
 
Imho wird das durch den letzten Parameter bestimmt:

(HICON) 2 bzw. (HICON) 1

Prototypjack 15. Mär 2008 14:29

Re: Vista Balloon Tip
 
Moin,

Das glaube ich nicht. Zumindest kann ich keine Unterscheidung zwischen den Icons im Code erkennen.

Außerdem könnte man scheinbar auch direkt ein Handle übergeben:
Code:
void CBalloonMsg::Show( LPCTSTR lpszHdr, LPCTSTR lpszBody, LPPOINT pPt /*= NULL*/, HICON hIcon /*= NULL*/ )
// hIcon can be actual icon handle or when running on XP SP2 or better
// the following special UINT values may be used:
//      1 : Info icon.
//      2 : Warning icon
//      3 : Error Icon
Grüße,
Max

Die Muhkuh 15. Mär 2008 14:37

Re: Vista Balloon Tip
 
Also im ersten der beiden von Dir geposteten Codes steht "(HICON) 2" und im zweiten "(HICON) 1".

Ich sehe da schon einen Unterschied, beim ersten ist es ein Info-Icon, beim zweiten ein Warnung-Icon.

Stimmt ja auch mit den Bildern überein.

Prototypjack 15. Mär 2008 14:41

Re: Vista Balloon Tip
 
Moin,

Ja, klar. Aber: Die Erscheinungsform des Balloonhints (nämlich entweder "eckig" oder "normal") kann ja nicht an dem Icon festgemacht sein, oder?

Grüße,
Max

Die Muhkuh 15. Mär 2008 14:44

Re: Vista Balloon Tip
 
Sorry, dann hab ich Dich falsch verstanden. Ich dachte Du redest vom Icon und nicht von der Form des Hints. :oops:

delphin06 15. Mär 2008 14:45

Re: Vista Balloon Tip
 
Das muss doch schon fast abhängig von den icons sein...was ich allerdings komisch finde. Also das Control is immer das Edit Feld. und ansonsten is der Text nur unterschiedlich (Aber daran kann es nun wirklich nicht liegen)

Man müsste die icons mal wechseln...

Prototypjack 15. Mär 2008 14:53

Re: Vista Balloon Tip
 
Moin,

Ich würde das ja probieren, aber die MFC fehlt im Visual C++ Express 2008.

Aber daran kann es einfach nicht liegen. Wenn doch, dann gebe ich eine Bar-Runde auf der USS-Delphi-PRAXiS.

Grüße,
Max

Edit: Ich habe es auch in Delphi probiert. Das Icon macht dort zumindest keinen Unterschied. Ebenso wenig, wie die Stringlänge und die Anzahl der Zeilenumbrüche im Text (naja, hätt' ja sein können :mrgreen: )

delphin06 15. Mär 2008 15:15

Re: Vista Balloon Tip
 
Wie würde das denn aussehen in delphi code?

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.

delphin06 17. Mär 2008 15:58

Re: Vista Balloon Tip
 
Durch Zufall is es mir so in die Hände gefallen. Ich habe die Jedi TrayIcon Komponente auf meiner Form weil das Programm eben nur im Tray angezeigt werden soll (oder fast nur).

Diese Komponente hat ja auch eine Balloon Tip funktion. Ich hatte mich schon damit abgefunden, dass ich die normalen Balloon Tips verwende.
ich wollte dann den Text der angezeigt wird in 2 Zeilen haben und siehe da ... oh Wunder ... der Balloon Tips ist auf einmal im Vista Style! Unglaublich...

Wenn ich den Text einzeilig mache, wird wieder der normale Balloon angezeigt..Also es funktioniert jetzt genau so wie ich wollte und alles ist super!

Gruß

Garfield 18. Mär 2008 06:11

Re: Vista Balloon Tip
 
Zitat:

Zitat von delphin06
ich wollte dann den Text der angezeigt wird in 2 Zeilen haben und siehe da ... oh Wunder ... der Balloon Tips ist auf einmal im Vista Style! Unglaublich...

In dem oben von Dir verlinkten Thread im Microsoft-Forum wurde eben dies hinterfragt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 Uhr.

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