TBalloonHint
'da 'x' (close) simgesi nasıl görüntülenir? TBalloonHint'te 'x' simgesini görüntüleme
TBalloonHint
'un yapamadığı şey değilse, ne kullanmalıyım?
TBalloonHint
'da 'x' (close) simgesi nasıl görüntülenir? TBalloonHint'te 'x' simgesini görüntüleme
TBalloonHint
'un yapamadığı şey değilse, ne kullanmalıyım?
Ö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:
Ç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
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 –
Ç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
Kapat düğmesi, temel Windows araç ipucu denetiminde "TTS_CLOSE" stilini ayarlayarak eklenir. Ancak bunu Delphi'de nasıl yapacağını bilmiyorum. –
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. –