Ringkasan
Aplikasi berbasis Windows sering menampilkan kotak dialog entri data untuk meminta informasi dari pengguna. Kotak dialog ini mungkin berisi beberapa tombol Edit kontrol dan dua perintah (push), berlabel OK dan BATALKAN. Contoh kotak dialog entri data adalah yang meminta informasi pribadi, seperti nomor jaminan sosial, alamat, nomor identifikasi (ID), tanggal/waktu, dan seterusnya, dari pengguna. Setiap item ini dimasukkan ke dalam kontrol Edit. Secara default, tombol TAB digunakan dalam kotak dialog untuk mengalihkan fokus antar kontrol Edit. Sebagai antarmuka pengguna yang umum, Anda juga bisa menggunakan tombol ENTER (RETURN) untuk berpindah di antara kontrol pengeditan (misalnya, setelah pengguna memasukkan sepotong informasi, menekan ENTER memindahkan fokus ke bidang berikutnya). Ada beberapa cara untuk mengaktifkan penggunaan tombol ENTER untuk berpindah di antara kontrol pengeditan. Salah satu metode adalah menggunakan WM_COMMAND dan pesan pemberitahuan yang disertakan dalam kotak dialog untuk mengedit kontrol dan tombol. Metode lainnya melibatkan subkelas kontrol Edit. Sepertiga melibatkan penggunaan aplikasi studio dan panduan kelas dan membuat fungsi kotak dialog anggota baru.
Informasi Selengkapnya
Metode I: (WM_COMMAND)
Metode ini didasarkan pada perilaku berikut kotak dialog (manajer dialog) dan penanganan fokus di Windows. Jika kotak dialog atau salah satu kontrolnya saat ini memiliki fokus input, maka menekan tombol ENTER menyebabkan Windows mengirim pesan WM_COMMAND dengan parameter idItem (wParam) ke ID tombol perintah default. Jika kotak dialog tidak memiliki tombol perintah default, maka parameter idItem diatur ke IDOK secara default. Saat aplikasi menerima pesan WM_COMMAND dengan idItem diatur ke ID dari tombol perintah default, fokus tetap dengan kontrol yang memiliki fokus sebelum tombol ENTER ditekan. Memanggil GetFocus () pada titik ini mengembalikan gagang kontrol yang memiliki fokus sebelum tombol ENTER ditekan. Aplikasi ini dapat memeriksa gagang kontrol ini dan menentukan apakah itu milik salah satu kontrol pengeditan dalam kotak dialog. Jika demikian, maka pengguna memasukkan data ke dalam salah satu kontrol pengeditan dan setelah melakukannya, tekan ENTER. Pada titik ini, aplikasi dapat mengirim pesan WM_NEXTDLGCTL ke kotak dialog untuk memindahkan fokus ke kontrol berikutnya. Namun, jika fokus adalah dengan salah satu tombol perintah (BATALKAN atau OK), maka GetFocus () mengembalikan gagang kontrol tombol, di mana titik satu bisa menghilangkan kotak dialog. Kode pseudo untuk logika ini menyerupai yang berikut dalam prosedur kotak dialog aplikasi:
case WM_COMMAND: if(wParam=IDOFDEFBUTTON || IDOK) { // User has hit the ENTER key. hwndTest = GetFocus() ; retVal = TesthWnd(hWndTest) ; //Where retVal is a boolean variable that indicates whether //the hwndTest is the handle of one of the edit controls. if(hwndTest) { //Focus is with an edit control, so do not close the dialog. //Move focus to the next control in the dialog. PostMessage(hDlg, WM_NEXTDLGCTL, 0, 0L) ; return TRUE ; } else { //Focus is with the default button, so close the dialog. EndDialog(hDlg, TRUE) ; return FALSE ; } } break ;
Metode II
Metode ini melibatkan subclassing/superclassing kontrol Edit dalam kotak dialog. Setelah kontrol Edit digolongkan atau dikelompokkan, semua input keyboard dikirim ke prosedur subclass/superclass dari kontrol Edit yang saat ini memiliki fokus input, terlepas dari apakah kotak dialog memiliki tombol perintah default. Aplikasi bisa menjebak pesan bawah (atau char) utama, mencari kunci ENTER, dan melakukan pemrosesan sesuai dengan itu. Berikut ini adalah prosedur subkelas sampel yang mencari tombol ENTER:
//*------------------------------------------------------------------- //| Title: //| SubClassProc //| //| Parameters: //| hWnd - Handle to the message's destination window //| wMessage - Message number of the current message //| wParam - Additional info associated with the message //| lParam - Additional info associated with the message //| //| Purpose: //| This is the window procedure used to subclass the edit control. //*--------------------------------------------------------------------- long FAR PASCAL SubProc(HWND hWnd, WORD wMessage,WORD wParam,LONG lParam) { switch (wMessage) { case WM_GETDLGCODE: return (DLGC_WANTALLKEYS | CallWindowProc(lpOldProc, hWnd, wMessage, wParam, lParam)); case WM_CHAR: //Process this message to avoid message beeps. if ((wParam == VK_RETURN) || (wParam == VK_TAB)) return 0; else return (CallWindowProc(lpOldProc, hWnd, wMessage, wParam, lParam)); case WM_KEYDOWN: if ((wParam == VK_RETURN) || (wParam == VK_TAB)) { PostMessage (ghDlg, WM_NEXTDLGCTL, 0, 0L); return FALSE; } return (CallWindowProc(lpOldProc, hWnd, wMessage, wParam, lParam)); break ; default: break; } /* end switch */
Metode 3
Metode ini melibatkan penggunaan aplikasi studio dan ClassWizard serta membuat fungsi anggota kotak dialog baru. Metode ini akan memperbolehkan pengguna untuk menekan tombol ENTER dan memfokuskan pada panel edit berikutnya. Jika fokus saat ini berada pada kontrol pengeditan terakhir dalam kotak dialog, fokus akan melanjutkan ke kontrol pengeditan pertama. Pertama, gunakan App Studio untuk mengubah ID tombol OK pada kotak dialog. Perilaku default Studio aplikasi adalah untuk memberikan tombol OK ID IDOK. ID tombol OK harus diubah ke nilai lain, seperti IDC_OK. Juga, Ubah properti tombol OK sehingga bukan tombol tekan default. Berikutnya, gunakan ClassWizard untuk membuat kotak dialog baru funciton anggota. Beri nama fungsi member baru seperti OnClickedOK. Fungsi ini harus diikat ke pesan BN_CLICKED dari kontrol IDC_OK. Setelah ini selesai, tulis isi fungsi OnClickedOK. Anda harus meletakkan kode yang biasanya Anda masukkan ke fungsi OnOK ke fungsi OnClickedOK baru, termasuk fungsi OnOK kelas. Tambahkan prototipe berikut ke file header untuk kotak dialog:
protected: virtual void OnOK();
Tambahkan fungsi OnOK ke kotak dialog dan kode seperti yang diperlihatkan di bawah ini:
void CMyDialog::OnOK() { CWnd* pwndCtrl = GetFocus(); CWnd* pwndCtrlNext = pwndCtrl; int ctrl_ID = pwndCtrl->GetDlgCtrlID(); switch (ctrl_ID) { case IDC_EDIT1: pwndCtrlNext = GetDlgItem(IDC_EDIT2); break; case IDC_EDIT2: pwndCtrlNext = GetDlgItem(IDC_EDIT3); break; case IDC_EDIT3: pwndCtrlNext = GetDlgItem(IDC_EDIT4); break; case IDC_EDIT4: pwndCtrlNext = GetDlgItem(IDC_EDIT1); break; case IDOK: CDialog::OnOK(); break; default: break; } pwndCtrlNext->SetFocus(); }