急急急!关于消息的小问题:

pyhjy 2001-03-05 01:33:00
1、我在dialog中放了六个cedit控件,想得到在每个控件输入回车的消息。
我用WM_KEYDOWN进行判断,但程序执行不到此处。为什么?
dialog只接受WM_COMMAND中的IDOK和IDCANCEL消息,
2、如何判断keydown消息是由哪个控件发出,而又如何将焦点转入一个制定的控件?
请各位高手援手。(不用MFC的方法)
...全文
166 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pyhjy 2001-03-06
  • 打赏
  • 举报
回复
衷心感谢In355Hz的热心帮助,
In355Hz的原码对我启发很大
谢谢。
In355Hz 2001-03-05
  • 打赏
  • 举报
回复
看看我的代码吧:
/////////////////////////////Test4.cpp///////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include "resource.h"

#define WM_CHILDKEYDOWN WM_USER+100
#define TEXT_MAX 100

LRESULT CALLBACK DialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

void SetFocusNext(HWND hwnd,UINT nID);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd ;
MSG msg ;
WNDCLASS cs = { CS_HREDRAW | CS_VREDRAW,
DialogProc,
0,
DLGWINDOWEXTRA, //Note!!
hInstance,
LoadIcon(NULL,IDI_APPLICATION),
LoadCursor(NULL,IDC_ARROW),
(HBRUSH)(COLOR_BTNFACE+1),
NULL,
"IDD_TEST4_DIALOG"};

RegisterClass(&cs);

hwnd = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_TEST4_DIALOG), NULL, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

// message WM_QUIT cause function GetMessage return 0
while (GetMessage (&msg, NULL, 0, 0))
{
if(msg.message == WM_KEYDOWN && (int)msg.wParam == VK_RETURN)
SendMessage(hwnd,WM_CHILDKEYDOWN,msg.wParam,(LPARAM)msg.hwnd);
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}

return msg.wParam ;
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CHILDKEYDOWN:
{
HWND hListBox = GetDlgItem(hwndDlg,IDC_LIST1);
UINT nID = GetWindowLong((HWND)lParam,GWL_ID);
char* pszText = new char[TEXT_MAX];
char* pszTemp = new char[TEXT_MAX];
GetWindowText((HWND)lParam,pszText,TEXT_MAX);
SetWindowText((HWND)lParam,NULL);
sprintf(pszTemp,"IDC_EDIT%d: %s\0",nID-IDC_EDIT1+1,pszText);
::SendMessage(hListBox, LB_INSERTSTRING, (WPARAM)0, (LPARAM)pszTemp);
delete[TEXT_MAX] pszTemp;
delete[TEXT_MAX] pszText;
SetFocusNext(hwndDlg,nID);
return TRUE;
}
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDOK: //也可以用其他消息
case IDCANCEL:
PostQuitMessage (0) ;
return TRUE;
}
break;
case WM_DESTROY:
PostQuitMessage (0) ;
return TRUE;
}
return DefWindowProc(hwndDlg,uMsg,wParam,lParam);
}

void SetFocusNext(HWND hwnd, UINT nID)
{
if(nID == IDC_EDIT6)
nID = IDC_EDIT1;
else
nID++;
SetFocus(GetDlgItem(hwnd,nID));
}
///////////////////////////////////Resource.h///////////////////////////////////
// Used by Test4.rc
//
#define IDD_TEST4_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_EDIT1 1000
#define IDC_EDIT2 1001
#define IDC_EDIT3 1002
#define IDC_EDIT4 1003
#define IDC_EDIT5 1004
#define IDC_EDIT6 1005
#define IDC_LIST1 1012

////////////////////////////////////Test4.rc///////////////////////////////////
// Dialog
//
#include "resource.h"
#include "afxres.h"

IDD_TEST4_DIALOG DIALOGEX 0, 0, 320, 113
STYLE DS_MODALFRAME | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Test4"
CLASS "IDD_TEST4_DIALOG"
FONT 9, "宋体", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "Close",IDOK,200,7,113,18
EDITTEXT IDC_EDIT1,7,19,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
EDITTEXT IDC_EDIT2,99,19,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
EDITTEXT IDC_EDIT5,7,90,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
EDITTEXT IDC_EDIT4,99,54,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
EDITTEXT IDC_EDIT3,7,54,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
EDITTEXT IDC_EDIT6,99,90,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
LISTBOX IDC_LIST1,199,32,114,74,LBS_SORT | LBS_NOINTEGRALHEIGHT |
WS_VSCROLL | WS_TABSTOP
LTEXT "IDC_EDIT1:",IDC_STATIC,7,7,41,8
LTEXT "IDC_EDIT2:",IDC_STATIC,99,7,41,8
LTEXT "IDC_EDIT3:",IDC_STATIC,7,41,41,8
LTEXT "IDC_EDIT4:",IDC_STATIC,99,39,41,8
LTEXT "IDC_EDIT5:",IDC_STATIC,7,78,41,8
LTEXT "IDC_EDIT6:",IDC_STATIC,99,78,41,8
END

//////////////////////////////////////////////////////////////////////////////
pyhjy 2001-03-05
  • 打赏
  • 举报
回复
如何截获父窗体发给子窗体的键盘消息?(不用MFC的方法)
指点一下
whiskers 2001-03-05
  • 打赏
  • 举报
回复
重载PreTranslateMessage,处理WM_KEYDOWN
pyhjy 2001-03-05
  • 打赏
  • 举报
回复
如何屏蔽掉系统默认的IDOK;IDCANCEL消息,而采用自己定义的消息比如判断WM_KEYDOWN;WM_DESTROY;WM_LBUTTONDBLCKL等。请高手指点.(不用MFC的方法)
happylaodu 2001-03-05
  • 打赏
  • 举报
回复
对话框类的PreTranslateMessage函数中,加入如下代码:

在父窗口的PreTranslateMessage()函数中进行如下处理,
if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_ENTER&&this->GetFocus()==this->GetDlgItem(IDC_EDIT1))
{
AfxMessageBox("Edit1 get an enter!");

}

用下面的语句可让某个控件得到焦点:
this->GetDlgItem(IDC_EDIT1)->SetFocus();
pyhjy 2001-03-05
  • 打赏
  • 举报
回复
我把窗体中缺省给出的两个按钮删掉了,可还是接受不到WM_KEYDOWN消息。
afei_wh 2001-03-05
  • 打赏
  • 举报
回复
1、你的窗体有没有缺省按纽?如果有就接不到WM_KEYDOWN!
2、首先更正,keydown消息不是由哪个控件发,而是发向哪个控件。你可以用键盘钩子确定发向的控件的窗体句柄,而将焦点转入制定的控件,你可以用API函数SetFocus()或SetForeGroudWindow().

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧