We all know that the dialog box is sometimes caught in the WM_CHAR message. For example, you want to make all the EDIT controls in the dialog box to top. We don't hesitate to write: #include
// Declare the dialog processure
Bool Callback DialogProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window) {int ret = DialogBoxParam (hInstance, MAKEINTRESOURCE ( IDD_DIALOG1), NULL, DIALOGPROC, 0); RETURN (RET! = IDOK);
BOOL CALLBACK DialogProc (HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter) {HWND hWndEdit; switch (uMsg) {case WM_INITDIALOG: // Get A Handle to the Edit Control HWndIt = Getdlgitem (HWNDDLG, IDC_EDIT1); RETURN TRUE;
break; case WM_CHAR: wParam = toupper (wParam); break; case WM_COMMAND: switch (LOWORD (wParam)) {case IDOK: case IDCANCEL: // Close the dialog EndDialog (hwndDlg, LOWORD (wParam));} return TRUE; } Return false;} Unfortunately, I will definitely tell you that you will fail, why, the problem is on WM_CHAR, you can try it, when you don't move the cursor to the Edit control, the dialog can capture WM_CHAR message, but once you move the cursor to the EDIT control, you can't capture WM_CHAR.
This happens, what is the method to capture WM_CHAR? I want to programmatically, small case, just overload PretranslateMessage. But for Windows programming, use the API to write a bit trouble, here I offer 2 methods The purpose of achieving the uppercase. 1) Capture the WM_CHAR message, in fact, not the truly capture of the dialog, the truly capture of WMC_CHAR. Do not say, or provide the code, everyone go to see.
#include
// Declare the dialog processure
Bool Callback DialogProc (HWND, UINT, WPARAM, LPARAM);
LResult Callback NeweditProc (HWND, UINT, WPARAM, LPARAM);
// Define a gloabal varWNDPROC g_Edit; int WINAPI WinMain (HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window) {int ret = DialogBoxParam (hInstance, MAKEINTRESOURCE (IDD_DIALOG1), NULL, DialogProc, 0); return (ret = IDOK!);} BOOL CALLBACK DialogProc (HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, / / first message parameter LPARAM lParam // second message parameter) {HWND hWndEdit; switch (uMsg) {case WM_INITDIALOG: hWndEdit = GetDlgItem (hwndDlg, IDC_EDIT1); // Subclass the Edit control g_Edit = (WNDPROC) SetWindowLong (hWndEdit, GWL_WNDPROC, (Long); return true; case wm_command: switch (loword (wparam)) {copy IDOK: Case IDCancel: EndDialog (hwnddlg, loword (wparam));} return true;
LRESULT CALLBACK NewEditProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {TCHAR chCharCode; switch (message) {case WM_CHAR: wParam = toupper (wParam); break;} return CallWindowProc (g_Edit, hwnd, message, wParam, lParam }
2) The second method is a bit soil, but the purpose is a good way. Or the original code is provided.
#include
// Declare the dialog processure
Bool Callback DialogProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window) {int ret = DialogBoxParam (hInstance, MAKEINTRESOURCE ( IDD_DIALOG1), NULL, DIALOGPROC, 0); RETURN (RET! = IDOK);
BOOL CALLBACK DialogProc (HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter) {HWND hWndEdit; switch (uMsg) {case WM_INITDIALOG: hWndEdit = GetDlgItem (hwndDlg, IDC_EDIT1); return TRUE; case WM_COMMAND: switch (LOWORD (wParam)) {case IDC_EDIT1: if (HIWORD (wParam) == EN_CHANGE) {TCHAR szString [100] = {0}; GetDlgItemText (hwndDlg, IDC_EDIT1, Szstring, 99); int Nlen = 0; int index = 0; Nlen = lstrlen (szstring); for (index = 0; index {
IF (szstring [index] <= 'z' && szstring [index]> = 'a')
{
Szstring [index] - = 32;
}
}
Szstring [NLEN] = 0;
SendMessage (Getdlgitem (Hwnddlg, Idc_edit1), WM_SETTEXT, (WPARAM) 0, (LPAram) (LPCSTR) szstring;
SendMessage (Getdlgitem (Hwnddlg, IDC_EDit1), EM_SETSEL, LSTRLEN (SZString), LSTRLEN (SZString);
}
Break;
Case IDOK:
Case IDCANCEL:
EndDialog (Hwnddlg, Loword (WPARAM));
}
Return True;
}
Return False;
}
All above is passed on VC6.0