Saat menggunakan antarmuka MDI, terkadang perlu menampilkan beberapa grafik atau sampul perangkat lunak di jendela klien MDI agar antarmuka perangkat lunak tidak tampak kosong dan fungsi perangkat lunak dapat terlihat jelas dalam sekejap. Namun, antarmuka ini tidak disediakan secara langsung di Delphi. Kontrol grafis apa pun yang ditempatkan dalam formulir MDI tidak dapat ditampilkan saat runtime. Oleh karena itu, formulir MDI perlu diubah.
Penyataan:
Solusi ini hanya untuk formulir MDI. Jika diterapkan pada formulir non-MDI, konsekuensinya sulit untuk dikatakan.
Ingat, properti FormStyle formulir harus disetel ke: fsMDIForm.
Larutan:
1. Pesan jendela klien MDI (Pesan) tidak dapat diterima dalam formulir utama MDI. Oleh karena itu, Anda perlu menyesuaikan proses pemrosesan jendela klien (Window PROcedure) dan mengambil alih jendela klien MDI (perlu diterapkan di CreateWnd yang kelebihan beban. proses ):
prosedur TMDIForm.CreateWnd;
mulai
diwariskan;
FNewWndProc := MakeObjectInstance(ClientWndProc);
FOldWndProc := Penunjuk(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FNewWndProc));
akhir;
Diantaranya, ClientWndProc adalah prosedur jendela khusus: procedure ClientWndProc(var Message: TMessage);
FOldWndProc digunakan untuk menyimpan pointer dari prosedur jendela lama.
2. Terapkan proses jendela pelanggan Anda sendiri:
prosedur TMDIForm.ClientWndProc(var Pesan: TMessage);
var
R: BENAR;
prosedur Default;
mulai
dengan Pesan lakukan
Hasil := CallWindowProc(FOldWndProc, ClientHandle, Msg, wParam, lParam);
akhir;
var
PS: TPaintStruct;
mulai
R := KlienRect;
pesan kasus. Pesan dari
WM_CAT:
mulai
BeginPaint(ClientHandle,PS);
mencoba
Kanvas.Kunci;
mencoba
Kanvas.Pegangan := PS.hdc;
mencoba
Cat;
jika ControlCount > 0 maka
Kontrol Cat(PS.hdc,Kontrol[0]);
Akhirnya
Kanvas.Pegangan := 0;
akhir;
Akhirnya
Kanvas.Buka Kunci;
akhir;
Akhirnya
EndPaint(Pegangan Klien,PS);
akhir;
akhir;
WM_ERASEBKGND:
mulai
DrawBG(TWMEraseBkGnd(Pesan).DC);
Pesan.Hasil := 1;
akhir;
WM_VSCROLL,WM_HSCROLL:
mulai
InvalidateRect(ClientHandle,@R,true);
Bawaan;
akhir;
WM_UKURAN:
mulai
InvalidateRect(ClientHandle,@R,true);
Bawaan;
akhir;
kalau tidak
Bawaan;
akhir;
akhir;
DrawBG di atas digunakan untuk menggambar latar belakang jendela.
3. Menerapkan latar belakang jendela.
Untuk memungkinkan penerus menentukan latar belakang mereka sendiri, prosesnya digambarkan sebagai virtual:
terlindung
prosedur DrawBG(DC:HDC);
Di sini, proses DrawBG hanya mengisi latar belakang jendela:
prosedur TMDIForm.DrawBG(DC:HDC);
mulai
jika Brush.Color <> clNone maka
FillRect(DC, ClientRect, Brush.Handle);
akhir;
4. Secara ringkas, definisi kelas TMDIFrom dirangkum sebagai berikut:
TMDIForm = kelas(TForm)
pribadi
LIPATWndProc: TFarProc;
FNewWndProc: TFarProc;
prosedur ClientWndProc(var Pesan: TMessage);
terlindung
prosedur DrawBG(DC: HDC);virtual;
prosedur CreateWnd;
akhir;
5. Setelah transformasi di atas, Anda dapat menggambar latar belakang yang ditentukan di DrawBG (Anda perlu langsung memanggil antarmuka GUI Windows), atau langsung menggunakan kontrol grafis, atau mengimplementasikan acara OnPaint dalam formulir, dan jendela MDI akan berwarna-warni dari sekarang.