Bagikan melalui


Pertimbangan Pemrograman Kotak Dialog

Gambaran umum ini membahas beberapa pertimbangan pemrograman mengenai kotak dialog.

Gambaran umum mencakup topik berikut.

Prosedur Kotak Dialog

Prosedur kotak dialog mirip dengan prosedur jendela di mana sistem mengirim pesan ke prosedur ketika memiliki informasi untuk diberikan atau tugas untuk dilakukan. Tidak seperti prosedur jendela, prosedur kotak dialog tidak pernah memanggil fungsi DefWindowProc. Sebaliknya, mengembalikan TRUE jika memproses pesan atau FALSE jika tidak.

Setiap prosedur kotak dialog memiliki formulir berikut:

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
 
        // Place message cases here. 
 
        default: 
            return FALSE; 
    } 
}

Parameter prosedur melayani tujuan yang sama seperti dalam prosedur jendela, dengan parameter hwndDlg menerima handel jendela kotak dialog.

Sebagian besar prosedur kotak dialog memproses pesan WM_INITDIALOG dan pesan WM_COMMAND yang dikirim oleh kontrol, tetapi memproses beberapa jika ada pesan lain. Jika prosedur kotak dialog tidak memproses pesan, itu harus mengembalikan FALSE untuk mengarahkan sistem untuk memproses pesan secara internal. Satu-satunya pengecualian untuk aturan ini adalah pesan WM_INITDIALOG . Prosedur kotak dialog harus mengembalikan TRUE untuk mengarahkan sistem untuk memproses pesan WM_INITDIALOG lebih lanjut. Bagaimanapun, prosedur tidak boleh memanggil DefWindowProc.

Pesan WM_INITDIALOG

Sistem tidak mengirim pesan WM_CREATE ke prosedur kotak dialog. Sebaliknya, ia mengirim pesan WM_INITDIALOG saat membuat kotak dialog dan semua kontrolnya tetapi sebelum menampilkan kotak dialog. Prosedur harus melakukan inisialisasi apa pun yang diperlukan untuk memastikan bahwa kotak dialog menampilkan pengaturan saat ini yang terkait dengan tugas. Misalnya, ketika kotak dialog berisi kontrol untuk menampilkan drive dan direktori saat ini, prosedur harus menentukan drive dan direktori saat ini dan mengatur kontrol ke nilai tersebut.

Prosedur ini dapat menginisialisasi kontrol dengan menggunakan fungsi seperti SetDlgItemText dan CheckDlgButton. Karena kontrol adalah jendela, prosedur juga dapat memanipulasinya dengan menggunakan fungsi manajemen jendela seperti EnableWindow dan SetFocus. Prosedur ini dapat mengambil handel jendela ke kontrol dengan menggunakan fungsi GetDlgItem.

Prosedur kotak dialog dapat mengubah konten, status, dan posisi kontrol apa pun sesuai kebutuhan. Misalnya, dalam kotak dialog yang berisi kotak daftar nama file dan tombol Buka , prosedur dapat menonaktifkan tombol Buka hingga pengguna memilih file dari daftar. Dalam contoh ini, templat kotak dialog menentukan gaya WS_DISABLED untuk tombol Buka dan sistem secara otomatis menonaktifkan tombol saat membuatnya. Saat prosedur kotak dialog menerima pesan pemberitahuan dari kotak daftar yang menunjukkan bahwa pengguna telah memilih file, prosedur memanggil fungsi EnableWindow untuk mengaktifkan tombol Buka.

Untuk menampilkan ikon kustom pada bilah keterangan kotak dialog, handler WM_INITDIALOG Anda bisa mengirim pesan WM_SETICON ke kotak dialog.

Jika aplikasi membuat kotak dialog dengan menggunakan salah satu fungsi DialogBoxParam, DialogBoxIndirectParam, CreateDialogParam, atau CreateDialogIndirectParam, parameter lParam untuk pesan WM_INITDIALOG berisi parameter tambahan yang diteruskan ke fungsi. Aplikasi biasanya menggunakan parameter tambahan ini untuk meneruskan penunjuk ke informasi inisialisasi tambahan ke prosedur kotak dialog, tetapi prosedur kotak dialog harus menentukan arti parameter. Jika aplikasi menggunakan fungsi lain untuk membuat kotak dialog, sistem mengatur parameter lParam ke NULL.

Sebelum kembali dari pesan WM_INITDIALOG , prosedur harus menentukan apakah harus mengatur fokus input ke kontrol yang ditentukan. Jika prosedur kotak dialog mengembalikan TRUE, sistem secara otomatis mengatur fokus input ke kontrol yang handel jendelanya ada di parameter wParam . Jika kontrol yang menerima fokus default tidak sesuai, kontrol dapat mengatur fokus ke kontrol yang sesuai dengan menggunakan fungsi SetFocus. Jika prosedur mengatur fokus input, itu harus mengembalikan FALSE untuk mencegah sistem mengatur fokus default. Kontrol yang menerima fokus input default selalu merupakan kontrol pertama yang ditentukan dalam templat yang terlihat, tidak dinonaktifkan, dan memiliki gaya WS_TABSTOP . Jika tidak ada kontrol seperti itu, sistem mengatur fokus input default ke kontrol pertama dalam templat.

Pesan WM_COMMAND

Kontrol dapat mengirim pesan WM_COMMAND ke prosedur kotak dialog saat pengguna melakukan tindakan dalam kontrol. Pesan-pesan ini, yang disebut pesan pemberitahuan, menginformasikan prosedur input pengguna dan mengizinkannya untuk melakukan respons yang sesuai.

Semua kontrol yang telah ditentukan sebelumnya, kecuali kontrol statis, mengirim pesan pemberitahuan untuk tindakan pengguna yang dipilih. Misalnya, tombol tekan mengirimkan pesan pemberitahuan BN_CLICKED setiap kali pengguna mengklik tombol . Dalam semua kasus, kata berurutan rendah dari parameter wParam berisi pengidentifikasi kontrol, kata urutan tinggi wParam berisi kode pemberitahuan, dan parameter lParam berisi handel jendela kontrol.

Prosedur kotak dialog harus memantau dan memproses pesan pemberitahuan. Secara khusus, prosedur harus memproses pesan yang memiliki pengidentifikasi IDOK atau IDCANCEL; pesan ini mewakili permintaan oleh pengguna untuk menutup kotak dialog. Prosedur harus menutup kotak dialog dengan menggunakan fungsi EndDialog untuk kotak dialog modal dan kotak dialog DestroyWindow untuk kotak dialog tanpa mode.

Sistem juga mengirim pesan WM_COMMAND ke prosedur kotak dialog jika kotak dialog memiliki menu, seperti menu jendela, dan pengguna mengklik item menu. Secara khusus, sistem mengirim pesan WM_COMMAND dengan parameter wParam diatur ke IDCANCEL setiap kali pengguna mengklik Tutup di menu jendela kotak dialog. Pesan hampir identik dengan pesan pemberitahuan yang dikirim oleh tombol Batalkan dan harus diproses dengan cara yang sama persis.

Pesan WM_PARENTNOTIFY

Kontrol mengirim pesan WM_PARENTNOTIFY setiap kali pengguna menekan tombol mouse saat menunjuk ke kontrol. Beberapa aplikasi menafsirkan pesan ini sebagai sinyal untuk melakukan tindakan yang terkait dengan kontrol, seperti menampilkan baris teks yang menjelaskan tujuan kontrol.

Sistem juga mengirim pesan WM_PARENTNOTIFY saat membuat dan menghancurkan jendela, tetapi tidak untuk kontrol yang dibuat dari templat kotak dialog. Sistem mencegah pesan ini dengan menentukan gaya WS_EX_NOPARENTNOTIFY saat membuat kontrol. Aplikasi tidak dapat mengambil alih perilaku default ini kecuali membuat kontrolnya sendiri untuk kotak dialog.

Pesan Warna Kontrol

Kontrol dan sistem dapat mengirim pesan warna kontrol ketika mereka ingin prosedur kotak dialog melukis latar belakang kontrol atau jendela lain dengan menggunakan kuas dan warna tertentu. Ini dapat berguna ketika aplikasi mengambil alih warna default yang digunakan dalam kotak dialog dan kontrolnya. Berikut ini adalah pesan warna kontrol, yang telah menggantikan pesan WM_CTLCOLOR .

Kontrol mengirimkan pesan warna kontrol ke prosedur kotak dialog tepat sebelum melukis latar belakangnya sendiri. Pesan memungkinkan prosedur untuk menentukan kuas mana yang akan digunakan dan untuk mengatur warna latar belakang dan latar depan. Prosedur menentukan kuas dengan mengembalikan gagang kuas. Untuk mengatur warna latar belakang dan latar depan, prosedur menggunakan fungsi SetBkColor dan SetTextColor dengan konteks perangkat tampilan kontrol. Pesan warna kontrol meneruskan handel ke konteks perangkat tampilan ke prosedur dalam parameter wParam pesan.

Sistem mengirim pesan WM_CTLCOLORDLG ke prosedur kotak dialog jika prosedur tidak memproses pesan WM_ERASEBKGND. Kelas kotak dialog yang telah ditentukan sebelumnya tidak memiliki kuas latar belakang kelas, jadi pesan ini memungkinkan prosedur menentukan latar belakangnya sendiri tanpa harus menyertakan kode untuk melakukan pekerjaan.

Bagaimanapun, ketika prosedur kotak dialog tidak memproses pesan warna kontrol, sistem menggunakan kuas dengan warna jendela default untuk mengecat latar belakang untuk semua kontrol dan jendela kecuali bilah gulir. Aplikasi dapat mengambil warna jendela default dengan meneruskan nilai COLOR_WINDOW ke fungsi GetSysColor . Saat latar belakang dicat, warna latar depan untuk konteks perangkat tampilan diatur ke warna teks default (COLOR_WINDOWTEXT). Untuk bilah gulir, sistem menggunakan kuas yang memiliki warna bilah gulir default (COLOR_SCROLLBAR). Dalam hal ini, warna latar belakang dan latar depan untuk konteks perangkat tampilan masing-masing diatur ke putih dan hitam.

Pemrosesan Pesan Default Kotak Dialog

Prosedur jendela untuk kelas kotak dialog yang telah ditentukan sebelumnya melakukan pemrosesan default untuk semua pesan yang tidak diproses oleh prosedur kotak dialog. Saat prosedur kotak dialog mengembalikan FALSE untuk pesan apa pun, prosedur jendela yang telah ditentukan sebelumnya memeriksa pesan dan melakukan tindakan default berikut:

Pesan Tindakan default
DM_GETDEFID Anda bisa mengirim pesan ini ke kotak dialog. Kotak dialog mengembalikan pengidentifikasi kontrol tombol tekan default, jika kotak dialog memilikinya; jika tidak, itu mengembalikan nol.
DM_REPOSITION Anda bisa mengirim pesan ini ke kotak dialog tingkat atas. Kotak dialog memposisikan ulang dirinya sendiri sehingga pas di dalam area desktop.
DM_SETDEFID Anda bisa mengirim pesan ini ke kotak dialog. Kotak dialog mengatur tombol dorong default ke kontrol yang ditentukan oleh pengidentifikasi kontrol dalam parameter wParam .
WM_ACTIVATE Memulihkan fokus input ke kontrol yang diidentifikasi oleh handel yang disimpan sebelumnya jika kotak dialog diaktifkan. Jika tidak, prosedur menyimpan handel ke kontrol yang memiliki fokus input.
WM_CHARTOITEM Mengembalikan nol.
WM_CLOSE Memposting pesan pemberitahuan BN_CLICKED ke kotak dialog, menentukan IDCANCEL sebagai pengidentifikasi kontrol. Jika kotak dialog memiliki pengidentifikasi kontrol IDCANCEL dan kontrol saat ini dinonaktifkan, prosedur akan menyanyikan peringatan dan tidak memposting pesan.
WM_COMPAREITEM Mengembalikan nol.
WM_ERASEBKGND Mengisi area klien kotak dialog dengan menggunakan kuas yang dikembalikan dari pesan WM_CTLCOLORDLG atau dengan warna jendela default.
WM_GETFONT Mengembalikan handel ke font kotak dialog yang ditentukan aplikasi.
WM_INITDIALOG Mengembalikan nol.
WM_LBUTTONDOWN Mengirim pesan CB_SHOWDROPDOWN ke kotak kombo yang memiliki fokus input, mengarahkan kontrol untuk menyembunyikan kotak daftar turun bawahnya. Prosedur memanggil DefWindowProc untuk menyelesaikan tindakan default.
WM_NCDESTROY Merilis memori global yang dialokasikan untuk kontrol edit dalam kotak dialog (berlaku untuk kotak dialog yang menentukan gaya DS_LOCALEDIT) dan membebaskan font yang ditentukan aplikasi apa pun (berlaku untuk kotak dialog yang menentukan gaya DS_SETFONT atau DS_SHELLFONT). Prosedur ini memanggil fungsi DefWindowProc untuk menyelesaikan tindakan default.
WM_NCLBUTTONDOWN Mengirim pesan CB_SHOWDROPDOWN ke kotak kombo yang memiliki fokus input, mengarahkan kontrol untuk menyembunyikan kotak daftar turun bawahnya. Prosedur memanggil DefWindowProc untuk menyelesaikan tindakan default.
WM_NEXTDLGCTL Mengatur fokus input ke kontrol berikutnya atau sebelumnya dalam kotak dialog, ke kontrol yang diidentifikasi oleh handel dalam parameter wParam, atau ke kontrol pertama dalam kotak dialog yang terlihat, tidak dinonaktifkan, dan memiliki gaya WS_TABSTOP. Prosedur mengabaikan pesan ini jika jendela saat ini dengan fokus input bukan kontrol.
WM_SETFOCUS Mengatur fokus input ke kontrol yang diidentifikasi oleh handel jendela kontrol yang disimpan sebelumnya. Jika tidak ada handel seperti itu, prosedur mengatur fokus input ke kontrol pertama dalam templat kotak dialog yang terlihat, tidak dinonaktifkan, dan memiliki gaya WS_TABSTOP. Jika tidak ada kontrol seperti itu, prosedur mengatur fokus input ke kontrol pertama dalam templat.
WM_SHOWWINDOW Menyimpan handel ke kontrol yang memiliki fokus input jika kotak dialog sedang disembunyikan, lalu memanggil DefWindowProc untuk menyelesaikan tindakan default.
WM_SYSCOMMAND Menyimpan handel ke kontrol yang memiliki fokus input jika kotak dialog sedang diminimalkan, lalu memanggil DefWindowProc untuk menyelesaikan tindakan default.
WM_VKEYTOITEM Mengembalikan nol.

Prosedur jendela yang telah ditentukan sebelumnya meneruskan semua pesan lain ke DefWindowProc untuk pemrosesan default.

Antarmuka Keyboard Kotak Dialog

Sistem ini menyediakan antarmuka keyboard khusus untuk kotak dialog yang melakukan pemrosesan khusus untuk beberapa kunci. Antarmuka menghasilkan pesan yang sesuai dengan tombol tertentu dalam kotak dialog atau mengubah fokus input dari satu kontrol ke kontrol lainnya. Berikut ini adalah kunci yang digunakan dalam antarmuka ini dan tindakannya masing-masing.

Tombol Perbuatan
ALT+mnemonic Memindahkan fokus input ke kontrol pertama (memiliki gaya WS_TABSTOP ) setelah kontrol statis yang berisi mnemonic yang ditentukan.
DOWN Memindahkan fokus input ke kontrol berikutnya dalam grup.
MASUKKAN Mengirim pesan WM_COMMAND ke prosedur kotak dialog. Parameter wParam diatur ke IDOK atau pengidentifikasi kontrol tombol dorong default.
ESC Mengirim pesan WM_COMMAND ke prosedur kotak dialog. Parameter wParam diatur ke IDCANCEL.
LEFT Memindahkan fokus input ke kontrol sebelumnya dalam grup.
mnemonic Memindahkan fokus input ke kontrol pertama (memiliki gaya WS_TABSTOP ) setelah kontrol statis yang berisi mnemonic yang ditentukan.
RIGHT Memindahkan fokus input ke kontrol berikutnya dalam grup.
SHIFT+TAB Memindahkan fokus input ke kontrol sebelumnya yang memiliki gaya WS_TABSTOP.
TAB Memindahkan fokus input ke kontrol berikutnya yang memiliki gaya WS_TABSTOP.
UP Memindahkan fokus input ke kontrol sebelumnya dalam grup.

Sistem secara otomatis menyediakan antarmuka keyboard untuk semua kotak dialog modal. Ini tidak menyediakan antarmuka untuk kotak dialog tanpa mode kecuali aplikasi memanggil fungsi IsDialogMessage untuk memfilter pesan dalam perulangan pesan utamanya. Ini berarti bahwa aplikasi harus meneruskan pesan ke IsDialogMessage segera setelah mengambil pesan dari antrean pesan. Fungsi memproses pesan jika untuk kotak dialog dan mengembalikan nilai bukan nol untuk menunjukkan bahwa pesan telah diproses dan tidak boleh diteruskan ke fungsi TranslateMessage atau DispatchMessage.

Karena antarmuka keyboard kotak dialog menggunakan tombol arah untuk berpindah antar kontrol dalam kotak dialog, aplikasi tidak dapat menggunakan tombol ini untuk menggulir konten kotak dialog modal apa pun atau kotak dialog tanpa mode apa pun yang isDialogMessage dipanggil. Ketika kotak dialog memiliki bilah gulir, aplikasi harus menyediakan antarmuka keyboard alternatif untuk bilah gulir. Perhatikan bahwa antarmuka mouse untuk menggulir tersedia ketika sistem menyertakan mouse.

Gaya WS_TABSTOP

Gaya WS_TABSTOP menentukan kontrol yang dapat dipindahkan pengguna dengan menekan tombol TAB atau tombol SHIFT+TAB.

Ketika pengguna menekan TAB atau SHIFT+TAB, sistem terlebih dahulu menentukan apakah tombol ini diproses oleh kontrol yang saat ini memiliki fokus input. Ini mengirim kontrol pesan WM_GETDLGCODE , dan jika kontrol mengembalikan DLGC_WANTTAB, sistem meneruskan kunci ke kontrol. Jika tidak, sistem menggunakan fungsi GetNextDlgTabItem untuk menemukan kontrol berikutnya yang terlihat, tidak dinonaktifkan, dan yang memiliki gaya WS_TABSTOP. Pencarian dimulai dengan kontrol yang saat ini memiliki fokus input dan berlanjut dalam urutan kontrol dibuat—yaitu, urutan di mana kontrol ditentukan dalam templat kotak dialog. Ketika sistem menemukan kontrol yang memiliki karakteristik yang diperlukan, sistem memindahkan fokus input ke dalamnya.

Jika pencarian kontrol berikutnya dengan gaya WS_TABSTOP menemukan jendela dengan gaya WS_EX_CONTROLPARENT, sistem secara rekursif mencari anak-anak jendela.

Aplikasi juga dapat menggunakan GetNextDlgTabItem untuk menemukan kontrol yang memiliki gaya WS_TABSTOP. Fungsi mengambil handel jendela kontrol berikutnya atau sebelumnya yang memiliki gaya WS_TABSTOP tanpa memindahkan fokus input.

Gaya WS_GROUP

Secara default, sistem memindahkan fokus input ke kontrol berikutnya atau sebelumnya setiap kali pengguna menekan tombol arah. Selama kontrol saat ini dengan fokus input tidak memproses kunci ini dan kontrol berikutnya atau sebelumnya bukan kontrol statis, sistem terus memindahkan fokus input melalui semua kontrol dalam kotak dialog saat pengguna terus menekan tombol arah.

Aplikasi dapat menggunakan gaya WS_GROUP untuk mengubah perilaku default ini. Gaya menandai awal grup kontrol. Jika kontrol dalam grup memiliki fokus input saat pengguna mulai menekan tombol arah, fokus tetap berada dalam grup. Secara umum, kontrol pertama dalam grup harus memiliki gaya WS_GROUP dan semua kontrol lain dalam grup tidak boleh memiliki gaya ini. Semua kontrol dalam grup harus berdekatan—yaitu, mereka harus dibuat secara berturut-turut tanpa kontrol intervensi.

Ketika pengguna menekan tombol arah, sistem terlebih dahulu menentukan apakah kontrol saat ini memiliki fokus input memproses tombol arah. Sistem mengirim pesan WM_GETDLGCODE ke kontrol dan jika kontrol mengembalikan nilai DLGC_WANTARROWS, meneruskan kunci ke kontrol. Jika tidak, sistem menggunakan fungsi GetNextDlggroupItem untuk menentukan kontrol berikutnya dalam grup.

GetNextDlgGroupItem mencari kontrol dalam urutan (atau urutan terbalik) yang dibuat. Jika pengguna menekan tombol RIGHT atau DOWN, GetNextDlgGroupItem mengembalikan kontrol berikutnya jika kontrol tersebut tidak memiliki gaya WS_GROUP. Jika tidak, fungsi membalikkan urutan pencarian dan mengembalikan kontrol pertama yang memiliki gaya WS_GROUP . Jika pengguna menekan tombol LEFT atau UP, fungsi mengembalikan kontrol sebelumnya kecuali kontrol saat ini sudah memiliki gaya WS_GROUP . Jika kontrol saat ini memiliki gaya ini, fungsi membalikkan urutan pencarian, menemukan kontrol pertama yang memiliki gaya WS_GROUP , dan mengembalikan kontrol yang segera mendahului kontrol yang terletak.

Jika pencarian kontrol berikutnya dalam grup menemukan jendela dengan gaya WS_EX_CONTROLPARENT , sistem secara rekursif mencari anak-anak jendela.

Setelah sistem memiliki kontrol berikutnya atau sebelumnya, sistem mengirim pesan WM_GETDLGCODE ke kontrol untuk menentukan jenis kontrol. Sistem kemudian memindahkan fokus input untuk mengontrol apakah itu bukan kontrol statis. Jika kontrol adalah tombol radio otomatis, sistem mengirimkan pesan BM_CLICK ke dalamnya. Aplikasi juga dapat menggunakan GetNextDlgGroupItem untuk menemukan kontrol dalam grup.

Umumnya, kontrol pertama dalam grup menggabungkan gaya WS_GROUP dan WS_TABSTOP sehingga pengguna dapat berpindah dari grup ke grup dengan menggunakan tombol TAB. Jika grup berisi tombol radio, aplikasi harus menerapkan gaya WS_TABSTOP hanya ke kontrol pertama dalam grup. Sistem secara otomatis memindahkan gaya saat pengguna berpindah antar kontrol dalam grup. Ini memastikan bahwa fokus input akan selalu berada pada kontrol yang terakhir dipilih saat pengguna pindah ke grup menggunakan kunci TAB.

Mnemonics

Mnemonic adalah huruf atau digit yang dipilih di label tombol atau dalam teks kontrol statis. Sistem memindahkan fokus input ke kontrol yang terkait dengan mnemonic setiap kali pengguna menekan tombol yang sesuai dengan mnemonic atau menekan tombol ini dan tombol ALT dalam kombinasi. Mnemonics menyediakan cara cepat bagi pengguna untuk berpindah ke kontrol tertentu dengan menggunakan keyboard.

Aplikasi membuat mnemonic untuk kontrol dengan menyisipkan ampersand (&) segera sebelum huruf atau digit yang dipilih di label atau teks untuk kontrol. Dalam kebanyakan kasus, string null-terminated yang disediakan dengan kontrol dalam templat kotak dialog berisi ampersand. Namun, aplikasi dapat membuat mnemonic kapan saja dengan mengganti label atau teks kontrol yang ada dengan menggunakan fungsi SetDlgItemText. Hanya satu mnemonic yang dapat ditentukan untuk setiap kontrol. Meskipun disarankan, mnemonics dalam kotak dialog tidak perlu unik.

Ketika pengguna menekan tombol huruf atau digit, sistem terlebih dahulu menentukan apakah kontrol saat ini memiliki fokus input memproses kunci. Sistem mengirim pesan WM_GETDLGCODE ke kontrol, dan jika kontrol mengembalikan nilai DLGC_WANTALLKEYS atau DLG_WANTMESSAGE, sistem meneruskan kunci ke kontrol. Jika tidak, ia mencari kontrol yang mnemonic-nya cocok dengan huruf atau digit yang ditentukan. Ini terus mencari sampai menemukan kontrol atau telah memeriksa semua kontrol. Selama pencarian, ini melewati kontrol statis yang memiliki gaya SS_NOPREFIX.

Jika pencarian kontrol dengan mnemonic yang cocok menemukan jendela dengan gaya WS_EX_CONTROLPARENT , sistem secara rekursif mencari anak-anak jendela.

Jika sistem menemukan kontrol statis dan kontrol tidak dinonaktifkan, sistem memindahkan fokus input ke kontrol pertama setelah kontrol statis yang terlihat, tidak dinonaktifkan, dan yang memiliki gaya WS_TABSTOP. Jika sistem menemukan beberapa kontrol lain yang memiliki mnemonik yang cocok, sistem akan memindahkan fokus input ke kontrol tersebut. Jika kontrol adalah tombol dorong default, sistem mengirimkan pesan pemberitahuan BN_CLICKED ke prosedur kotak dialog. Jika kontrol adalah gaya tombol lain dan tidak ada kontrol lain dalam kotak dialog yang memiliki mnemonic yang sama, sistem mengirimkan pesan BM_CLICK ke kontrol.

Pengaturan Kotak Dialog

Pengaturan kotak dialog adalah pilihan dan nilai saat ini untuk kontrol dalam kotak dialog. Prosedur kotak dialog bertanggung jawab untuk menginisialisasi kontrol ke pengaturan ini saat membuat kotak dialog. Ini juga bertanggung jawab untuk mengambil pengaturan saat ini dari kontrol sebelum menghancurkan kotak dialog. Metode yang digunakan untuk menginisialisasi dan mengambil pengaturan bergantung pada jenis kontrol.

Untuk mengetahui informasi selengkapnya, lihat topik berikut:

Tombol Radio dan Kotak Centang

Kotak dialog menggunakan tombol radio dan kotak centang untuk memungkinkan pengguna memilih dari daftar opsi. Tombol radio memungkinkan pengguna memilih dari opsi yang saling eksklusif; kotak centang biarkan pengguna memilih kombinasi opsi.

Prosedur kotak dialog dapat mengatur status awal kotak centang dengan menggunakan fungsi CheckDlgButton , yang mengatur atau menghapus kotak centang. Untuk tombol radio dalam sekelompok tombol radio yang saling eksklusif, prosedur kotak dialog dapat menggunakan fungsi CheckRadioButton untuk mengatur tombol radio yang sesuai dan secara otomatis menghapus tombol radio lainnya.

Sebelum kotak dialog berakhir, prosedur kotak dialog dapat mencentang status setiap tombol radio dan kotak centang dengan menggunakan fungsi IsDlgButtonChecked , yang mengembalikan status tombol saat ini. Kotak dialog biasanya menyimpan informasi ini untuk menginisialisasi tombol saat berikutnya membuat kotak dialog.

Kontrol Edit Kotak Dialog

Banyak kotak dialog memiliki kontrol edit yang memungkinkan pengguna menyediakan teks sebagai input. Sebagian besar prosedur kotak dialog menginisialisasi kontrol edit saat kotak dialog pertama kali dimulai. Misalnya, prosedur kotak dialog dapat menempatkan nama file yang diusulkan dalam kontrol yang kemudian dapat dipilih, dimodifikasi, atau diganti pengguna. Prosedur kotak dialog dapat mengatur teks dalam kontrol edit dengan menggunakan fungsi SetDlgItemText , yang menyalin teks dari buffer tertentu ke kontrol edit. Saat kontrol edit menerima fokus input, kontrol tersebut secara otomatis memilih teks lengkap untuk pengeditan.

Karena kontrol edit tidak secara otomatis mengembalikan teksnya ke kotak dialog, prosedur kotak dialog harus mengambil teks sebelum dihentikan. Ini dapat mengambil teks dengan menggunakan fungsi GetDlgItemText , yang menyalin teks kontrol edit ke buffer. Prosedur kotak dialog biasanya menyimpan teks ini untuk menginisialisasi kontrol edit nanti atau meneruskannya ke jendela induk untuk diproses.

Beberapa kotak dialog menggunakan kontrol edit yang memungkinkan pengguna memasukkan angka. Prosedur kotak dialog dapat mengambil angka dari kontrol edit dengan menggunakan fungsi GetDlgItemInt , yang mengambil teks dari kontrol edit dan mengonversi teks menjadi nilai desimal. Pengguna mengetikkan angka dalam digit desimal. Ini dapat ditandatangani atau tidak ditandatangani. Prosedur kotak dialog dapat menampilkan bilangan bulat dengan menggunakan fungsi SetDlgItemInt. SetDlgItemInt mengonversi bilangan bulat yang ditandatangani atau tidak ditandatangani menjadi string digit desimal.

Daftar Kotak, Kotak Kombo, dan Daftar Direktori

Beberapa kotak dialog menampilkan daftar nama tempat pengguna dapat memilih satu atau beberapa nama. Untuk menampilkan daftar nama file, misalnya, kotak dialog biasanya menggunakan kotak daftar dan fungsi DlgDirList dan DlgDirSelectEx. Fungsi DlgDirList secara otomatis mengisi kotak daftar dengan nama file di direktori saat ini. Fungsi DlgDirSelect mengambil nama file yang dipilih dari kotak daftar. Bersama-sama, kedua fungsi ini menyediakan cara mudah bagi kotak dialog untuk menampilkan daftar direktori sehingga pengguna dapat memilih file tanpa harus mengetikkan namanya dan lokasinya.

Kotak dialog juga dapat menggunakan kotak kombo untuk menampilkan daftar nama file. Fungsi DlgDirListComboBox secara otomatis mengisi bagian kotak daftar dari kotak kombo dengan nama file di direktori saat ini. Fungsi DlgDirSelectComboBoxEx mengambil nama file yang dipilih dari bagian kotak daftar.

Pesan Kontrol Kotak Dialog

Banyak kontrol mengenali pesan yang telah ditentukan sebelumnya yang, ketika diterima oleh kontrol, menyebabkan mereka melakukan beberapa tindakan. Misalnya, pesan BM_SETCHECK mengatur kotak centang dalam kotak centang dan pesan EM_GETSEL mengambil bagian teks kontrol yang saat ini dipilih. Pesan kontrol memberikan prosedur dialog akses yang lebih besar dan lebih fleksibel ke kontrol daripada fungsi standar, sehingga sering digunakan ketika kotak dialog memerlukan interaksi kompleks dengan pengguna.

Prosedur kotak dialog dapat mengirim pesan ke kontrol dengan menyediakan pengidentifikasi kontrol dan menggunakan fungsi SendDlgItemMessage, yang identik dengan fungsi SendMessage, kecuali bahwa ia menggunakan pengidentifikasi kontrol alih-alih handel jendela untuk mengidentifikasi kontrol yang menerima pesan. Pesan tertentu mungkin mengharuskan prosedur dialog mengirim parameter dengan pesan, dan pesan mungkin memiliki nilai pengembalian yang sesuai. Operasi dan persyaratan setiap pesan kontrol tergantung pada tujuan pesan dan kontrol yang memprosesnya.

Untuk informasi selengkapnya tentang pesan kontrol, lihat Kontrol Windows.

Kotak Dialog Kustom

Aplikasi dapat membuat kotak dialog kustom dengan menggunakan kelas jendela yang ditentukan aplikasi untuk kotak dialog alih-alih menggunakan kelas kotak dialog yang telah ditentukan sebelumnya. Aplikasi biasanya menggunakan metode ini ketika kotak dialog adalah jendela utamanya, tetapi juga berguna untuk membuat kotak dialog modal dan modeless untuk aplikasi yang memiliki jendela tumpang tindih standar.

Kelas jendela yang ditentukan aplikasi memungkinkan aplikasi menentukan prosedur jendela untuk kotak dialog dan memproses pesan sebelum mengirimnya ke prosedur kotak dialog. Ini juga memungkinkan aplikasi menentukan ikon kelas, kuas latar belakang kelas, dan menu kelas untuk kotak dialog. Aplikasi harus mendaftarkan kelas jendela sebelum mencoba membuat kotak dialog dan harus menyediakan templat kotak dialog dengan nilai atom atau nama kelas jendela.

Banyak aplikasi membuat kelas kotak dialog baru dengan terlebih dahulu mengambil informasi kelas untuk kelas kotak dialog yang telah ditentukan sebelumnya, dan meneruskannya ke fungsi GetClassInfo, yang mengisi struktur WNDCLASS dengan informasi. Aplikasi memodifikasi masing-masing anggota struktur, seperti nama kelas, kuas, dan ikon, lalu mendaftarkan kelas baru dengan menggunakan fungsi RegisterClass. Jika aplikasi mengisi struktur WNDCLASS sendiri, aplikasi harus mengatur anggota cbWndExtra ke DLGWINDOWEXTRA, yang merupakan jumlah byte tambahan yang diperlukan sistem untuk setiap kotak dialog. Jika aplikasi juga menggunakan byte tambahan untuk setiap kotak dialog, mereka harus berada di luar byte tambahan yang diperlukan oleh sistem.

Prosedur jendela untuk kotak dialog kustom memiliki parameter dan persyaratan yang sama dengan prosedur jendela lainnya. Namun, tidak seperti prosedur jendela lainnya, prosedur jendela untuk kotak dialog ini harus memanggil fungsi DefDlgProc alih-alih fungsi DefWindowProc untuk pesan apa pun yang tidak diproses. DefDlgProc melakukan pemrosesan pesan default yang sama dengan prosedur jendela untuk kotak dialog yang telah ditentukan sebelumnya, yang mencakup pemanggilan prosedur kotak dialog.

Aplikasi juga dapat membuat kotak dialog kustom dengan mensubkelas prosedur jendela kotak dialog yang telah ditentukan sebelumnya. Fungsi SetWindowLong memungkinkan aplikasi menentukan prosedur jendela untuk jendela tertentu. Aplikasi juga dapat mencoba subkelas dengan menggunakan fungsi SetClassLong , tetapi melakukannya memengaruhi semua kotak dialog dalam sistem, bukan hanya yang termasuk dalam aplikasi.

Aplikasi yang membuat kotak dialog kustom terkadang menyediakan antarmuka keyboard alternatif untuk kotak dialog. Untuk kotak dialog modeless, ini mungkin berarti aplikasi tidak memanggil fungsi IsDialogMessage dan sebaliknya memproses semua input keyboard dalam prosedur jendela kustom. Dalam kasus seperti itu, aplikasi dapat menggunakan pesan WM_NEXTDLGCTL untuk meminimalkan kode yang diperlukan untuk memindahkan fokus input dari satu kontrol ke kontrol lainnya. Pesan ini, ketika diteruskan ke DefDlgProc, memindahkan fokus input ke kontrol tertentu dan memperbarui tampilan kontrol, seperti memindahkan batas tombol dorong default atau mengatur tombol radio otomatis.