تقدم المقالة السابقة التطبيق البسيط للتلميح ، وستقدم هذه المقالة مثالًا على تخصيص نوافذ تلميح. هذه نافذة تلميح مخصصة لها تأثير جيد ، مع الزجاج مثل الحدود وتأثير الظل.
ومع ذلك ، قبل ذلك ، يجب أن نقدم كيفية تخصيصه. دعونا نلقي نظرة على العديد من الأساليب الافتراضية ، يقوم CreateParams بتعيين نمط النافذة ، نريد الكتابة فوقه حتى لا يكون له حدود. يرسم NCPaint حدود النافذة ، ونحن بحاجة أيضًا إلى تغطيتها ، لأننا لسنا بحاجة إلى الحدود. الطلاء أكثر أهمية ، لذلك يجب تغطية محتوى منطقة عميل نافذة تلميح. ولكن الشيء الأكثر أهمية هو ActivateHint ، والذي سيحدد حجم النافذة وعرضه. يرد أدناه تنفيذ هذه الفئة:
وحدة wdhintwnd ؛
واجهة
يستخدم
Windows ، الفئات ، عناصر التحكم ، الرسومات ، النماذج ، sysutils ، extctrls ؛
يكتب
twdhintwnd = فئة (thintwindow)
خاص
fwndbmp: tbitmap ؛
FHINTBMP: TBITMAP ؛
محمية
الإجراء CreateParams (var params: tcreateparams) ؛
الطلاء الإجراء.
الإجراء ncpaint (DC: HDC) ؛
{ارسم موجه الصورة}
Drawhintimg الإجراء (BMP: tbitmap ؛ ahint: سلسلة) ؛
{احصل على صورة منطقة سطح المكتب المقابلة لنافذة المطالبة}
الإجراء getDesktopimg (BMP: TBITMAP ؛ R: TRECT) ؛
{علاج صورة منطقة سطح المكتب لجعلها تبدو وكأنها قطعة من الزجاج مع ظل صغير}
الإجراء effectHandle (WNDBMP ، HINTBMP: TBITMAP) ؛
عام
إنشاء مُنشئ (مالك: tcomponent) ؛
المدمرة تدمير.
الإجراء ActivateHint (Rect: Trect ؛ const ahint: string) ؛
نهاية؛
تطبيق
{twdhintwnd}
الإجراء twdhintwnd.ActivateHint (Rect: Trect ؛ const ahint: string) ؛
var
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) ؛
الحدود: = المستقيم ؛
إذا ترك <screen.desktopleft ثم
اليسار: = screen.desktopleft ؛
إذا كان الأعلى <screen.desktoptop ثم
أعلى: = screen.desktoptop ؛
إذا ترك + عرض> screen.desktopwidth ثم
اليسار: = screen.desktopwidth - العرض ؛
إذا كان أعلى + الارتفاع> screen.desktopheight ثم
أعلى: = screen.desktopheight - الارتفاع ؛
getDesktopimg (FWNDBMP ، الحدود) ؛
effectHandle (fwndbmp ، fhintbmp) ؛
P: = ClientToscreen (النقطة (0 ، 0)) ؛
setwindowpos (مقبض ، HWND_TOPMIST ، PX ، PY ، 0 ، 0 ،
swp_showwindow أو swp_noactive أو swp_nosize) ؛
نهاية؛
مُنشئ twdhintwnd.create (aleener: 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) ؛
var
C: tcanvas ؛
يبدأ
C: = tcanvas.create ؛
يحاول
C.Handle: = getDC (0) ؛
bmp.canvas.copyrect (rect (0 ، 0 ، bmp.width ، bmp.height) ، c ، r) ؛
أخيراً
ج.
نهاية؛
نهاية؛
الإجراء twdhintwnd.effectHandle (wndbmp ، hintbmp: tbitmap) ؛
var
R: TRECT ؛
أنا ، ي: عدد صحيح ؛
P: PbyTearray ؛
transst ، transstangle: integer ؛
يبدأ
r: = rect (0 ، 0 ، wndbmp.width - 4 ، wndbmp.height - 4) ؛
Frame3D (WNDBMP.Canvas ، R ، Clmdgray ، Clbtnshadow ، 1) ؛
// كن تأثير الظل تحت النافذة
Transst: = 60 ؛
ل j: = wndbmp.height - 4 إلى wndbmp.height - 1 تفعل
يبدأ
P: = wndbmp.scanline [j] ؛
transstangle: = transst ؛
لأني: = 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 ؛
لأني: = 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) ؛
var
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 ؛
نهاية.
فقط أضف الوحدة إلى مشروعك وقم بتشغيل البرنامج لمعرفة التأثير.
تم التعليق على الأجزاء المهمة من البرنامج ، وهنا ليست سوى بعض النقاط المهمة ، أولاً وقبل كل شيء ، التهيئة
في جزء منه ، هنا ، قم بتعيين Showhint of Application to false ، انظر إلى رمز مصدر VCL ، واعرف أن التطبيق قد دمر تلميحات ، وتعريف HintWindowClass كما يلي:
thintwindowclass = فئة من thintwindow ؛
HintWindowClass: thintwindowclass = thintwindow ؛
هنا نستبدلها مع Twdhintwnd ، وأخير تطبيق True.
في طريقة التنشيط ، سنقوم بمعالجة التأثير. من النافذة المذهلة ، بحيث يكون هناك شفافية يكون التأثير الآن. ثانياً ، ارسم حافة الزجاج ، وأخيراً قم بتأثير الظل على اليمين والسفلي من النافذة.
فيما يتعلق بتنفيذ آثار الظل ، لا يمكنك البحث عن الصورة هنا.
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 ؛
إن مبدأ النافذة الزجاجية مثل هذا تقريبًا. لكن كأنه نافذة سريعة ، أعتقد أنها كافية.