บทความก่อนหน้านี้แนะนำแอปพลิเคชันที่ง่ายของคำใบ้และบทความนี้จะให้ตัวอย่างของการปรับแต่ง Windows หน้าต่างคำใบ้ที่กำหนดเองนี้มีเอฟเฟกต์ที่ดีโดยมีกระจกเป็นเส้นขอบและเอฟเฟกต์เงา
อย่างไรก็ตามก่อนหน้านี้เราต้องแนะนำวิธีการปรับแต่ง ลองมาดูวิธีการเสมือนจริงหลายวิธี createparams กำหนดรูปแบบของหน้าต่างเราต้องการเขียนทับมันเพื่อให้มันไม่มีพรมแดน NCPaint ดึงขอบหน้าต่างและเราต้องครอบคลุมเพราะเราไม่ต้องการชายแดน สีมีความสำคัญมากกว่าดังนั้นจึงต้องครอบคลุมในเนื้อหาของพื้นที่ไคลเอนต์หน้าต่างคำแนะนำ แต่สิ่งที่สำคัญที่สุดคือ ActivateHint ซึ่งจะกำหนดขนาดของหน้าต่างและแสดง การใช้งานของคลาสนี้ได้รับด้านล่าง:
หน่วย wdhintwnd;
ส่วนต่อประสาน
ใช้
Windows, คลาส, การควบคุม, กราฟิก, รูปแบบ, sysutils, extctrls;
พิมพ์
twdhintwnd = คลาส (Thintwindow)
ส่วนตัว
fwndbmp: tbitmap;
FHINTBMP: TBITMAP;
ได้รับการคุ้มครอง
กระบวนการ createparams (var params: tcreateparams);
สีขั้นตอน;
ขั้นตอน NCPaint (DC: HDC);
{วาดพรอมต์ภาพ}
ขั้นตอน drawhintimg (bmp: tbitmap; ahint: string);
{รับภาพของพื้นที่เดสก์ท็อปที่สอดคล้องกับหน้าต่างพรอมต์}
ขั้นตอน getDesktopimg (BMP: TBITMAP; R: TECT);
{รักษาภาพพื้นที่เดสก์ท็อปเพื่อให้ดูเหมือนชิ้นส่วนแก้วที่มีเงาเล็กน้อย}
ขั้นตอน effecthandle (WNDBMP, HINTBMP: TBITMAP);
สาธารณะ
ตัวสร้างสร้าง (AOWNER: TCOMPONENT);
Destructor ทำลาย;
ขั้นตอนการเปิดใช้งาน (rect: trect; const ahint: string);
จบ;
การดำเนินการ
{twdhintwnd}
ขั้นตอน twdhintwnd.activatehint (rect: trect; const ahint: string);
วาจา
P: TPoint;
เริ่ม
// รับขนาดที่เหมาะสมเพื่อแสดงข้อความที่นี่
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;
ถ้าซ้าย <screen.desktopleft แล้ว
ซ้าย: = screen.desktopleft;
ถ้า top <screen.desktoptop แล้ว
ด้านบน: = screen.desktoptop;
ถ้าซ้าย + width> screen.desktopwidth แล้ว
ซ้าย: = screen.desktopwidth - ความกว้าง;
ถ้าด้านบน + ความสูง> screen.desktopheight แล้ว
ด้านบน: = screen.desktopheight - ความสูง;
getDesktopimg (fwndbmp, boundsrect);
Effecthandle (FWNDBMP, FHINTBMP);
P: = clientToscreen (จุด (0, 0));
setWindowPos (ด้ามจับ, hwnd_topmost, px, py, 0, 0,
swp_showwindow หรือ swp_noactivate หรือ swp_nosize);
จบ;
Constructor twdhintwnd.create (aowner: tComponent);
เริ่ม
สืบทอด;
fwndbmp: = tbitmap.create;
fwndbmp.pixelformat: = pf24bit;
fhintbmp: = tbitmap.create;
จบ;
โพรซีเดอร์ twdhintwnd.createparams (var params: tcreateparams);
เริ่ม
สืบทอด;
// ถอดเส้นขอบหน้าต่าง
params.style: = params.style และไม่ใช่ ws_border;
จบ;
destructor twdhintwnd.destroy;
เริ่ม
fwndbmp.free;
fhintbmp.free;
สืบทอด;
จบ;
ขั้นตอน twdhintwnd.getdesktopimg (BMP: tbitmap; r: trect);
วาจา
C: tcanvas;
เริ่ม
c: = tcanvas.create;
พยายาม
C.Handle: = getDC (0);
bmp.canvas.copyrect (rect (0, 0, bmp.width, bmp.height), c, r);
ในที่สุด
C.Free;
จบ;
จบ;
ขั้นตอน twdhintwnd.effecthandle (WNDBMP, HINTBMP: TBITMAP);
วาจา
R: Trect;
ฉัน, J: จำนวนเต็ม;
P: Pbytearray;
transst, transstangle: จำนวนเต็ม;
เริ่ม
r: = rect (0, 0, wndbmp.width - 4, wndbmp.height - 4);
Frame3D (WNDBMP.CANVAS, R, Clmedgray, Clbtnshadow, 1);
// เป็นเอฟเฟกต์เงาใต้หน้าต่าง
transst: = 60;
สำหรับ j: = wndbmp.height - 4 ถึง wndbmp.height - 1 ทำ
เริ่ม
P: = WNDBMP.SCANLINE [J];
transstangle: = transst;
สำหรับ i: = 3 ถึง wndbmp.width - 1 ทำ
เริ่ม
// ถ้าอยู่ที่มุมล่างขวา
ถ้าฉัน> wndbmp.width - 5 แล้ว
เริ่ม
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;
ถ้า transstangle> 90 จากนั้น transstangle: = 90;
จบ
เริ่มต้นอื่น
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;
จบ;
// เป็นเอฟเฟกต์เงาทางด้านขวาของหน้าต่าง
สำหรับ j: = 3 ถึง wndbmp.height - 5 ทำ
เริ่ม
P: = WNDBMP.SCANLINE [J];
transst: = 60;
สำหรับ i: = wndbmp.width - 4 ถึง wndbmp.width -1 ทำ
เริ่ม
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;
จบ;
จบ;
wndbmp.canvas.draw (10, 10, hintbmp);
จบ;
ขั้นตอน twdhintwnd.ncpaint;
เริ่ม
// โหลดใหม่ไม่อนุญาตให้วาดเส้นขอบ
จบ;
ขั้นตอน twdhintwnd.paint;
เริ่ม
Canvas.Copyrect (clientRect, fwndbmp.canvas, clientRect);
จบ;
ขั้นตอน twdhintwnd.drawhintimg (BMP: tbitmap; ahint: string);
วาจา
R: Trect;
เริ่ม
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 หรือ dt_noprefix หรือ
dt_wordbreak หรือ drawtextbidimodeflagsreadingonly);
จบ;
การเริ่มต้น
application.showhint: = false;
hintwindowClass: = twdhintwnd;
application.showhint: = true;
จบ.
เพียงเพิ่มหน่วยลงในโครงการของคุณและเรียกใช้โปรแกรมเพื่อดูเอฟเฟกต์
ส่วนสำคัญของโปรแกรมได้รับการแสดงความคิดเห็นและนี่คือจุดสำคัญเพียงไม่กี่จุดก่อนอื่นการเริ่มต้น
ในส่วนที่นี่ตั้งค่าการแสดงของแอปพลิเคชันเป็นเท็จดูที่ซอร์สโค้ด VCL และรู้ว่าแอปพลิเคชันได้ทำลาย HintWindow และคำจำกัดความของ HintWindowClass มีดังนี้:
ThintWindowClass = คลาสของ ThintWindow;
HintWindowClass: ThintWindowClass = ThintWindow;
ที่นี่เราแทนที่ด้วย twdhintwnd และในที่สุดก็ตั้งค่า SHOWHINT เป็น TRUE
ในวิธีการเปิดใช้งานเราจะประมวลผลเอฟเฟกต์ ของหน้าต่างพรอมต์เพื่อให้มีความโปร่งใสเอฟเฟกต์อยู่ในขณะนี้ ประการที่สองวาดขอบของแก้วและในที่สุดก็สร้างเอฟเฟกต์เงาที่ด้านขวาและด้านล่างของหน้าต่าง
เกี่ยวกับการใช้งานของ Shadow Effects เทคโนโลยีอัลฟ่าจะใช้งานได้
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;
ค่าของอัลฟ่าอยู่ระหว่าง 0 ถึง 1 ซึ่งหมายถึงทึบแสงอย่างสมบูรณ์เมื่อเป็น 1 แต่สีที่เราจะใช้สำหรับการผสมคือสีดำนั่นคือ 0 ดังนั้นสิ่งที่รหัสข้างต้นเห็นมีดังนี้:
p [3*i]: = p [3*i]*transstangle div 100;
หลักการของหน้าต่างพรอมต์แก้วนั้นเป็นเช่นนี้ แต่เป็นหน้าต่างที่รวดเร็วฉันคิดว่ามันเพียงพอแล้ว