عند استخدام واجهة MDI، يكون من الضروري أحيانًا عرض بعض الرسومات أو أغلفة البرامج في نافذة عميل MDI حتى لا تظهر واجهة البرنامج فارغة ويمكن أن تكون وظائف البرنامج واضحة في لمحة واحدة. ومع ذلك، لا يتم توفير هذه الواجهات مباشرة في دلفي. لا يمكن عرض أي عناصر تحكم رسومية موضوعة في نموذج MDI في وقت التشغيل. ولذلك، يحتاج نموذج MDI إلى تعديل.
إفادة:
هذا الحل مخصص فقط لنماذج MDI، إذا تم تطبيقه على نماذج غير MDI، فمن الصعب تحديد العواقب.
تذكر أنه يجب تعيين خاصية FormStyle للنموذج على: fsMDIForm.
حل:
1. لا يمكن استلام رسالة نافذة عميل MDI (الرسالة) في النموذج الرئيسي لـ MDI، لذلك، تحتاج إلى تخصيص عملية معالجة نافذة العميل (Window PROcedure) والاستيلاء على نافذة عميل MDI (يلزم تنفيذها في CreateWnd المحمل بشكل زائد. عملية ):
الإجراء TMDIForm.CreateWnd؛
يبدأ
موروث؛
FNewWndProc := MakeObjectInstance(ClientWndProc);
FOldWndProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
نهاية؛
من بينها، ClientWndProc هو إجراء نافذة مخصص: الإجراء ClientWndProc(var message: TMessage);
يتم استخدام FOldWndProc لتخزين مؤشر إجراء النافذة القديمة.
2. قم بتنفيذ عملية نافذة العميل الخاصة بك:
الإجراء TMDIForm.ClientWndProc(var الرسالة: TMessage);
فار
ص: تريكت؛
الإجراء الافتراضي؛
يبدأ
مع رسالة القيام به
النتيجة := CallWindowProc(FOldWndProc, ClientHandle, Msg, wParam, lParam);
نهاية؛
فار
ملاحظة: TPaintStruct؛
يبدأ
R := ClientRect;
رسالة الحالة. رسالة من
WM_PAINT:
يبدأ
BeginPaint(ClientHandle,PS);
يحاول
Canvas.Lock;
يحاول
Canvas.Handle := PS.hdc;
يحاول
طلاء؛
إذا كان ControlCount> 0 ثم
PaintControls(PS.hdc,Controls[0]);
أخيراً
قماش.المقبض := 0;
نهاية؛
أخيراً
Canvas.Unlock;
نهاية؛
أخيراً
EndPaint(ClientHandle,PS);
نهاية؛
نهاية؛
WM_ERASEBKGND:
يبدأ
DrawBG(TWMEraseBkGnd(Message).DC);
الرسالة. النتيجة := 1;
نهاية؛
WM_VSCROLL،WM_HSCROLL:
يبدأ
InvalidateRect(ClientHandle,@R,true);
تقصير؛
نهاية؛
WM_SIZE:
يبدأ
InvalidateRect(ClientHandle,@R,true);
تقصير؛
نهاية؛
آخر
تقصير؛
نهاية؛
نهاية؛
يتم استخدام DrawBG أعلاه لرسم خلفية النافذة.
3. تنفيذ خلفية النافذة.
من أجل السماح للخلفاء بتحديد خلفيتهم الخاصة، تم وصف العملية بأنها افتراضية:
محمي
الإجراء DrawBG (DC: HDC)؛
هنا، تقوم عملية DrawBG ببساطة بملء خلفية النافذة:
الإجراء TMDIForm.DrawBG (DC: HDC)؛
يبدأ
إذا Brush.Color <> clNone ثم
fillRect(DC, ClientRect, Brush.Handle);
نهاية؛
4. باختصار، يتم تلخيص تعريف فئة TMDIFrom على النحو التالي:
تمديفورم = فئة(تفورم)
خاص
FOldWndProc: TFarProc;
FNewWndProc: TFarProc;
الإجراء ClientWndProc(var الرسالة: TMessage);
محمي
الإجراء DrawBG (DC: HDC)؛
تجاوز الإجراء؛
نهاية؛
5. بعد التحويل أعلاه، يمكنك رسم الخلفية المحددة في DrawBG (تحتاج إلى الاتصال مباشرة بواجهة Windows GUI)، أو استخدام عناصر التحكم الرسومية مباشرة، أو تنفيذ حدث OnPaint للنموذج، وستكون نافذة MDI ملونة من الآن فصاعدا.