Der vorherige Artikel führt die einfache Anwendung von Hinweis vor. Dieser Artikel gibt ein Beispiel für das Anpassen von Hinweisfenstern. Dieses benutzerdefinierte Hinweisfenster hat einen guten Effekt mit Glas als Rand und Schatteneffekt.
Vorher müssen wir jedoch vorstellen, wie man es anpasst. Schauen wir uns mehrere virtuelle Methoden an, CreateParams setzt den Stil des Fensters, wir möchten ihn so überschreiben, dass es keine Grenzen hat. NCPAINT zeichnet den Rand des Fensters, und wir müssen ihn auch abdecken, da wir den Rand nicht brauchen. Farbe ist wichtiger, daher muss sie im Inhalt des Clientbereichs des Hinweisfensters behandelt werden. Das Wichtigste ist jedoch ActivateHint, das die Größe des Fensters festlegt und es hier anpasst. Die Implementierung dieser Klasse ist unten angegeben:
Einheit wdhintwnd;
Schnittstelle
Verwendung
Windows, Klassen, Steuerelemente, Grafiken, Formulare, Systeme, extctrls;
Typ
TwdHintwnd = class (Thintwindow)
Privat
Fwndbmp: tbitmap;
FHINTBMP: TBITMAP;
geschützt
Prozedur CreateParams (var Params: TCreateParams);
Verfahrensfarbe;
Verfahren NCPaint (DC: HDC);
{Zeichnen Sie die Bildaufforderung}
Prozedur DrawHintimg (BMP: tbitmap; Ahint: String);
{Holen Sie sich das Bild des Desktop -Bereichs, der dem Eingabeaufforderungfenster entspricht}}
Prozedur getDesktopimg (BMP: tbitmap; R: Trect);
{Behandeln Sie das Bild des Desktopbereichs, damit es wie ein Stück Glas mit etwas Schatten aussieht.}
Verfahrensefforthandle (WNDBMP, Hintbmp: tbitmap);
öffentlich
Konstruktor create (aowner: tcomponent);
Zerstörer zerstören;
Prozedur ActivateHint (RECT: TRECT; const Ahint: String);
Ende;
Durchführung
{TwdHintwnd}
Verfahren twdHintwnd.Activatehint (rect: trect; const ahint: string);
var
P: tpoint;
Beginnen
// Erhalten Sie eine entsprechende Größe, um den Text hier anzuzeigen
FHINTBMP.WIDTH: = RECT.Right - Rect.Left;
FHINTBMP.HEITH: = RECT.Bottom - Rect.Top + 4;
DrawHintimg (FHINTBMP, AHINT);
Fwndbmp.width: = rect.Right - rect.left + 23;
Fwndbmp.height: = rect.bottom - rect.top + 27;
Inc (Rect.Right, 23);
Inc (Rect.Bottom, 27);
BoundsRect: = rect;
Wenn links <screen.desktopleft dann links
Links: = screen.desktopleft;
Wenn Top <screen.desktoptop dann
Oben: = screen.desktoptop;
wenn links + breit> screen.desktopwidth dann
Links: = screen.desktopwidth - width;
Wenn obere + Höhe> Bildschirm.DesktOpHEight dann
Oben: = screen.desktOpHEight - Höhe;
GetDesktopimg (fwndbmp, boundsRect);
Effecthandle (FWNDBMP, FHINTBMP);
P: = clientToscreen (Punkt (0, 0));
SetWindowpos (Handle, hwnd_top meiste, px, py, 0, 0,
Swp_showwindow oder swp_noActivate oder swp_nosize);
Ende;
Konstruktor TwdHintwnd.create (Aowner: tcomponent);
Beginnen
geerbt;
Fwndbmp: = tbitmap.create;
Fwndbmp.pixelformat: = pF24bit;
FHINTBMP: = tbitmap.create;
Ende;
Prozedur TwdHintwnd.CreateParams (var Params: tCreateParams);
Beginnen
geerbt;
// Entfernen Sie den Fensterrand
Params.style: = params.style und nicht ws_border;
Ende;
Destructor TwdHintwnd.Destroy;
Beginnen
Fwndbmp.free;
FHINTBMP.FREE;
geerbt;
Ende;
procedure twdHintwnd.getDesktopimg (BMP: tbitmap; r: trect);
var
C: tcanvas;
Beginnen
C: = tcanvas.create;
versuchen
C.Handle: = getdc (0);
Bmp.canvas.copyrect (rect (0, 0, bmp.width, bmp.height), c, r);
Endlich
C.Free;
Ende;
Ende;
procedure twdHintwnd.effectHandle (Wndbmp, Hintbmp: tbitmap);
var
R: Trect;
Ich, J: Ganzzahl;
P: PByTearray;
Transst, transstangle: Ganzzahl;
Beginnen
R: = rect (0, 0, wndbmp.width - 4, wndbmp.height - 4);
Frame3D (Wndbmp.canvas, R, CloMedgray, Clbtnshadow, 1);
// Seien Sie ein Schatteneffekt unter dem Fenster
Transst: = 60;
für j: = wndbmp.height - 4 bis wndbmp.height - 1 do
Beginnen
P: = wndbmp.scanline [j];
Transstangle: = transst;
für i: = 3 bis wndbmp.width - 1 tun
Beginnen
// Wenn es sich in der unteren rechten Ecke befindet
Wenn i> wndbmp.width - 5 dann
Beginnen
P [3*i]: = P [3*i]*transstangle div 100;
P [3*i + 1]: = P [3*i + 1]*transstangle div 100;
P [3*i + 2]: = P [3*i + 2]*transstangle div 100;
Transstangle: = transstangle + 10;
Wenn transstangle> 90 dann transstangle: = 90;
Ende
sonst beginnen
P [3*i]: = P [3*i]*transst div 100;
P [3*i + 1]: = P [3*i + 1]*transst div 100;
P [3*i + 2]: = P [3*i + 2]*transst div 100;
Ende;
Ende;
Transst: = transst + 10;
Ende;
// Seien Sie ein Schatteneffekt auf der rechten Seite des Fensters
für J: = 3 bis wndbmp.height - 5 Do
Beginnen
P: = wndbmp.scanline [j];
Transst: = 60;
für i: = wndbmp.width - 4 bis wndbmp.width -1 do
Beginnen
P [3*i]: = P [3*i]*transst div 100;
P [3*i + 1]: = P [3*i + 1]*transst div 100;
P [3*i + 2]: = P [3*i + 2]*transst div 100;
Transst: = transst + 10;
Ende;
Ende;
Wndbmp.canvas.draw (10, 10, Hintbmp);
Ende;
procedure twdHintwnd.ncpaint;
Beginnen
// laden nicht nach und lassen Sie die Randzeichnung nicht zuzuladen
Ende;
procedure twdhintwnd.paint;
Beginnen
Canvas.copyct (ClientRect, fwndbmp.canvas, clientRect);
Ende;
procedure twdHintwnd.drawHintimg (bmp: tbitmap; ahint: string);
var
R: Trect;
Beginnen
Bmp.canvas.brush.color: = application.Hintcolor;
Bmp.canvas.pen.color: = application.Hintcolor;
Bmp.Canvas.Rectangle (0, 0, Bmp.width, Bmp.Height);
Bmp.canvas.font.color: = screen.Hintfont.Color;
R: = rect (0, 0, bmp.width, bmp.height);
Inc (R.Left, 2);
Inc (R.Top, 2);
DrawText (bmp.canvas.handle, pchar (ahint), -1, r, dt_left oder dt_noprefix oder
Dt_wordbreak oder DrawTextBidimodeFlagsreadingonly);
Ende;
Initialisierung
Application.showHint: = false;
HintwindowClass: = TwdHintwnd;
Application.ShowHint: = true;
Ende.
Fügen Sie das Gerät einfach zu Ihrem Projekt hinzu und führen Sie das Programm aus, um den Effekt zu sehen.
Die wichtigen Teile des Programms wurden kommentiert, und hier sind nur einige wichtige Punkte, zunächst die Initialisierung
Setzen Sie hier zum Teil die Show der Anwendung auf False, schauen Sie sich den VCL -Quellcode an und wissen Sie, dass die Anwendung einen Hinweiswindow zerstört hat, und die Definition von HintwindowClass ist wie folgt:
ThintwindowClass = Klasse von Thintwindow;
HintwindowClass: ThintwindowClass = Thintwindow;
Hier ersetzen wir es durch TwdHintwnd und setzt schließlich die Show auf TRUE.
In der ActivateHint -Methode verarbeiten wir den Effekt. des schnellen Fensters, so dass Transparenz der Effekt jetzt ist. Zweitens zeichnen Sie die Kante des Glass und führen Sie schließlich einen Schatteneffekt auf die rechte und unten im Fenster.
In Bezug auf die Implementierung von Schatteneffekten wird die Bild -Alpha -Technologie verwendet.
Dst.red = src.red * alpha + (1-alpha) * dst.red;
Dst.green = src.green * alpha + (1-alpha) * dst.green;
Dst.blue = src.Blue * alpha + (1-alpha) * dst.Blue;
Der Wert von Alpha liegt zwischen 0 und 1, was bedeutet, dass es vollständig undurchsichtig ist, wenn es 1 ist, aber die Farbe, die wir zum Mischen verwenden, ist schwarz, dh 0. Also, was der obige Code sieht, lautet wie folgt:
P [3*i]: = P [3*i]*transstangle div 100;
Das Prinzip des Glasfensters ist ungefähr so. Aber als schnelles Fenster denke ich, dass es genug ist.