Bagikan melalui


Tentang Antarmuka Multi Dokumen

Setiap dokumen dalam aplikasi antarmuka banyak dokumen (MDI) ditampilkan di jendela anak yang terpisah dalam area klien dari jendela utama aplikasi. Aplikasi MDI umum termasuk aplikasi pemrosesan kata yang memungkinkan pengguna untuk bekerja dengan beberapa dokumen teks, dan aplikasi spreadsheet yang memungkinkan pengguna untuk bekerja dengan beberapa bagan dan spreadsheet. Untuk informasi selengkapnya, lihat topik berikut ini.

Jendela Bingkai, Klien, dan Anak

Aplikasi MDI memiliki tiga jenis jendela: jendela bingkai, jendela klien MDI, serta sejumlah jendela anak. Jendela bingkai seperti jendela utama aplikasi: jendela tersebut memiliki batas ukuran, bilah judul, menu jendela, tombol minimalkan, dan tombol maksimalkan. Aplikasi harus mendaftarkan kelas jendela untuk jendela bingkai dan menyediakan prosedur jendela untuk mendukungnya.

Aplikasi MDI tidak menampilkan output di area klien jendela bingkai. Sebaliknya, ini menampilkan jendela klien MDI. Jendela klien MDI adalah jenis khusus jendela anak milik kelas jendela yang sudah terdaftar sebelumnya MDICLIENT. Jendela klien adalah subjendela dari jendela bingkai; ini berfungsi sebagai latar belakang untuk subjendela lainnya. Ini juga menyediakan dukungan untuk membuat dan memanipulasi jendela anak. Misalnya, aplikasi MDI dapat membuat, mengaktifkan, atau memaksimalkan jendela anak dengan mengirim pesan ke jendela klien MDI.

Saat pengguna membuka atau membuat dokumen, jendela klien membuat jendela anak untuk dokumen tersebut. Jendela klien adalah jendela induk dari semua jendela anak MDI dalam aplikasi. Setiap jendela anak memiliki batas ukuran, bilah judul, menu jendela, tombol minimalkan, dan tombol maksimalkan. Karena jendela anak dipotong, jendela ini terbatas pada jendela klien dan tidak dapat muncul di luarnya.

Aplikasi MDI dapat mendukung lebih dari satu jenis dokumen. Misalnya, aplikasi spreadsheet biasa memungkinkan pengguna untuk bekerja dengan bagan dan spreadsheet. Untuk setiap jenis dokumen yang didukungnya, aplikasi MDI harus mendaftarkan kelas jendela turunan dan menyediakan prosedur jendela untuk mendukung jendela milik kelas tersebut. Untuk informasi selengkapnya tentang kelas jendela, lihat Kelas Jendela. Untuk informasi selengkapnya tentang prosedur jendela, lihat Prosedur Jendela.

Berikut ini adalah aplikasi MDI biasa. Ini bernama Multipad.

Cuplikan layar jendela bingkai aplikasi mdi multipad dan jendela klien.

Pembuatan Jendela Anak

Untuk membuat jendela anak, aplikasi MDI memanggil fungsiCreateMDIWindow atau mengirim pesan WM_MDICREATE ke jendela klien MDI. Cara yang lebih efisien untuk membuat jendela anak MDI adalah dengan memanggil fungsi CreateWindowEx, dengan menentukan gaya diperluas WS_EX_MDICHILD.

Untuk menghancurkan jendela anak, aplikasi MDI mengirimkan pesan WM_MDIDESTROY ke jendela klien MDI.

Aktivasi Jendela Anak

Sejumlah jendela anak dapat muncul di jendela klien kapan saja, tetapi hanya satu yang dapat aktif. Jendela anak aktif diposisikan di depan semua jendela anak lainnya, dan batasnya disorot.

Pengguna dapat mengaktifkan jendela anak yang tidak aktif dengan mengkliknya. Aplikasi MDI mengaktifkan jendela anak dengan mengirim pesan WM_MDIACTIVATE ke jendela klien MDI. Saat jendela klien memproses pesan ini, pesan WM_MDIACTIVATE dikirimkan ke prosedur jendela anak yang akan diaktifkan dan ke prosedur jendela anak yang akan dinonaktifkan.

Untuk mencegah jendela anak diaktifkan, tangani pesan WM_NCACTIVATE untuk jendela anak dengan mengembalikan FALSE.

Sistem melacak posisi setiap jendela anak di tumpukan jendela yang tumpang tindih. Penumpukan ini dikenal sebagai Z-Order. Pengguna dapat mengaktifkan jendela anak berikutnya dalam urutan Z dengan mengklik Berikutnya dari menu jendela di jendela aktif. Aplikasi mengaktifkan jendela anak berikutnya (atau sebelumnya) dalam urutan Z dengan mengirim pesan WM_MDINEXT ke jendela klien.

Untuk mengambil handel dari jendela anak yang aktif, aplikasi MDI mengirimkan pesan WM_MDIGETACTIVE ke jendela klien.

Beberapa Menu Dokumen

Jendela bingkai aplikasi MDI harus menyertakan bilah menu dengan menu jendela. Menu jendela harus menyertakan item yang mengatur jendela anak dalam jendela klien atau yang menutup semua jendela anak. Menu jendela aplikasi MDI umum mungkin menyertakan item dalam tabel berikut.

Item menu Maksud
petak peta Mengatur jendela anak dalam format petak peta sehingga masing-masing muncul secara keseluruhan di jendela klien.
Cascade Mengatur jendela anak dalam format kaskade. Jendela anak saling tumpang tindih, tetapi bilah judul masing-masing terlihat.
Susun Ikon Mengatur ikon jendela anak yang diminimalkan di sepanjang bagian bawah jendela klien.
Tutup Semua Menutup semua jendela anak.

Setiap kali jendela anak dibuat, sistem secara otomatis menambahkan item menu baru ke menu jendela. Teks item menu sama dengan teks pada bilah menu jendela anak baru. Dengan mengklik item menu, pengguna dapat mengaktifkan jendela anak yang sesuai. Ketika jendela anak dihancurkan, sistem secara otomatis menghapus item menu yang sesuai dari menu jendela.

Sistem dapat menambahkan hingga sepuluh item menu ke menu jendela. Ketika jendela anak kesepuluh dibuat, sistem menambahkan item Lebih Banyak Jendela ke menu jendela. Mengklik item ini menampilkan kotak dialog Pilih Jendela. Kotak dialog berisi kotak daftar dengan judul semua jendela anak MDI yang saat ini tersedia. Pengguna dapat mengaktifkan jendela anak dengan mengklik judulnya di kotak daftar.

Jika aplikasi MDI Anda mendukung beberapa jenis jendela anak, sesuaikan bilah menu untuk mencerminkan operasi yang terkait dengan jendela aktif. Untuk melakukan ini, berikan sumber daya menu terpisah untuk setiap jenis jendela anak yang didukung aplikasi. Ketika jenis jendela anak baru diaktifkan, aplikasi harus mengirim pesan WM_MDISETMENU ke jendela klien, menyertakan handle ke menu yang sesuai.

Ketika tidak ada jendela anak, bilah menu hanya boleh berisi item yang digunakan untuk membuat atau membuka dokumen.

Ketika pengguna menavigasi melalui menu aplikasi MDI dengan menggunakan kunci kursor, kunci bersifat berbeda dari ketika pengguna menavigasi melalui menu aplikasi biasa. Dalam aplikasi MDI, kontrol berpindah dari menu jendela aplikasi ke menu jendela anak aktif, lalu ke item pertama pada bilah menu.

Beberapa Penguat Dokumen

Untuk menerima dan memproses kunci akselerator untuk jendela anaknya, aplikasi MDI harus menyertakan fungsi TranslateMDISysAccel dalam loop pesannya. Perulangan harus memanggil TranslateMDISysAccel sebelum memanggil fungsi TranslateAccelerator atau DispatchMessage.

Tombol akselerator pada menu jendela untuk jendela anak MDI berbeda dari tombol untuk jendela anak non-MDI. Di jendela anak MDI, kombinasi tombol ALT+ – (minus) membuka menu jendela, kombinasi tombol CTRL+F4 menutup jendela anak aktif, dan kombinasi tombol CTRL+F6 mengaktifkan jendela anak berikutnya.

Ukuran dan Pengaturan Jendela Anak

Aplikasi MDI mengontrol ukuran dan posisi jendela anaknya dengan mengirim pesan ke jendela klien MDI. Untuk memaksimalkan jendela anak aktif, aplikasi mengirimkan pesan WM_MDIMAXIMIZE ke jendela klien. Ketika jendela anak dimaksimalkan, area kliennya sepenuhnya mengisi jendela klien MDI. Selain itu, sistem secara otomatis menyembunyikan bilah judul jendela anak, dan menambahkan ikon menu jendela jendela anak dan tombol Pulihkan ke bilah menu aplikasi MDI. Aplikasi dapat memulihkan jendela klien ke ukuran dan posisi aslinya (sebelum dimaksimalkan) dengan mengirim pesan WM_MDIRESTORE ke jendela klien.

Aplikasi MDI dapat mengatur jendela-jendela anak dalam format berjenjang atau petak. Ketika jendela anak ditumpuk, jendela muncul dalam bentuk tumpukan. Jendela di bagian bawah tumpukan menempati sudut kiri atas layar, dan jendela yang tersisa diimbangi secara vertikal dan horizontal sehingga batas kiri dan bilah judul setiap jendela anak terlihat. Untuk mengatur jendela anak dalam format kaskade, aplikasi MDI mengirimkan pesan WM_MDICASCADE. Biasanya, aplikasi mengirim pesan ini ketika pengguna mengklik Cascade pada menu jendela.

Ketika jendela anak ditata, sistem menampilkan setiap jendela anak secara keseluruhan — tanpa ada yang tumpang tindih. Semua jendela berukuran, seperlunya, agar pas dalam jendela klien. Untuk mengatur jendela anak dalam format petak peta, aplikasi MDI mengirimkan pesan WM_MDITILE ke jendela klien. Biasanya, aplikasi mengirimkan pesan ini ketika pengguna mengklik Tile pada menu jendela.

Aplikasi MDI harus menyediakan ikon yang berbeda untuk setiap jenis jendela anak yang didukungnya. Aplikasi menentukan ikon saat mendaftarkan kelas jendela turunan. Sistem secara otomatis menampilkan ikon jendela anak di bagian bawah jendela klien saat jendela anak diminimalkan. Aplikasi MDI mengarahkan sistem untuk mengatur ikon jendela anak dengan mengirim pesan WM_MDIICONARRANGE ke jendela klien. Biasanya, aplikasi mengirim pesan ini ketika pengguna mengklik Atur Ikon pada menu jendela.

Judul Ikon Jendela

Karena jendela anak MDI dapat diminimalkan, aplikasi MDI harus menghindari memanipulasi jendela judul ikon seolah-olah jendela anak MDI normal. Jendela judul ikon muncul ketika aplikasi menghitung jendela anak dari jendela klien MDI. Jendela ikon judul berbeda dari jendela anak lainnya karena dimiliki oleh jendela anak MDI.

Untuk menentukan apakah jendela anak adalah jendela judul ikon, gunakan fungsiGetWindowdengan indeks GW_OWNER. Jendela bukan judul mengembalikan NULL. Perhatikan bahwa pengujian ini tidak mencukupi untuk jendela tingkat atas, karena menu dan kotak dialog adalah jendela yang dimiliki.

Data Jendela Anak

Karena jumlah jendela anak bervariasi tergantung pada berapa banyak dokumen yang dibuka pengguna, aplikasi MDI harus dapat mengaitkan data (misalnya, nama file saat ini) dengan setiap jendela anak. Ada dua cara untuk melakukan ini:

  • Simpan data jendela anak di struktur jendela.
  • Gunakan properti jendela.

Struktur Jendela

Ketika aplikasi MDI mendaftarkan kelas jendela, aplikasi ini dapat mencadangkan ruang tambahan dalam struktur jendela untuk data aplikasi khusus untuk kelas jendela tertentu ini. Untuk menyimpan dan mengambil data di ruang tambahan ini, aplikasi menggunakan fungsi GetWindowLong dan SetWindowLong.

Untuk mempertahankan sejumlah besar data untuk jendela anak, aplikasi dapat mengalokasikan memori untuk struktur data dan kemudian menyimpan handle ke memori yang berisi struktur tersebut di ruang ekstra yang terkait dengan jendela anak.

Properti Jendela

Aplikasi MDI juga dapat menyimpan data per dokumen dengan menggunakan properti jendela. Data per-dokumen adalah data spesifik untuk jenis dokumen yang ada dalam jendela turunan tertentu. Properti berbeda dari ruang ekstra dalam struktur jendela karena Anda tidak perlu mengalokasikan ruang ekstra saat mendaftarkan kelas jendela. Jendela dapat memiliki sejumlah properti. Selain itu, di mana offset digunakan untuk mengakses ruang ekstra dalam struktur jendela, properti diacu menggunakan nama string. Untuk informasi selengkapnya tentang properti jendela, lihat Properti Jendela.