2014-10-08 17 views
8

TBalloonHint'da 'x' (close) simgesi nasıl görüntülenir? TBalloonHint'te 'x' simgesini görüntüleme

enter image description here

Ben programlı forma sistem tepsisinde bildirimler gibi görünen bir balon ipucu bir kontrol yakın görüntülemek istiyor. Bu TBalloonHint'un yapamadığı şey değilse, ne kullanmalıyım?

+1

Kapat düğmesi, temel Windows araç ipucu denetiminde "TTS_CLOSE" stilini ayarlayarak eklenir. Ancak bunu Delphi'de nasıl yapacağını bilmiyorum. –

+3

TBalloonHint, bir Windows araç ipucu denetimini silen "TCustomHint" türetmesinden kaynaklanır, ancak "TBalloonHint", "TTS_CLOSE" gerektiren "TTS_BALLOON" stilini kullanmaz. 'TBalloonHint', Windows söz konusu olduğunda aslında bir tane olmaksızın bir balon araç ipucunu taklit eden özel bir araç ipucudur. TBalloonHint'ten türetebilir ve kendi kapatma düğmenizi çizmek için PaintHint() işlevini geçersiz kılabilirsiniz, ancak yine de bir düğme gibi davranmayacaktır. –

cevap

7

Öncelikle ipucunu göstermek için bir prosedür gerekir:

uses 
    CommCtrl; 

// hWnd - control window handle to attach the baloon to. 
// Icon - icon index; 0 = none, 1 = info, 2 = warning, 3 = error. 
// BackCL - background color or clDefault to use system setting. 
// TextCL - text and border colors or clDefault to use system setting. 
// Title - tooltip title (bold first line). 
// Text - tooltip text. 

procedure ShowBalloonTip(hWnd: THandle; Icon: integer; BackCL, TextCL: TColor; 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; 
begin 
    hWndTip := CreateWindow(TOOLTIPS_CLASS, nil, WS_POPUP or TTS_CLOSE 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); 
    if BackCL <> clDefault then 
     SendMessage(hWndTip, TTM_SETTIPBKCOLOR, BackCL, 0); 

    if TextCL <> clDefault then 
     SendMessage(hWndTip, TTM_SETTIPTEXTCOLOR, TextCL, 0); 

    SendMessage(hWndTip, TTM_ADDTOOL, 1, integer(@ti)); 
    SendMessage(hWndTip, TTM_SETTITLE, Icon mod 4, integer(Title)); 

    //TTM_TRACKACTIVATE => Makes sure you have to close the hint you self 
    SendMessage(hWndTip, TTM_TRACKACTIVATE, integer(true), integer(@ti)); 
    end; 
end; 

Sonra diyoruz:

ShowBalloonTip(Button1.Handle, 4, clDefault, clRed, 'Baloon Title', 'Baloon text'); 

İpucu: Eğer hWnd (örn Hız Düğmeler veya diğer grafik yoksa bileşen) veya başka bir yerde balonun TTM_SETTITLE sonra TTM_TRACKPOSITION mesajını göndermesini istiyorsanız.

***** DÜZENLEME *****

Bu aynı zamanda bir Sınıf yardımcı

unit ComponentBaloonHintU; 

interface 
uses 
    Controls, CommCtrl, Graphics; 

{$SCOPEDENUMS ON} 

type 
    TIconKind = (None = TTI_NONE, Info = TTI_INFO, Warning = TTI_WARNING, Error = TTI_ERROR, Info_Large = TTI_INFO_LARGE, Warning_Large = TTI_WARNING_LARGE, Eror_Large = TTI_ERROR_LARGE); 
    TComponentBaloonhint = class helper for TWinControl 
    public 
    procedure ShowBalloonTip(Icon: TIconKind; const Title, Text: string); 
    end; 

implementation 
uses 
    Windows; 

{ TComponentBaloonhint } 

procedure TComponentBaloonhint.ShowBalloonTip(Icon: TIconKind; const Title, Text: string); 
var 
    hWndTip: THandle; 
    ToolInfo: TToolInfo; 
    BodyText: pWideChar; 
begin 
    hWndTip := CreateWindow(TOOLTIPS_CLASS, nil, WS_POPUP or TTS_CLOSE or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP, 0, 0, 0, 0, Handle, 0, HInstance, nil); 

    if hWndTip = 0 then 
    exit; 

    GetMem(BodyText, 2 * 256); 

    try 
    ToolInfo.cbSize := SizeOf(TToolInfo); 
    ToolInfo.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS; 
    ToolInfo.hWnd := Handle; 
    ToolInfo.lpszText := StringToWideChar(Text, BodyText, 2 * 356); 
    SetWindowPos(hWndTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); 
    ToolInfo.Rect := GetClientRect; 

    SendMessage(hWndTip, TTM_ADDTOOL, 1, integer(@ToolInfo)); 
    SendMessage(hWndTip, TTM_SETTITLE, integer(Icon), integer(PChar(Title))); 
    SendMessage(hWndTip, TTM_TRACKACTIVATE, integer(true), integer(@ToolInfo)); 
    finally 
    FreeMem(BodyText); 
    end; 
end; 

end. 
sahip bir ünite yaratmak bir sınıf yardımcı

İlk yoluyla yapılabilir

Ardından, şu numarayı arayın:

+1

Çok güzel! Delphi'nin daha yeni sürümlerinde (XE5 kullanıyorum) Unicode sürümleri olmadığından bu sabitleri ve TOOLINFO kaydını kullanmamanız gerektiğini unutmayın. Doğru olanlar şimdi CommCtrl'de tanımlanmıştır. SendMessage'daki tamsayı kadroları, aynı zamanda wparam ve lparam oyuncularına da değiştirilmelidir. – MarkF

+1

Güncellemeniz için teşekkür ederiz @MarkF Bir bileşen oluşturmayı düşünüyordum ve daha sonra listelediğim sorunları düzeltebiliyorum –

+1

Çok iyi çalışıyor. Windows Vista ve daha yeni sürümlerde şu simgeleri de kullanabiliriz: 4 = TTI_INFO_LARGE, 5 = TTI_WARNING_LARGE, 6 = TTI_ERROR_LARGE (http://msdn.microsoft.com/en-us/library/windows/desktop/bb760414(v=vs. 85) .aspx) – Pol

İlgili konular