主题:窗口客户区控件消息传递的问题
我用一个函数在Windows32程序的主窗口建立一些控件,想通过点击控件实现一些功能,这些功能的实现也打算放在函数里,用的是switch语句,但主窗口客户区内的控件点击后无法进入函数的switch结构内去,也就是说点击控件(比如按钮)这个消息并没有传递到函数的switch中,不知道是为什么?
按照一些书说的,控件的句柄标识是在wParam参数的低字段,但总是不对,希望哪位高手能给一些提示和指点,不甚感谢!
我的函数是这样的:
void TextPreProc(HINSTANCE hInst, HWND hWnd, WPARAM wParam, UINT message)
{
hdc = GetDC(hWnd); // 获得设备环境描述表
GetClientRect(hWnd, &ClientRect); // 获得客户区大小
// hInst = ((LPCREATESTRUCT)lParam)->hInstance; // 获得程序实例句柄
// 在窗口客户区绘制好各种控件
hOrignalTextWnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
20, 20, ClientRect.right/3, ClientRect.bottom*2/5,
hWnd, (HMENU)IDC_ORIGNALTEXT,
(HINSTANCE)hInst, NULL); // 绘制编辑框控件,用于显示原始文本
// 在窗口客户区绘制用于显示置乱后文本的编辑框
hEncryptedTextWnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
300, 20, ClientRect.right/3, ClientRect.bottom*2/5,
hWnd, (HMENU)IDC_ENCRYPTEDTEXT,
(HINSTANCE)hInst, NULL);
// 建立用于显示编码后文本的编辑框
hEncodedTextWnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
20, 260, ClientRect.right/3, ClientRect.bottom*2/5,
hWnd, (HMENU)IDC_ENCODEDTEXT,
(HINSTANCE)hInst, NULL);
// 建立用于显示置乱后的文本编辑框
hDisturbedTextWnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
300, 260, ClientRect.right/3, ClientRect.bottom*2/5,
hWnd, (HMENU)IDC_DISTURBEDTEXT,
hInst, NULL);
// 建立静态文本标签
CreateWindow(TEXT("STATIC"), TEXT("OrignalText"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
100, 220, 100, 20,
hWnd, (HMENU)NULL,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("EncryptedText"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
350, 220, 100, 20,
hWnd, (HMENU)NULL,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("EncodedText"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
100, 460, 100, 20,
hWnd, (HMENU)NULL,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("DisturbedText"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
350, 460, 100, 20,
hWnd, (HMENU)NULL,
hInst, NULL);
// 建立密码输入编辑框
CreateWindow(TEXT("BUTTON"), TEXT("Cipher"), BS_GROUPBOX | WS_CHILD | WS_VISIBLE,
580, 20, 150, 130, hWnd, NULL, hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("Key1"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
590, 40, 50, 25,
hWnd, (HMENU)NULL,
hInst, NULL);
hKey1Wnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|ES_LEFT|ES_WANTRETURN,
650, 40, 70, 25,
hWnd, (HMENU)IDC_KEY1,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("Key2"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
590, 80, 50, 25,
hWnd, (HMENU)NULL,
hInst, NULL);
hKey2Wnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|ES_LEFT|ES_WANTRETURN,
650, 80, 70, 25,
hWnd, (HMENU)IDC_KEY2,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("Key3"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
590, 120, 50, 25,
hWnd, (HMENU)NULL,
hInst, NULL);
hKey3Wnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|ES_LEFT|ES_WANTRETURN,
650, 120, 70, 25,
hWnd, (HMENU)IDC_KEY3,
hInst, NULL);
// 建立命令按钮
hLoadingText = CreateWindow(TEXT("BUTTON"), TEXT("LoadingText"),
WS_CHILD|WS_VISIBLE,
610, 170, 90, 30,
hWnd, (HMENU)IDB_LOADINGTEXT,
hInst, NULL);
hEncryptText = CreateWindow(TEXT("BUTTON"), TEXT("EncryptText"),
WS_CHILD|WS_VISIBLE,
610,220, 90, 30,
hWnd, (HMENU)IDB_ENCRYPTTEXT,
hInst, NULL);
hEncodeText = CreateWindow(TEXT("BUTTON"), TEXT("EncodeText"),
WS_CHILD|WS_VISIBLE,
610, 270, 90, 30,
hWnd, (HMENU)IDB_ENCODETEXT,
hInst, NULL);
hDisturbText = CreateWindow(TEXT("BUTTON"), TEXT("DisturbText"),
WS_CHILD|WS_VISIBLE,
610, 320, 90, 30,
hWnd, (HMENU)IDB_DISTURBTEXT,
hInst, NULL);
hSaveText = CreateWindow(TEXT("BUTTON"), TEXT("SaveText"),
WS_CHILD|WS_VISIBLE,
610, 370, 90, 30,
hWnd, (HMENU)IDB_SAVETEXT,
hInst, NULL);
hClose = CreateWindow(TEXT("BUTTON"), TEXT("CloseText"),
WS_CHILD|WS_VISIBLE,
610, 420, 90, 30,
hWnd, (HMENU)IDB_CLOSE,
hInst, NULL);
// 编程实现对各控件的操作
OPENFILENAME ofn; // 定义一个打开、另存为对话框的结构
static TCHAR szFile[MAX_PATH]; //存储路径、文件名的缓冲区
static TCHAR szFilter[] = TEXT ("文本文件 (*.TXT)\0*.cdf\0")
TEXT ("All Files (*.*)\0*.*\0\0") ;
switch(message)
{
case IDB_LOADINGTEXT:
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = szFilter ;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH ;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// 创建对话框,若对话框结束后返回TRUE,则将ofn的lpstrFile域中返回
// 文件名复制到缓冲区szFile
if (GetOpenFileName(&ofn) == TRUE)
{
lstrcpy(szFile, ofn.lpstrFile );
MessageBox(hWnd, szFile, _T("打开完毕"), MB_OK | MB_ICONINFORMATION) ;
}
break;
case IDB_ENCRYPTTEXT:
break;
case IDB_ENCODETEXT:
break;
case IDB_DISTURBTEXT:
break;
case IDB_SAVETEXT:
break;
case IDB_CLOSE:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
}
按照一些书说的,控件的句柄标识是在wParam参数的低字段,但总是不对,希望哪位高手能给一些提示和指点,不甚感谢!
我的函数是这样的:
void TextPreProc(HINSTANCE hInst, HWND hWnd, WPARAM wParam, UINT message)
{
hdc = GetDC(hWnd); // 获得设备环境描述表
GetClientRect(hWnd, &ClientRect); // 获得客户区大小
// hInst = ((LPCREATESTRUCT)lParam)->hInstance; // 获得程序实例句柄
// 在窗口客户区绘制好各种控件
hOrignalTextWnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
20, 20, ClientRect.right/3, ClientRect.bottom*2/5,
hWnd, (HMENU)IDC_ORIGNALTEXT,
(HINSTANCE)hInst, NULL); // 绘制编辑框控件,用于显示原始文本
// 在窗口客户区绘制用于显示置乱后文本的编辑框
hEncryptedTextWnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
300, 20, ClientRect.right/3, ClientRect.bottom*2/5,
hWnd, (HMENU)IDC_ENCRYPTEDTEXT,
(HINSTANCE)hInst, NULL);
// 建立用于显示编码后文本的编辑框
hEncodedTextWnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
20, 260, ClientRect.right/3, ClientRect.bottom*2/5,
hWnd, (HMENU)IDC_ENCODEDTEXT,
(HINSTANCE)hInst, NULL);
// 建立用于显示置乱后的文本编辑框
hDisturbedTextWnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
300, 260, ClientRect.right/3, ClientRect.bottom*2/5,
hWnd, (HMENU)IDC_DISTURBEDTEXT,
hInst, NULL);
// 建立静态文本标签
CreateWindow(TEXT("STATIC"), TEXT("OrignalText"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
100, 220, 100, 20,
hWnd, (HMENU)NULL,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("EncryptedText"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
350, 220, 100, 20,
hWnd, (HMENU)NULL,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("EncodedText"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
100, 460, 100, 20,
hWnd, (HMENU)NULL,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("DisturbedText"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
350, 460, 100, 20,
hWnd, (HMENU)NULL,
hInst, NULL);
// 建立密码输入编辑框
CreateWindow(TEXT("BUTTON"), TEXT("Cipher"), BS_GROUPBOX | WS_CHILD | WS_VISIBLE,
580, 20, 150, 130, hWnd, NULL, hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("Key1"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
590, 40, 50, 25,
hWnd, (HMENU)NULL,
hInst, NULL);
hKey1Wnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|ES_LEFT|ES_WANTRETURN,
650, 40, 70, 25,
hWnd, (HMENU)IDC_KEY1,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("Key2"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
590, 80, 50, 25,
hWnd, (HMENU)NULL,
hInst, NULL);
hKey2Wnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|ES_LEFT|ES_WANTRETURN,
650, 80, 70, 25,
hWnd, (HMENU)IDC_KEY2,
hInst, NULL);
CreateWindow(TEXT("STATIC"), TEXT("Key3"),
WS_CHILD|WS_VISIBLE|SS_CENTER,
590, 120, 50, 25,
hWnd, (HMENU)NULL,
hInst, NULL);
hKey3Wnd = CreateWindow(TEXT("EDIT"), NULL,
WS_CHILD|WS_VISIBLE|ES_LEFT|ES_WANTRETURN,
650, 120, 70, 25,
hWnd, (HMENU)IDC_KEY3,
hInst, NULL);
// 建立命令按钮
hLoadingText = CreateWindow(TEXT("BUTTON"), TEXT("LoadingText"),
WS_CHILD|WS_VISIBLE,
610, 170, 90, 30,
hWnd, (HMENU)IDB_LOADINGTEXT,
hInst, NULL);
hEncryptText = CreateWindow(TEXT("BUTTON"), TEXT("EncryptText"),
WS_CHILD|WS_VISIBLE,
610,220, 90, 30,
hWnd, (HMENU)IDB_ENCRYPTTEXT,
hInst, NULL);
hEncodeText = CreateWindow(TEXT("BUTTON"), TEXT("EncodeText"),
WS_CHILD|WS_VISIBLE,
610, 270, 90, 30,
hWnd, (HMENU)IDB_ENCODETEXT,
hInst, NULL);
hDisturbText = CreateWindow(TEXT("BUTTON"), TEXT("DisturbText"),
WS_CHILD|WS_VISIBLE,
610, 320, 90, 30,
hWnd, (HMENU)IDB_DISTURBTEXT,
hInst, NULL);
hSaveText = CreateWindow(TEXT("BUTTON"), TEXT("SaveText"),
WS_CHILD|WS_VISIBLE,
610, 370, 90, 30,
hWnd, (HMENU)IDB_SAVETEXT,
hInst, NULL);
hClose = CreateWindow(TEXT("BUTTON"), TEXT("CloseText"),
WS_CHILD|WS_VISIBLE,
610, 420, 90, 30,
hWnd, (HMENU)IDB_CLOSE,
hInst, NULL);
// 编程实现对各控件的操作
OPENFILENAME ofn; // 定义一个打开、另存为对话框的结构
static TCHAR szFile[MAX_PATH]; //存储路径、文件名的缓冲区
static TCHAR szFilter[] = TEXT ("文本文件 (*.TXT)\0*.cdf\0")
TEXT ("All Files (*.*)\0*.*\0\0") ;
switch(message)
{
case IDB_LOADINGTEXT:
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = szFilter ;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH ;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// 创建对话框,若对话框结束后返回TRUE,则将ofn的lpstrFile域中返回
// 文件名复制到缓冲区szFile
if (GetOpenFileName(&ofn) == TRUE)
{
lstrcpy(szFile, ofn.lpstrFile );
MessageBox(hWnd, szFile, _T("打开完毕"), MB_OK | MB_ICONINFORMATION) ;
}
break;
case IDB_ENCRYPTTEXT:
break;
case IDB_ENCODETEXT:
break;
case IDB_DISTURBTEXT:
break;
case IDB_SAVETEXT:
break;
case IDB_CLOSE:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
}