Tentang Kotak Dialog

Ada banyak fungsi, pesan, dan kontrol yang telah ditentukan sebelumnya untuk membantu membuat dan mengelola kotak dialog, sehingga memudahkan pengembangan antarmuka pengguna untuk aplikasi. Gambaran umum ini menjelaskan fungsi dan pesan kotak dialog dan menjelaskan cara menggunakannya untuk membuat dan menggunakan kotak dialog.

Gambaran umum ini mencakup topik berikut:

Untuk informasi selengkapnya tentang kotak dialog umum, lihat Pustaka Kotak Dialog Umum.

Kapan Menggunakan Kotak Dialog

Sebagian besar aplikasi menggunakan kotak dialog untuk meminta informasi tambahan untuk item menu yang memerlukan input pengguna. Menggunakan kotak dialog adalah satu-satunya cara yang disarankan bagi aplikasi untuk mengambil input. Misalnya, item menu Buka umum mengharuskan nama file terbuka, sehingga aplikasi harus menggunakan kotak dialog untuk meminta nama pengguna. Dalam kasus seperti itu, aplikasi membuat kotak dialog ketika pengguna mengklik item menu dan menghancurkan kotak dialog segera setelah pengguna memasok informasi.

Banyak aplikasi juga menggunakan kotak dialog untuk menampilkan informasi atau opsi saat pengguna bekerja di jendela lain. Misalnya, aplikasi pemrosesan kata sering menggunakan kotak dialog dengan opsi pencarian teks. Saat aplikasi mencari teks, kotak dialog tetap berada di layar. Pengguna kemudian dapat kembali ke kotak dialog dan mencari kata yang sama lagi; atau pengguna dapat mengubah entri dalam kotak dialog dan mencari kata baru. Aplikasi yang menggunakan kotak dialog dengan cara ini biasanya membuatnya ketika pengguna mengklik item menu dan terus menampilkannya selama aplikasi berjalan atau sampai pengguna secara eksplisit menutup kotak dialog.

Untuk mendukung berbagai cara aplikasi menggunakan kotak dialog, ada dua jenis kotak dialog: modal dan tanpa mode. Kotak dialog modal mengharuskan pengguna untuk menyediakan informasi atau membatalkan kotak dialog sebelum mengizinkan aplikasi untuk melanjutkan. Aplikasi menggunakan kotak dialog modal bersama dengan item menu yang memerlukan informasi tambahan sebelum dapat dilanjutkan. Kotak dialog tanpa mode memungkinkan pengguna untuk memberikan informasi dan kembali ke tugas sebelumnya tanpa menutup kotak dialog. Kotak dialog modal lebih mudah dikelola daripada kotak dialog tanpa mode karena dibuat, melakukan tugasnya, dan dihancurkan dengan memanggil satu fungsi.

Untuk membuat kotak dialog modal atau tanpa mode, aplikasi harus menyediakan templat kotak dialog untuk menjelaskan gaya dan konten kotak dialog; aplikasi juga harus menyediakan prosedur kotak dialog untuk melakukan tugas. Templat kotak dialog adalah deskripsi biner dari kotak dialog dan kontrol yang dikandungnya. Pengembang dapat membuat templat ini sebagai sumber daya yang akan dimuat dari file yang dapat dieksekusi aplikasi, atau dibuat dalam memori saat aplikasi berjalan. Prosedur kotak dialog adalah fungsi panggilan balik yang ditentukan aplikasi yang dipanggil sistem ketika memiliki input untuk kotak dialog atau tugas untuk dilakukannya kotak dialog. Meskipun prosedur kotak dialog mirip dengan prosedur jendela, prosedur ini tidak memiliki tanggung jawab yang sama.

Aplikasi biasanya membuat kotak dialog dengan menggunakan fungsi DialogBox atau CreateDialog . Kotak Dialog membuat kotak dialog modal; CreateDialog membuat kotak dialog tanpa mode. Kedua fungsi ini memuat templat kotak dialog dari file yang dapat dieksekusi aplikasi dan membuat jendela pop-up yang cocok dengan spesifikasi templat. Ada fungsi lain yang membuat kotak dialog dengan menggunakan templat dalam memori; mereka meneruskan informasi tambahan ke prosedur kotak dialog saat kotak dialog dibuat.

Kotak dialog biasanya milik kelas jendela eksklusif yang telah ditentukan sebelumnya. Sistem menggunakan kelas jendela ini dan prosedur jendela yang sesuai untuk kotak dialog modal dan tanpa mode. Saat fungsi dipanggil, fungsi akan membuat jendela untuk kotak dialog, serta jendela untuk kontrol dalam kotak dialog, lalu mengirim pesan yang dipilih ke prosedur kotak dialog. Saat kotak dialog terlihat, prosedur jendela yang telah ditentukan sebelumnya mengelola semua pesan, memproses beberapa pesan dan meneruskan pesan lain ke prosedur kotak dialog sehingga prosedur dapat melakukan tugas. Aplikasi tidak memiliki akses langsung ke kelas jendela atau prosedur jendela yang telah ditentukan sebelumnya, tetapi aplikasi dapat menggunakan templat kotak dialog dan prosedur kotak dialog untuk mengubah gaya dan perilaku kotak dialog.

Jendela Pemilik Kotak Dialog

Sebagian besar kotak dialog memiliki jendela pemilik (atau lebih sederhana, pemilik). Saat membuat kotak dialog, aplikasi mengatur pemilik dengan menentukan handel jendela pemilik. Sistem menggunakan pemilik untuk menentukan posisi kotak dialog dalam urutan Z sehingga kotak dialog selalu diposisikan di atas pemiliknya. Selain itu, sistem dapat mengirim pesan ke prosedur jendela pemilik, memberi tahunya tentang peristiwa dalam kotak dialog.

Sistem secara otomatis menyembunyikan atau menghancurkan kotak dialog setiap kali pemiliknya disembunyikan atau dihancurkan. Ini berarti prosedur kotak dialog tidak memerlukan pemrosesan khusus untuk mendeteksi perubahan pada status jendela pemilik.

Karena kotak dialog umum digunakan bersama dengan item menu, jendela pemilik biasanya merupakan jendela yang berisi menu. Meskipun dimungkinkan untuk membuat kotak dialog yang tidak memiliki pemilik, tidak disarankan. Misalnya, ketika kotak dialog modal tidak memiliki pemilik, sistem tidak menonaktifkan jendela lain aplikasi dan memungkinkan pengguna untuk terus melakukan pekerjaan di jendela lain, mengalahkan tujuan kotak dialog modal.

Ketika kotak dialog tanpa mode tidak memiliki pemilik, sistem tidak menyembunyikan atau menghancurkan kotak dialog ketika jendela lain dalam aplikasi disembunyikan atau dihancurkan. Meskipun ini tidak mengalahkan tujuan kotak dialog tanpa mode, ini mengharuskan aplikasi melakukan pemrosesan khusus untuk memastikan kotak dialog disembunyikan dan dihancurkan pada waktu yang tepat.

Kotak Pesan

Kotak pesan adalah kotak dialog khusus yang dapat digunakan aplikasi untuk menampilkan pesan dan meminta input sederhana. Kotak pesan biasanya berisi pesan teks dan satu atau beberapa tombol. Aplikasi membuat kotak pesan dengan menggunakan fungsi MessageBox atau MessageBoxEx , menentukan teks dan jumlah dan jenis tombol untuk ditampilkan. Perhatikan bahwa saat ini tidak ada perbedaan antara cara kerja MessageBox dan MessageBoxEx .

Meskipun kotak pesan adalah kotak dialog, sistem mengambil kontrol penuh atas pembuatan dan manajemen kotak pesan. Ini berarti aplikasi tidak menyediakan templat kotak dialog dan prosedur kotak dialog. Sistem membuat templatnya sendiri berdasarkan teks dan tombol yang ditentukan untuk kotak pesan dan menyediakan prosedur kotak dialognya sendiri.

Kotak pesan adalah kotak dialog modal dan sistem membuatnya dengan menggunakan fungsi internal yang sama dengan yang digunakan Kotak Dialog . Jika aplikasi menentukan jendela pemilik saat memanggil MessageBox atau MessageBoxEx, sistem akan menonaktifkan pemiliknya. Aplikasi juga dapat mengarahkan sistem untuk menonaktifkan semua jendela tingkat atas milik utas saat ini dengan menentukan nilai MB_TASKMODAL saat membuat kotak dialog.

Sistem dapat mengirim pesan ke pemilik, seperti WM_CANCELMODE dan WM_ENABLE, seperti halnya saat membuat kotak dialog modal. Jendela pemilik harus melakukan tindakan apa pun yang diminta oleh pesan-pesan ini.

Kotak dialog modal harus berupa jendela pop-up yang memiliki menu jendela, bilah judul, dan batas tebal; yaitu, templat kotak dialog harus menentukan gaya WS_POPUP, WS_SYSMENU, WS_CAPTION, dan DS_MODALFRAME . Meskipun aplikasi dapat menunjuk gaya WS_VISIBLE , sistem selalu menampilkan kotak dialog modal terlepas dari apakah templat kotak dialog menentukan gaya WS_VISIBLE . Aplikasi tidak boleh membuat kotak dialog modal yang memiliki gaya WS_CHILD . Kotak dialog modal dengan gaya ini menonaktifkan dirinya sendiri, mencegah input berikutnya mencapai aplikasi.

Aplikasi membuat kotak dialog modal dengan menggunakan fungsi DialogBox atau DialogBoxIndirect . Kotak Dialog memerlukan nama atau pengidentifikasi sumber daya yang berisi templat kotak dialog; DialogBoxIndirect memerlukan handel ke objek memori yang berisi templat kotak dialog. Fungsi DialogBoxParam dan DialogBoxIndirectParam juga membuat kotak dialog modal; mereka identik dengan fungsi yang disebutkan sebelumnya tetapi meneruskan parameter tertentu ke prosedur kotak dialog saat kotak dialog dibuat.

Saat membuat kotak dialog modal, sistem menjadikannya jendela aktif. Kotak dialog tetap aktif hingga prosedur kotak dialog memanggil fungsi EndDialog atau sistem mengaktifkan jendela di aplikasi lain. Baik pengguna maupun aplikasi tidak dapat membuat jendela pemilik aktif sampai kotak dialog modal dihancurkan.

Ketika jendela pemilik belum dinonaktifkan, sistem secara otomatis menonaktifkan jendela dan jendela anak mana pun miliknya ketika membuat kotak dialog modal. Jendela pemilik tetap dinonaktifkan hingga kotak dialog dihancurkan. Meskipun prosedur kotak dialog berpotensi mengaktifkan jendela pemilik kapan saja, memungkinkan pemilik mengalahkan tujuan kotak dialog modal dan tidak disarankan. Ketika prosedur kotak dialog dihancurkan, sistem mengaktifkan jendela pemilik lagi, tetapi hanya jika kotak dialog modal menyebabkan pemilik dinonaktifkan.

Saat sistem membuat kotak dialog modal, sistem mengirimkan pesan WM_CANCELMODE ke jendela (jika ada) yang saat ini menangkap input mouse. Aplikasi yang menerima pesan ini harus melepaskan tangkapan mouse sehingga pengguna dapat memindahkan mouse dalam kotak dialog modal. Karena sistem menonaktifkan jendela pemilik, semua input mouse hilang jika pemilik gagal melepaskan mouse saat menerima pesan ini.

Untuk memproses pesan untuk kotak dialog modal, sistem memulai perulangan pesannya sendiri, mengambil kontrol sementara dari antrean pesan untuk seluruh aplikasi. Ketika sistem mengambil pesan yang tidak secara eksplisit untuk kotak dialog, sistem mengirimkan pesan ke jendela yang sesuai. Jika mengambil pesan WM_QUIT , pesan akan dikirim kembali ke antrean pesan aplikasi sehingga perulangan pesan utama aplikasi akhirnya dapat mengambil pesan.

Sistem mengirim pesan WM_ENTERIDLE ke jendela pemilik setiap kali antrean pesan aplikasi kosong. Aplikasi dapat menggunakan pesan ini untuk melakukan tugas latar belakang saat kotak dialog tetap berada di layar. Ketika aplikasi menggunakan pesan dengan cara ini, aplikasi harus sering menghasilkan kontrol (misalnya, dengan menggunakan fungsi PeekMessage ) sehingga kotak dialog modal dapat menerima input pengguna apa pun. Untuk mencegah kotak dialog modal mengirim pesan WM_ENTERIDLE , aplikasi dapat menentukan gaya DS_NOIDLEMSG saat membuat kotak dialog.

Aplikasi menghancurkan kotak dialog modal dengan menggunakan fungsi EndDialog . Dalam kebanyakan kasus, prosedur kotak dialog memanggil EndDialog saat pengguna mengklik Tutup dari menu jendela kotak dialog atau mengklik tombol OK atau Batal dalam kotak dialog. Kotak dialog dapat mengembalikan nilai melalui fungsi Kotak Dialog (atau fungsi pembuatan lainnya) dengan menentukan nilai saat memanggil fungsi EndDialog . Sistem mengembalikan nilai ini setelah menghancurkan kotak dialog. Sebagian besar aplikasi menggunakan nilai pengembalian ini untuk menentukan apakah kotak dialog berhasil menyelesaikan tugasnya atau dibatalkan oleh pengguna. Sistem tidak mengembalikan kontrol dari fungsi yang membuat kotak dialog hingga prosedur kotak dialog memanggil fungsi EndDialog .

Kotak Dialog Tanpa Mode

Kotak dialog tanpa mode harus berupa jendela pop-up yang memiliki menu jendela, bilah judul, dan batas tipis; artinya, templat kotak dialog harus menentukan gaya WS_POPUP, WS_CAPTION, WS_BORDER, dan WS_SYSMENU . Sistem tidak secara otomatis menampilkan kotak dialog kecuali templat menentukan gaya WS_VISIBLE .

Aplikasi membuat kotak dialog tanpa mode dengan menggunakan fungsi CreateDialog atau CreateDialogIndirect . CreateDialog memerlukan nama atau pengidentifikasi sumber daya yang berisi templat kotak dialog; CreateDialogIndirect memerlukan handel ke objek memori yang berisi templat kotak dialog. Dua fungsi lainnya, CreateDialogParam dan CreateDialogIndirectParam, juga membuat kotak dialog tanpa mode; mereka meneruskan parameter tertentu ke prosedur kotak dialog saat kotak dialog dibuat.

CreateDialog dan fungsi pembuatan lainnya mengembalikan handel jendela ke kotak dialog. Aplikasi dan prosedur kotak dialog dapat menggunakan handel ini untuk mengelola kotak dialog. Misalnya, jika WS_VISIBLE tidak ditentukan dalam templat kotak dialog, aplikasi dapat menampilkan kotak dialog dengan meneruskan handel jendela ke fungsi ShowWindow .

Kotak dialog tanpa mode tidak menonaktifkan jendela pemilik atau mengirim pesan ke dalamnya. Saat membuat kotak dialog, sistem menjadikannya jendela aktif, tetapi pengguna atau aplikasi dapat mengubah jendela aktif kapan saja. Jika kotak dialog menjadi tidak aktif, kotak dialog tetap berada di atas jendela pemilik dalam urutan Z, bahkan jika jendela pemilik aktif.

Aplikasi ini bertanggung jawab untuk mengambil dan mengirimkan pesan input ke kotak dialog. Sebagian besar aplikasi menggunakan perulangan pesan utama untuk ini. Namun, untuk mengizinkan pengguna pindah ke dan memilih kontrol dengan menggunakan keyboard, aplikasi harus memanggil fungsi IsDialogMessage . Untuk informasi selengkapnya tentang fungsi ini, lihat Antarmuka Keyboard Kotak Dialog.

Kotak dialog tanpa mode tidak dapat mengembalikan nilai ke aplikasi sebagai kotak dialog modal, tetapi prosedur kotak dialog dapat mengirim informasi ke jendela pemilik dengan menggunakan fungsi SendMessage .

Aplikasi harus menghancurkan semua kotak dialog tanpa mode sebelum mengakhiri. Ini dapat menghancurkan kotak dialog tanpa mode dengan menggunakan fungsi DestroyWindow . Dalam kebanyakan kasus, prosedur kotak dialog memanggil DestroyWindow sebagai respons terhadap input pengguna, seperti mengklik tombol Batalkan . Jika pengguna tidak pernah menutup kotak dialog dengan cara ini, aplikasi harus memanggil DestroyWindow.

DestroyWindow membatalkan handel jendela ke kotak dialog, sehingga setiap panggilan berikutnya ke fungsi yang menggunakan nilai kesalahan pengembalian handel. Untuk mencegah kesalahan, prosedur kotak dialog harus memberi tahu pemilik bahwa kotak dialog telah dihancurkan. Banyak aplikasi mempertahankan variabel global yang berisi handel ke kotak dialog. Ketika prosedur kotak dialog menghancurkan kotak dialog, itu juga mengatur variabel global ke NULL, menunjukkan bahwa kotak dialog tidak lagi valid.

Prosedur kotak dialog tidak boleh memanggil fungsi EndDialog untuk menghancurkan kotak dialog tanpa mode.

Templat Kotak Dialog

Templat kotak dialog adalah data biner yang menjelaskan kotak dialog, menentukan tinggi, lebar, gaya, dan kontrol yang dikandungnya. Untuk membuat kotak dialog, sistem memuat templat kotak dialog dari sumber daya dalam file yang dapat dieksekusi aplikasi atau menggunakan templat yang diteruskan ke dalam memori global oleh aplikasi. Dalam kedua kasus, aplikasi harus menyediakan templat saat membuat kotak dialog.

Pengembang membuat sumber daya templat dengan menggunakan pengkompilasi sumber daya atau editor kotak dialog. Pengkompilasi sumber daya mengonversi deskripsi teks menjadi sumber daya biner, dan editor kotak dialog menyimpan kotak dialog yang dibangun secara interaktif sebagai sumber daya biner.

Catatan

Penjelasan tentang cara membuat sumber daya templat dan menambahkannya ke file yang dapat dieksekusi aplikasi berada di luar cakupan gambaran umum ini. Untuk informasi selengkapnya tentang membuat sumber daya templat dan menambahkannya ke file yang dapat dieksekusi, lihat dokumentasi yang disediakan dengan alat pengembangan aplikasi Anda.

 

Untuk membuat kotak dialog tanpa menggunakan sumber daya templat, Anda harus membuat templat dalam memori dan meneruskannya ke fungsi CreateDialogIndirectParam atau DialogBoxIndirectParam , atau ke makro CreateDialogIndirect atau DialogBoxIndirect .

Templat kotak dialog dalam memori terdiri dari header yang menjelaskan kotak dialog, diikuti oleh satu atau beberapa blok data tambahan yang menjelaskan setiap kontrol dalam kotak dialog. Templat dapat menggunakan format standar atau format yang diperluas. Dalam templat standar, header adalah struktur DLGTEMPLATE diikuti oleh array dengan panjang variabel tambahan; dan data untuk setiap kontrol terdiri dari struktur DLGITEMTEMPLATE diikuti oleh array panjang variabel tambahan. Dalam templat kotak dialog yang diperluas, header menggunakan format DLGTEMPLATEEX dan definisi kontrol menggunakan format DLGITEMTEMPLATEEX .

Anda dapat membuat templat memori dengan mengalokasikan objek memori global dan mengisinya dengan definisi header dan kontrol standar atau diperluas. Templat memori identik dalam bentuk dan konten ke sumber daya templat. Banyak aplikasi yang menggunakan templat memori terlebih dahulu menggunakan fungsi LoadResource untuk memuat sumber daya templat ke dalam memori, lalu memodifikasi sumber daya yang dimuat untuk membuat templat memori baru. Untuk informasi selengkapnya tentang membuat templat kotak dialog dalam memori, lihat Templat di Memori.

Bagian berikut ini menjelaskan gaya, pengukuran, dan nilai lain yang digunakan dalam templat kotak dialog.

Gaya Templat Kotak Dialog

Setiap templat kotak dialog menentukan kombinasi nilai gaya yang menentukan tampilan dan fitur kotak dialog. Nilai gaya bisa berupa gaya jendela, seperti WS_POPUP dan WS_SYSMENU, dan gaya kotak dialog, seperti DS_MODALFRAME. Jumlah dan jenis gaya untuk templat bergantung pada jenis dan tujuan kotak dialog. Untuk daftar nilai, lihat Gaya Kotak Dialog.

Sistem meneruskan semua gaya jendela yang ditentukan dalam templat ke fungsi CreateWindowEx saat membuat kotak dialog. Sistem mungkin melewati satu atau beberapa gaya yang diperluas tergantung pada gaya kotak dialog yang ditentukan. Misalnya, saat templat menentukan DS_MODALFRAME, sistem menggunakan WS_EX_DLGMODALFRAME saat membuat kotak dialog.

Sebagian besar kotak dialog adalah jendela pop-up yang memiliki menu jendela dan bilah judul. Oleh karena itu, templat umum menentukan gaya WS_POPUP, WS_SYSMENU, dan WS_CAPTION . Templat juga menentukan gaya batas: WS_BORDER untuk kotak dialog tanpa mode, dan DS_MODALFRAME untuk kotak dialog modal. Templat dapat menentukan jenis jendela selain pop-up (seperti WS_OVERLAPPED) jika membuat jendela yang dikustomisasi alih-alih kotak dialog.

Sistem selalu menampilkan kotak dialog modal terlepas dari apakah gaya WS_VISIBLE ditentukan. Saat templat untuk kotak dialog tanpa mode menentukan gaya WS_VISIBLE , sistem secara otomatis menampilkan kotak dialog saat dibuat. Jika tidak, aplikasi bertanggung jawab untuk menampilkan kotak dialog dengan menggunakan fungsi ShowWindow .

Pengukuran Kotak Dialog

Setiap templat kotak dialog berisi pengukuran yang menentukan posisi, lebar, dan tinggi kotak dialog dan kontrol yang dikandungnya. Pengukuran ini independen untuk perangkat, sehingga aplikasi dapat menggunakan satu templat untuk membuat kotak dialog yang sama untuk semua jenis perangkat tampilan. Ini memastikan bahwa kotak dialog akan memiliki proporsi dan tampilan yang sama di semua layar meskipun resolusi dan rasio aspek yang berbeda antara layar.

Pengukuran dalam templat kotak dialog ditentukan dalam unit templat dialog. Untuk mengonversi pengukuran dari unit templat dialog ke unit layar (piksel), gunakan fungsi MapDialogRect , yang memperhitungkan font yang digunakan oleh kotak dialog dan mengonversi persegi panjang dengan benar dari unit templat dialog menjadi piksel. Untuk kotak dialog yang menggunakan font sistem, Anda dapat menggunakan fungsi GetDialogBaseUnits untuk melakukan perhitungan konversi sendiri, meskipun menggunakan MapDialogRect lebih sederhana.

Templat harus menentukan koordinat awal sudut kiri atas kotak dialog. Biasanya koordinat relatif terhadap sudut kiri atas area klien jendela pemilik. Saat templat menentukan gaya DS_ABSALIGN atau kotak dialog tidak memiliki pemilik, posisi relatif terhadap sudut kiri atas layar. Sistem mengatur posisi awal ini saat membuat kotak dialog, tetapi mengizinkan aplikasi untuk menyesuaikan posisi sebelum menampilkan kotak dialog. Misalnya, aplikasi dapat mengambil dimensi jendela pemilik, menghitung posisi baru yang memusatkan kotak dialog di jendela pemilik, lalu mengatur posisi dengan menggunakan fungsi SetWindowPos .

Templat harus menentukan lebar dan tinggi kotak dialog yang tidak melebihi lebar dan tinggi layar dan memastikan bahwa semua kontrol berada dalam area klien kotak dialog. Meskipun sistem mengizinkan kotak dialog untuk berukuran apa pun, membuat kotak dialog yang terlalu kecil atau terlalu besar dapat mencegah pengguna memberikan input, mengalahkan tujuan kotak dialog. Banyak aplikasi menggunakan lebih dari satu kotak dialog ketika ada sejumlah besar kontrol. Dalam kasus seperti itu, kotak dialog awal biasanya berisi satu atau beberapa tombol yang dapat dipilih pengguna untuk menampilkan kotak dialog berikutnya.

Kontrol Kotak Dialog

Templat menentukan posisi, lebar, tinggi, gaya, pengidentifikasi, dan kelas jendela untuk setiap kontrol dalam kotak dialog. Sistem membuat setiap kontrol dengan meneruskan data ini ke fungsi CreateWindowEx . Kontrol dibuat sesuai urutan yang ditentukan dalam templat. Templat harus menentukan nomor, jenis, dan urutan kontrol yang sesuai untuk memastikan bahwa pengguna dapat memasukkan input yang diperlukan untuk menyelesaikan tugas yang terkait dengan kotak dialog.

Untuk setiap kontrol, templat menentukan nilai gaya yang menentukan tampilan dan pengoperasian kontrol. Setiap kontrol adalah jendela anak dan oleh karena itu harus memiliki gaya WS_CHILD . Untuk memastikan bahwa kontrol terlihat saat kotak dialog ditampilkan, setiap kontrol juga harus memiliki gaya WS_VISIBLE . Gaya jendela lain yang umum digunakan adalah WS_BORDER untuk kontrol yang memiliki batas opsional, WS_DISABLED untuk kontrol yang harus dinonaktifkan saat kotak dialog awalnya dibuat, dan WS_TABSTOP dan WS_GROUP untuk kontrol yang dapat diakses menggunakan keyboard. Gaya WS_TABSTOP dan WS_GROUP digunakan bersama dengan antarmuka keyboard dialog yang dijelaskan nanti dalam topik ini.

Templat juga dapat menentukan gaya kontrol khusus untuk kelas jendela kontrol. Misalnya, templat yang menentukan kontrol tombol harus memberikan gaya kontrol tombol seperti BS_PUSHBUTTON atau BS_CHECKBOX. Sistem meneruskan gaya kontrol ke prosedur jendela kontrol melalui pesan WM_CREATE , memungkinkan prosedur untuk menyesuaikan tampilan dan pengoperasian kontrol.

Sistem mengonversi koordinat posisi dan pengukuran lebar dan tinggi dari unit dasar dialog ke piksel, sebelum meneruskannya ke CreateWindowEx. Ketika sistem membuat kontrol, sistem menentukan kotak dialog sebagai jendela induk. Ini berarti sistem selalu menginterpretasikan koordinat posisi kontrol sebagai koordinat klien, relatif terhadap sudut kiri atas area klien kotak dialog.

Templat menentukan kelas jendela untuk setiap kontrol. Kotak dialog umum berisi kontrol milik kelas jendela kontrol yang telah ditentukan sebelumnya, seperti tombol dan kelas jendela kontrol edit. Dalam hal ini, templat menentukan kelas jendela dengan menyediakan nilai atom yang telah ditentukan sebelumnya yang sesuai untuk kelas. Saat kotak dialog berisi kontrol milik kelas jendela kontrol kustom, templat memberikan nama kelas jendela terdaftar atau nilai atom yang saat ini terkait dengan nama.

Setiap kontrol dalam kotak dialog harus memiliki pengidentifikasi unik untuk membedakannya dari kontrol lain. Kontrol mengirim informasi ke prosedur kotak dialog melalui pesan WM_COMMAND , sehingga pengidentifikasi kontrol sangat penting bagi prosedur untuk menentukan kontrol mana yang mengirim pesan tertentu. Satu-satunya pengecualian untuk aturan ini adalah pengidentifikasi kontrol untuk kontrol statis. Kontrol statis tidak memerlukan pengidentifikasi unik karena tidak mengirim pesan WM_COMMAND .

Untuk mengizinkan pengguna menutup kotak dialog, templat harus menentukan setidaknya satu tombol tekan dan memberinya pengidentifikasi kontrol IDCANCEL. Untuk mengizinkan pengguna memilih antara menyelesaikan atau membatalkan tugas yang terkait dengan kotak dialog, templat harus menentukan dua tombol tekan, berlabel OK dan Batal, dengan pengidentifikasi kontrol IDOK dan IDCANCEL, masing-masing.

Templat juga menentukan teks opsional dan data pembuatan untuk kontrol. Teks biasanya menyediakan label untuk kontrol tombol atau menentukan konten awal kontrol teks statis. Data pembuatan adalah satu atau beberapa byte data yang diteruskan sistem ke prosedur jendela kontrol saat membuat kontrol. Data pembuatan berguna untuk kontrol yang memerlukan informasi lebih lanjut tentang konten atau gaya awalnya daripada yang ditentukan oleh data lain. Misalnya, aplikasi dapat menggunakan data pembuatan untuk mengatur pengaturan dan rentang awal untuk kontrol bilah gulir.

Menu Jendela Kotak Dialog

Sistem memberi kotak dialog menu jendela saat templat menentukan gaya WS_SYSMENU . Untuk mencegah input yang tidak pantas, sistem secara otomatis menonaktifkan semua item di menu kecuali Pindahkan dan Tutup. Pengguna dapat mengklik Pindahkan untuk memindahkan kotak dialog. Saat pengguna mengklik Tutup, sistem mengirim pesan WM_COMMAND ke prosedur kotak dialog dengan parameter wParam diatur ke IDCANCEL. Ini identik dengan pesan yang dikirim oleh tombol Batal saat pengguna mengkliknya. Tindakan yang direkomendasikan untuk pesan ini adalah menutup kotak dialog dan membatalkan tugas yang diminta.

Meskipun menu lain dalam kotak dialog tidak disarankan, templat kotak dialog dapat menentukan menu dengan menyediakan pengidentifikasi atau nama sumber daya menu. Dalam hal ini, sistem memuat sumber daya dan membuat menu untuk kotak dialog. Aplikasi biasanya menggunakan pengidentifikasi menu atau nama dalam templat saat menggunakan templat untuk membuat jendela kustom daripada kotak dialog.

Font Kotak Dialog

Sistem menggunakan lebar karakter rata-rata font kotak dialog untuk menghitung posisi dan dimensi kotak dialog. Secara default, sistem menggambar semua teks dalam kotak dialog menggunakan font SYSTEM_FONT .

Untuk menentukan font untuk kotak dialog selain default, Anda harus membuat kotak dialog menggunakan templat kotak dialog. Dalam sumber daya templat, gunakan Pernyataan FONT. Dalam templat kotak dialog, atur gaya DS_SETFONT atau DS_SHELLFONT dan tentukan ukuran titik dan nama typeface. Meskipun templat kotak dialog menentukan font dengan cara ini, sistem selalu menggunakan font sistem untuk judul kotak dialog dan menu kotak dialog.

Saat kotak dialog memiliki gaya DS_SETFONT atau DS_SHELLFONT , sistem mengirim pesan WM_SETFONT ke prosedur kotak dialog dan ke setiap kontrol saat membuat kontrol. Prosedur kotak dialog bertanggung jawab untuk menyimpan handel font yang diteruskan dengan pesan WM_SETFONT dan memilih handel ke konteks perangkat tampilan setiap kali menulis teks ke jendela. Kontrol yang telah ditentukan sebelumnya melakukan ini secara default.

Fonta sistem dapat bervariasi di antara versi Windows yang berbeda. Agar aplikasi Anda menggunakan font sistem apa pun sistem yang dijalankannya, gunakan DS_SHELLFONT dengan typeface MS Shell Dlg, dan gunakan Sumber Daya DIALOGEX alih-alih Sumber Daya DIALOG. Sistem memetakan typeface ini sehingga kotak dialog Anda akan menggunakan font Tahoma. Perhatikan bahwa DS_SHELLFONT tidak berpengaruh jika typeface bukan MS Shell Dlg.

Templat dalam Memori

Templat kotak dialog dalam memori terdiri dari header yang menjelaskan kotak dialog, diikuti oleh satu atau beberapa blok data tambahan yang menjelaskan setiap kontrol dalam kotak dialog. Templat dapat menggunakan format standar atau format yang diperluas. Dalam templat standar, header adalah struktur DLGTEMPLATE diikuti oleh array dengan panjang variabel tambahan. Data untuk setiap kontrol terdiri dari struktur DLGITEMTEMPLATE diikuti oleh array panjang variabel tambahan. Dalam templat kotak dialog yang diperluas, header menggunakan format DLGTEMPLATEEX dan definisi kontrol menggunakan format DLGITEMTEMPLATEEX .

Untuk membedakan antara templat standar dan templat yang diperluas, centang 16-bit pertama templat kotak dialog. Dalam templat yang diperluas, WORD pertama adalah 0xFFFF; nilai lain menunjukkan templat standar.

Jika Anda membuat templat dialog dalam memori, Anda harus memastikan bahwa masing-masing definisi kontrol DLGITEMTEMPLATE atau DLGITEMTEMPLATEEX selaras pada batas DWORD . Selain itu, setiap data pembuatan yang mengikuti definisi kontrol harus diselaraskan pada batas DWORD . Semua array panjang variabel lainnya dalam templat kotak dialog harus diratakan pada batas WORD .

Header Templat

Dalam kotak dialog templat standar dan yang diperluas, header menyertakan informasi umum berikut ini:

  • Lokasi dan dimensi kotak dialog
  • Gaya jendela dan kotak dialog untuk kotak dialog
  • Jumlah kontrol dalam kotak dialog. Nilai ini menentukan jumlah definisi kontrol DLGITEMTEMPLATE atau DLGITEMTEMPLATEEX dalam templat.
  • Sumber daya menu opsional untuk kotak dialog. Templat dapat menunjukkan bahwa kotak dialog tidak memiliki menu, atau dapat menentukan nilai ordinal atau string Unicode yang dihentikan null yang mengidentifikasi sumber daya menu dalam file yang dapat dieksekusi.
  • Kelas jendela kotak dialog. Ini dapat berupa kelas kotak dialog yang telah ditentukan sebelumnya, atau nilai ordinal atau string Unicode yang dihentikan null yang mengidentifikasi kelas jendela terdaftar.
  • Untai (karakter) Unicode yang dihentikan null yang menentukan judul untuk jendela kotak dialog. Jika string kosong, bilah judul kotak dialog kosong. Jika kotak dialog tidak memiliki gaya WS_CAPTION , sistem mengatur judul ke string yang ditentukan tetapi tidak menampilkannya.
  • Jika kotak dialog memiliki gaya DS_SETFONT , header menentukan ukuran titik dan nama typeface font yang akan digunakan untuk teks di area klien dan kontrol kotak dialog.

Dalam templat yang diperluas, header DLGTEMPLATEEX juga menentukan informasi tambahan berikut:

  • Pengidentifikasi konteks bantuan dari jendela kotak dialog saat sistem mengirim pesan WM_HELP .
  • Jika kotak dialog memiliki gaya DS_SETFONT atau DS_SHELLFONT , header menentukan bobot font dan menunjukkan apakah font miring.

Definisi Kontrol

Mengikuti header templat adalah satu atau beberapa definisi kontrol yang menjelaskan kontrol kotak dialog. Dalam templat standar dan yang diperluas, header kotak dialog memiliki anggota yang menunjukkan jumlah definisi kontrol dalam templat. Dalam templat standar, setiap definisi kontrol terdiri dari struktur DLGITEMTEMPLATE diikuti oleh array panjang variabel tambahan. Dalam templat yang diperluas, definisi kontrol menggunakan format DLGITEMTEMPLATEEX .

Dalam templat standar dan yang diperluas, definisi kontrol menyertakan informasi berikut:

  • Lokasi dan dimensi kontrol.
  • Jendela dan gaya kontrol untuk kontrol.
  • Pengidentifikasi kontrol.
  • Kelas jendela kontrol. Ini dapat berupa nilai ordinal dari kelas sistem yang telah ditentukan sebelumnya atau string Unicode yang dihentikan null yang menentukan nama kelas jendela terdaftar.
  • String Unicode null-terminated yang menentukan teks awal kontrol, atau nilai ordinal yang mengidentifikasi sumber daya, seperti ikon, dalam file yang dapat dieksekusi.
  • Blok panjang variabel opsional dari data pembuatan. Ketika sistem membuat kontrol, sistem meneruskan penunjuk ke data ini dalam parameter lParam dari pesan WM_CREATE yang dikirim ke kontrol.

Dalam templat yang diperluas, definisi kontrol juga menentukan pengidentifikasi konteks bantuan untuk kontrol saat sistem mengirim pesan WM_HELP .