如何使对话框中接收到WM_CHAR消息(Windows编程)
来源:互联网 发布:p站动图保存软件 编辑:程序博客网 时间:2024/05/18 01:52
我们大家都知道,对话框是有的时候捕获不到WM_CHAR消息的.比如,你想使对话框里的Edit控件所键入的全部变为大写.我们毫不犹豫的写到:
#include
//Declare the Dialog Procedure
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
hWndEdit = 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;
}
很遗憾,我敢肯定地告诉你你将会失败,为什么,问题就是出在WM_CHAR上,你可以试一试,当你不把光标移动到Edit控件时,对话框可以捕获到
WM_CHAR消息,但是一旦你把光标移动到Edit控件时,就捕获不到WM_CHAR了.
出现了这种情况,有什么方法可以捕获到WM_CHAR呢?我想对于MFC编程,小Case了,只需重载PreTranslateMessage.
可是对于Windows编程,利用API来写有点麻烦,这里我提供2种方法来达到变为大写的目的.
1)捕获WM_CHAR消息,在这里其实不是对话框真正的捕获WMC_CHAR.多话不说,还是提供代码吧,大家自己去看.
#include
//Declare the Dialog Procedure
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK NewEditProc(HWND, UINT, WPARAM, LPARAM);
//Define a gloabal var
WNDPROC 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)NewEditProc);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDOK:
case IDCANCEL:
EndDialog(hwndDlg, LOWORD(wParam));
}
return TRUE;
}
return FALSE;
}
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)第二种方法有点土了,不过达到目的就是好方法.还是提供原代码吧.
#include
//Declare the Dialog Procedure
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;
}
以上均在VC6.0上通过
- 如何使对话框中接收到WM_CHAR消息(Windows编程)
- 对话框中不到WM_CHAR消息
- 自定义控件(自定义窗口)在对话框中接收不到WM_CHAR消息的解决方法
- VC中对话框不能响应WM_CHAR WM_KEYUP WM_KEYDOWN消息的解决办法
- \t\tVC中对话框不能响应WM_CHAR WM_KEYUP WM_KEYDOWN消息的解决办法
- 基于MFC对话框的键盘消息响应 WM_KEYDOWN WM_CHAR消息
- WM_CHAR消息
- WM_CHAR消息
- WM_CHAR消息
- 如何让Dialog响应WM_CHAR消息
- MFC对话框程序不能响应WM_CHAR消息的解决办法
- [Windows编程]父对话框与非模态子对话框的消息通信
- 如何在Qt中处理(接收/发送)MFC或Windows消息(message)
- C# 中如何定义和接收消息?
- C# 中如何定义和接收消息?
- c# 中如何定义和接收消息
- C# 中如何定义和接收消息
- C# 中如何定义和接收消息?
- PPT的三重境界
- 几个 DB2 常用命令
- [搜藏]每个.Net开发人员应该下载的十种必备工具
- 在Web网页上使用VBScript 和JScript
- 请问在手机上网时,GPRS上网和WAP上网的本质区别在哪里?从表面看是否可以马上区分出是何种上网方式?(GPRS or WAP)
- 如何使对话框中接收到WM_CHAR消息(Windows编程)
- 系统测试工具
- Ztetris开发手记(一)
- 很早写的一个关于VML的例子。
- 是JScript的BUG吗???阅读文档一定要仔细
- 员工离开公司的原因
- Status Code Definition of HTTP/1.1
- ASP初学者常用代码
- 常用验证函数