เมื่อใช้อินเทอร์เฟซ MDI บางครั้งจำเป็นต้องแสดงกราฟิกหรือซอฟต์แวร์บางส่วนในหน้าต่างไคลเอ็นต์ MDI เพื่อให้อินเทอร์เฟซซอฟต์แวร์ไม่ปรากฏว่างเปล่าและสามารถเข้าใจฟังก์ชันซอฟต์แวร์ได้อย่างรวดเร็ว อย่างไรก็ตาม อินเทอร์เฟซเหล่านี้ไม่ได้ให้มาโดยตรงใน Delphi การควบคุมกราฟิกใด ๆ ที่วางในรูปแบบ MDI ไม่สามารถแสดงในขณะรันไทม์ได้ ดังนั้นจึงจำเป็นต้องแก้ไขแบบฟอร์ม MDI
คำแถลง:
วิธีแก้ปัญหานี้มีไว้สำหรับแบบฟอร์ม MDI เท่านั้น หากใช้กับแบบฟอร์มที่ไม่ใช่ MDI ผลลัพธ์ที่ตามมานั้นยากที่จะพูด ลองด้วยตัวเอง
โปรดจำไว้ว่า คุณสมบัติ FormStyle ของแบบฟอร์มควรตั้งค่าเป็น: fsMDIForm
สารละลาย:
1. ไม่สามารถรับข้อความหน้าต่างไคลเอ็นต์ MDI (ข้อความ) ในรูปแบบหลักของ MDI ดังนั้น คุณต้องปรับแต่งกระบวนการประมวลผลหน้าต่างไคลเอ็นต์ (Window PROcedure) และเข้าควบคุมหน้าต่างไคลเอ็นต์ MDI (จำเป็นต้องนำไปใช้ใน CreateWnd ที่โอเวอร์โหลด กระบวนการ ):
ขั้นตอน TMDIForm.CreateWnd;
เริ่ม
สืบทอด;
FNewWndProc := MakeObjectInstance (ClientWndProc);
FOldWndProc := ตัวชี้ (GetWindowLong (ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
จบ;
ในหมู่พวกเขา ClientWndProc เป็นขั้นตอนหน้าต่างที่กำหนดเอง: ขั้นตอน ClientWndProc (ข้อความ var: TMessage);
FOldWndProcใช้เพื่อจัดเก็บตัวชี้ของกระบวนงานหน้าต่างเก่า
2. ใช้กระบวนการหน้าต่างลูกค้าของคุณเอง:
ขั้นตอน TMDIForm.ClientWndProc (ข้อความ var: TMessage);
var
คำตอบ: ถูกต้อง;
ขั้นตอนเริ่มต้น;
เริ่ม
ด้วยข้อความทำ
ผลลัพธ์ := CallWindowProc (FoldWndProc, ClientHandle, Msg, wParam, lParam);
จบ;
var
PS: TPaintStruct;
เริ่ม
R := ลูกค้าแก้ไข;
ข้อความกรณี.ข่าวสารของ
WM_สี:
เริ่ม
BeginPaint(ไคลเอนต์แฮนเดิล,PS);
พยายาม
ผ้าใบล็อค;
พยายาม
Canvas.Handle := PS.hdc;
พยายาม
สี;
ถ้า ControlCount > 0 แล้ว
PaintControls (PS.hdc, การควบคุม [0]);
ในที่สุด
ผ้าใบ ด้ามจับ := 0;
จบ;
ในที่สุด
ผ้าใบปลดล็อค;
จบ;
ในที่สุด
EndPaint(ไคลเอนต์แฮนเดิล,PS);
จบ;
จบ;
WM_ERASEBKGND:
เริ่ม
DrawBG(TWMEraseBkGnd(ข้อความ).DC);
ข้อความผลลัพธ์ := 1;
จบ;
WM_VSCROLL,WM_HSCROLL:
เริ่ม
InvalidateRect(ClientHandle,@R,จริง);
ค่าเริ่มต้น;
จบ;
WM_SIZE:
เริ่ม
InvalidateRect(ClientHandle,@R,จริง);
ค่าเริ่มต้น;
จบ;
อื่น
ค่าเริ่มต้น;
จบ;
จบ;
DrawBG ด้านบนใช้เพื่อวาดพื้นหลังหน้าต่าง
3. ใช้พื้นหลังของหน้าต่าง
เพื่อให้ผู้สืบทอดสามารถกำหนดภูมิหลังของตนเองได้ กระบวนการนี้จึงถูกอธิบายว่าเป็นเสมือน:
ได้รับการคุ้มครอง
ขั้นตอน DrawBG (DC: HDC);
ที่นี่ กระบวนการ DrawBG เพียงเติมพื้นหลังของหน้าต่าง:
ขั้นตอน TMDIForm.DrawBG(DC: HDC);
เริ่ม
ถ้า Brush.Color <> clNone แล้ว
FillRect(DC, ClientRect, Brush.Handle);
จบ;
4. โดยสรุป คำนิยามคลาส TMDIFrom สรุปได้ดังนี้:
TMDIForm = คลาส (TForm)
ส่วนตัว
FoldWndProc: TFarProc;
FNewWndProc: TFarProc;
ขั้นตอน ClientWndProc (ข้อความ var: TMessage);
ได้รับการคุ้มครอง
ขั้นตอน DrawBG (DC: HDC); เสมือน;
ขั้นตอน CreateWnd;
จบ;
5. หลังจากการเปลี่ยนแปลงข้างต้น คุณสามารถวาดพื้นหลังที่ระบุใน DrawBG (คุณต้องเรียกใช้อินเทอร์เฟซ Windows GUI โดยตรง) หรือใช้การควบคุมกราฟิกโดยตรง หรือใช้เหตุการณ์ OnPaint ของแบบฟอร์ม และหน้าต่าง MDI จะมีสีสันจาก ตอนนี้อยู่