Artikel sebelumnya memperkenalkan aplikasi sederhana dari petunjuk, dan artikel ini akan memberikan contoh penyesuaian Windows Petunjuk. Jendela petunjuk khusus ini memiliki efek yang baik, dengan kaca sebagai batas dan efek bayangan.
Namun, sebelum ini, kita harus memperkenalkan cara menyesuaikannya. Mari kita lihat beberapa metode virtual, createParams menetapkan gaya jendela, kami ingin menimpanya sehingga tidak memiliki perbatasan. Ncpaint menarik perbatasan jendela, dan kita juga perlu menutupinya, karena kita tidak membutuhkan perbatasan. Cat lebih penting, jadi harus dibahas dalam kandungan area klien Window Petunjuk. Tetapi yang paling penting adalah ActiveHint, yang akan mengatur ukuran jendela dan menampilkannya. Implementasi kelas ini diberikan di bawah ini:
unit wdhintwnd;
antarmuka
penggunaan
Windows, kelas, kontrol, grafik, formulir, sysutils, extctrls;
jenis
Twdhintwnd = class (thintwindow)
Pribadi
Fwndbmp: tbitmap; // window bitmap
FHINTBMP: TBITMAP; // Informasi Prompt Bitmap
terlindung
Prosedur CreateParams (Var Params: TCreateParams);
Prosedur Cat;
Prosedur NCPaint (DC: HDC);
{Gambar prompt gambar}
Prosedur DRACTIMG (BMP: TBITMAP; AHINT: String);
{Dapatkan gambar area desktop yang sesuai dengan jendela prompt}
Prosedur getDesktopimg (BMP: TBITMAP; R: Trect);
{Perlakukan gambar area desktop agar terlihat seperti sepotong kaca dengan sedikit bayangan}
Prosedur Effecthandle (WNDBMP, HintBMP: TBITMAP);
publik
Constructor Create (Aowner: TComponent);
Destructor menghancurkan;
Prosedur ActiveHint (Rect: Trect; Const Ahint: String);
akhir;
Pelaksanaan
{Twdhintwnd}
Prosedur twdhintwnd.activateHint (rect: trect; const ahint: string);
var
P: TPOint;
Mulai
// Dapatkan ukuran yang sesuai untuk menampilkan teks di sini
Fhintbmp.width: = rect.right - rect.left;
Fhintbmp.height: = 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;
Jika dibiarkan <screen.desktopleft maka
Kiri: = screen.desktopleft;
Jika atas <screen.desktoptop
TOP: = screen.desktoptop;
Jika kiri + lebar> screen.desktopwidth
Kiri: = screen.desktopwidth - lebar;
Jika Top + Height> Screen.Desktopheight maka
TOP: = screen.desktopheight - tinggi;
Getdesktopimg (fwndbmp, boundsrect);
Effecthandle (fwndbmp, fhintbmp);
P: = clienttoscreen (titik (0, 0));
SetWindowPos (pegangan, hwnd_topmost, px, py, 0, 0,
Swp_showwindow atau swp_noactivate atau swp_nosize);
akhir;
konstruktor twdhintwnd.create (aowner: tcomponent);
Mulai
diwariskan;
Fwndbmp: = tbitmap.create;
Fwndbmp.pixelformat: = pf24bit;
FHINTBMP: = tbitmap.create;
akhir;
Prosedur twdhintwnd.createParams (var params: tcreateParams);
Mulai
diwariskan;
// Lepaskan perbatasan jendela
Params.style: = params.style dan bukan ws_border;
akhir;
Destructor twdhintwnd.destroy;
Mulai
Fwndbmp.free;
Fhintbmp.free;
diwariskan;
akhir;
Prosedur twdhintwnd.getdesktopimg (BMP: tbitmap; r: trect);
var
C: TCanvas;
Mulai
C: = tCanvas.create;
mencoba
C.Handle: = getDc (0);
Bmp.canvas.copyrect (rect (0, 0, bmp.width, bmp.height), c, r);
Akhirnya
C. bebas;
akhir;
akhir;
Prosedur twdhintwnd.effecthandle (wndbmp, hintbmp: tbitmap);
var
R: Trect;
I, J: Integer;
P: PbyTeArray;
Transst, Transstangle: Integer;
Mulai
R: = rect (0, 0, wndbmp.width - 4, wndbmp.height - 4);
Frame3d (wndbmp.canvas, r, clmedgray, clbtnshadow, 1);
// jadilah efek bayangan di bawah jendela
Transst: = 60;
untuk j: = wndbmp.height - 4 ke wndbmp.height - 1 do
Mulai
P: = wndbmp.scanline [j];
Transstangle: = transst;
untuk i: = 3 ke wndbmp.width - 1 do
Mulai
// Jika berada di sudut kanan bawah
Jika i> wndbmp.width - 5 lalu
Mulai
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;
jika transstangle> 90 maka transstangle: = 90;
akhir
lagi mulai
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;
akhir;
akhir;
Transst: = Transst + 10;
akhir;
// Jadilah efek bayangan di sisi kanan jendela
untuk j: = 3 ke wndbmp.height - 5 do
Mulai
P: = wndbmp.scanline [j];
Transst: = 60;
untuk i: = wndbmp.width - 4 ke wndbmp.width -1 do
Mulai
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;
akhir;
akhir;
Wndbmp.canvas.draw (10, 10, hintbmp);
akhir;
Prosedur twdhintwnd.ncpaint;
Mulai
// Muat ulang tidak mengizinkan gambar perbatasan
akhir;
Prosedur twdhintwnd.paint;
Mulai
Canvas.copyrect (Clientrect, fwndbmp.canvas, clientrect);
akhir;
Prosedur twdhintwnd.drawhintimg (bmp: tbitmap; ahint: string);
var
R: Trect;
Mulai
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 atau dt_noprefix atau
Dt_wordbreak atau drawtextbidimodeflagsreadingonly);
akhir;
Inisialisasi
Application.showhint: = false;
HintWindowClass: = TwdHintwnd;
Application.showhint: = true;
akhir.
Cukup tambahkan unit ke proyek Anda dan jalankan program untuk melihat efeknya.
Bagian penting dari program ini telah dikomentari, dan di sini hanya beberapa poin penting, pertama -tama, inisialisasi
Sebagian, di sini, atur showhint aplikasi ke false, lihat kode sumber VCL, dan ketahuilah bahwa aplikasi telah menghancurkan tyswindow, dan definisi HintwindowClass adalah sebagai berikut:
Thintwindowclass = kelas window;
HintwindowClass: ThintWindowClass = Thintwindow;
Di sini kami menggantinya dengan Twdhintwnd, dan akhirnya mengatur Showhint ke True.
Dalam metode ActivateHint, kami akan memproses efeknya. Dari jendela yang cepat, sehingga ada transparansi efeknya sekarang. Kedua, gambar tepi kaca, dan akhirnya buat efek bayangan di kanan dan bawah jendela.
Mengenai implementasi efek bayangan, teknologi alpha digunakan.
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;
Nilai alpha adalah antara 0 dan 1, yang berarti benar -benar buram ketika itu adalah 1, tetapi warna yang akan kita gunakan untuk pencampuran berwarna hitam, yaitu, 0, jadi apa yang dilihat kode di atas sebagai berikut:
P [3*i]: = p [3*i]*Transstangle div 100;
Prinsip jendela prompt kaca kira -kira seperti ini. Tapi sebagai jendela yang cepat, saya pikir itu sudah cukup.