FormView不支持KeyDown,怎么办?

aXu 2003-10-18 11:41:53
我必须要用FormView做基类,还必须要用KeyDown,该怎么解决?
...全文
66 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
0sch 2003-10-20
  • 打赏
  • 举报
回复
可以的,我在程序中就用了(如下):
BOOL CPFView::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
CString key=_T("");
switch (pMsg->wParam)
{
case VK_PRIOR://PAGE UP
break;
case VK_NEXT://PAGE DOWN
break;
case VK_UP://向上
break;
case VK_DOWN://向下
break;
case VK_LEFT://向左
break;
case VK_RIGHT://向右
break;
default:
break;
}
}

return CFormView::PreTranslateMessage(pMsg);
}
xiaohedou 2003-10-20
  • 打赏
  • 举报
回复
看了!
flyelf 2003-10-20
  • 打赏
  • 举报
回复
if(pMsg->message == WM_KEYDOWN)
{
//这里消息如何Dispatch?
//如何能使ON_KEYDOWN消息有效?请指示…………
::PostMessage(GetSafeHwnd(), pMsg->message, pMsg->wParam, pMsg->lParam);
::DispatchMessage(pMsg);
::TranslateMessage(pMsg);
return TRUE;
}
bigflyingpig 2003-10-20
  • 打赏
  • 举报
回复
是不是程序出错了?
建议自己检查一下代码
keiven 2003-10-20
  • 打赏
  • 举报
回复
楼上的说的差不多了。
leon_z 2003-10-20
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2374/2374883.xml?temp=.7841913

BOOL CMyFormView::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_DOWN:
AfxMessageBox("DOWN");
break;
case VK_UP:
AfxMessageBox("UP");
break;
default:
break;
}
}
return CFormView::PreTranslateMessage(pMsg);
}
一样一样的
yaoha2003 2003-10-20
  • 打赏
  • 举报
回复
case 'S':sndPlaySound(msg+"sound\\s.wav",SND_ASYNC);break;
case 'T':sndPlaySound(msg+"sound\\t.wav",SND_ASYNC);break;
case 'U':sndPlaySound(msg+"sound\\u.wav",SND_ASYNC);break;
case 'V':sndPlaySound(msg+"sound\\v.wav",SND_ASYNC);break;
case 'W':sndPlaySound(msg+"sound\\w.wav",SND_ASYNC);break;
case 'X':sndPlaySound(msg+"sound\\x.wav",SND_ASYNC);break;
case 'Y':sndPlaySound(msg+"sound\\y.wav",SND_ASYNC);break;
case 'Z':sndPlaySound(msg+"sound\\z.wav",SND_ASYNC);break;
// OTHER KEY
case VK_UP:sndPlaySound(msg+"sound\\up.wav",SND_ASYNC);break;
case VK_DOWN:sndPlaySound(msg+"sound\\down.wav",SND_ASYNC);break;
case VK_LEFT:sndPlaySound(msg+"sound\\left.wav",SND_ASYNC);break;
case VK_RIGHT:sndPlaySound(msg+"sound\\right.wav",SND_ASYNC);break;

case VK_TAB:sndPlaySound(msg+"sound\\tab.wav",SND_ASYNC);break;
case VK_MENU:sndPlaySound(msg+"sound\\alt.wav",SND_ASYNC);break;
case VK_SHIFT:sndPlaySound(msg+"sound\\shift.wav",SND_ASYNC);break;
case VK_CONTROL:sndPlaySound(msg+"sound\\contrl.wav",SND_ASYNC);break;

case VK_RETURN:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_ACCEPT:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_CLEAR:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_DELETE:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_CANCEL:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_CONVERT:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_DIVIDE:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_END:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_FINAL:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_HELP:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_HOME:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_INSERT:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_KANA:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_KANJI:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_MODECHANGE:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_MULTIPLY:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_NONCONVERT:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_PAUSE:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_SPACE:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_LWIN:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_CAPITAL:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_PRIOR:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
case VK_NEXT:sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);break;
}
//处理一些特殊按键
char KeyName[50];
ZeroMemory(KeyName,50);
GetKeyNameText(lParam,KeyName,50);
CString KeyNameStr=KeyName;
if(KeyNameStr=="`")
sndPlaySound(msg+"sound\\`.wav",SND_ASYNC);
if(KeyNameStr=="-")
sndPlaySound(msg+"sound\\-.wav",SND_ASYNC);
if(KeyNameStr=="=")
sndPlaySound(msg+"sound\\+.wav",SND_ASYNC);
if(KeyNameStr=="\\")
sndPlaySound(msg+"sound\\gan.wav",SND_ASYNC);
if(KeyNameStr=="Backspace")
sndPlaySound(msg+"sound\\gan.wav",SND_ASYNC);
if(KeyNameStr=="[")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="]")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr==";")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="'")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr==",")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr==".")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="/")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="Left Windows")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="Right Windows")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="Application")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="Scroll Lock")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="Num Lock")
sndPlaySound(msg+"sound\\aaaaaa.wav",SND_ASYNC);
if(KeyNameStr=="Num -")
sndPlaySound(msg+"sound\\num-.wav",SND_ASYNC);
if(KeyNameStr=="Num +")
sndPlaySound(msg+"sound\\num+.wav",SND_ASYNC);
if(KeyNameStr=="Num Del")
sndPlaySound(msg+"sound\\numdel.wav",SND_ASYNC);
}
yaoha2003 2003-10-20
  • 打赏
  • 举报
回复
引用:
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
{
// ESC F1~F12
case VK_ESCAPE:sndPlaySound(msg+"sound\\f1.wav",SND_ASYNC);break;
case VK_F1:sndPlaySound(msg+"sound\\f1.wav",SND_ASYNC);break;
case VK_F2:sndPlaySound(msg+"sound\\f2.wav",SND_ASYNC);break;
case VK_F3:sndPlaySound(msg+"sound\\f3.wav",SND_ASYNC);break;
case VK_F4:sndPlaySound(msg+"sound\\f4.wav",SND_ASYNC);break;
case VK_F5:sndPlaySound(msg+"sound\\f5.wav",SND_ASYNC);break;
case VK_F6:sndPlaySound(msg+"sound\\f6.wav",SND_ASYNC);break;
case VK_F7:sndPlaySound(msg+"sound\\f7.wav",SND_ASYNC);break;
case VK_F8:sndPlaySound(msg+"sound\\f8.wav",SND_ASYNC);break;
case VK_F9:sndPlaySound(msg+"sound\\f9.wav",SND_ASYNC);break;
case VK_F10:sndPlaySound(msg+"sound\\f10.wav",SND_ASYNC);break;
case VK_F11:sndPlaySound(msg+"sound\\f11.wav",SND_ASYNC);break;
case VK_F12:sndPlaySound(msg+"sound\\f12.wav",SND_ASYNC);break;
// 0~9
case '1':sndPlaySound(msg+"sound\\1.wav",SND_ASYNC);break;
case '2':sndPlaySound(msg+"sound\\2.wav",SND_ASYNC);break;
case '3':sndPlaySound(msg+"sound\\3.wav",SND_ASYNC);break;
case '4':sndPlaySound(msg+"sound\\4.wav",SND_ASYNC);break;
case '5':sndPlaySound(msg+"sound\\5.wav",SND_ASYNC);break;
case '6':sndPlaySound(msg+"sound\\6.wav",SND_ASYNC);break;
case '7':sndPlaySound(msg+"sound\\7.wav",SND_ASYNC);break;
case '8':sndPlaySound(msg+"sound\\8.wav",SND_ASYNC);break;
case '9':sndPlaySound(msg+"sound\\9.wav",SND_ASYNC);break;
case '0':sndPlaySound(msg+"sound\\0.wav",SND_ASYNC);break;

case VK_NUMPAD1:sndPlaySound(msg+"sound\\1.wav",SND_ASYNC);break;
case VK_NUMPAD2:sndPlaySound(msg+"sound\\2.wav",SND_ASYNC);break;
case VK_NUMPAD3:sndPlaySound(msg+"sound\\3.wav",SND_ASYNC);break;
case VK_NUMPAD4:sndPlaySound(msg+"sound\\4.wav",SND_ASYNC);break;
case VK_NUMPAD5:sndPlaySound(msg+"sound\\5.wav",SND_ASYNC);break;
case VK_NUMPAD6:sndPlaySound(msg+"sound\\6.wav",SND_ASYNC);break;
case VK_NUMPAD7:sndPlaySound(msg+"sound\\7.wav",SND_ASYNC);break;
case VK_NUMPAD8:sndPlaySound(msg+"sound\\8.wav",SND_ASYNC);break;
case VK_NUMPAD9:sndPlaySound(msg+"sound\\9.wav",SND_ASYNC);break;
case VK_NUMPAD0:sndPlaySound(msg+"sound\\0.wav",SND_ASYNC);break;
// A~Z
case 'A':sndPlaySound(msg+"sound\\a.wav",SND_ASYNC);break;
case 'B':sndPlaySound(msg+"sound\\b.wav",SND_ASYNC);break;
case 'C':sndPlaySound(msg+"sound\\c.wav",SND_ASYNC);break;
case 'D':sndPlaySound(msg+"sound\\d.wav",SND_ASYNC);break;
case 'E':sndPlaySound(msg+"sound\\e.wav",SND_ASYNC);break;
case 'F':sndPlaySound(msg+"sound\\f.wav",SND_ASYNC);break;
case 'G':sndPlaySound(msg+"sound\\g.wav",SND_ASYNC);break;
case 'H':sndPlaySound(msg+"sound\\h.wav",SND_ASYNC);break;
case 'I':sndPlaySound(msg+"sound\\i.wav",SND_ASYNC);break;
case 'J':sndPlaySound(msg+"sound\\j.wav",SND_ASYNC);break;
case 'K':sndPlaySound(msg+"sound\\k.wav",SND_ASYNC);break;
case 'L':sndPlaySound(msg+"sound\\l.wav",SND_ASYNC);break;
case 'M':sndPlaySound(msg+"sound\\m.wav",SND_ASYNC);break;
case 'N':sndPlaySound(msg+"sound\\n.wav",SND_ASYNC);break;
case 'O':sndPlaySound(msg+"sound\\o.wav",SND_ASYNC);break;
case 'P':sndPlaySound(msg+"sound\\p.wav",SND_ASYNC);break;
case 'Q':sndPlaySound(msg+"sound\\q.wav",SND_ASYNC);break;
case 'R':sndPlaySound(msg+"sound\\r.wav",SND_ASYNC);break;
duyhui 2003-10-20
  • 打赏
  • 举报
回复
danlansky(忧郁蓝色) 说的很好了!
arvid_gs 2003-10-20
  • 打赏
  • 举报
回复
BOOL CTelecomView::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
::PostMessage(GetSafeHwnd(), pMsg->message, pMsg->wParam, pMsg->lParam);
::DispatchMessage(pMsg);
::TranslateMessage(pMsg);
return TRUE;
}
return CFormView::PreTranslateMessage(pMsg);
}
danlansky 2003-10-20
  • 打赏
  • 举报
回复
1、CFormView是CWnd的子类,可以响应WM_KEYDOWN消息!
2、你执行KeyDown的时候,叮叮叮……响个不停,在DeBug里根本看不到nChar, nRepCnt, nFlags的值。这是因为你的CFormView里放了其他控件的缘故,如果CFormView里没有任何控件(把Wizard生成的那个Static静态文本控件删除)的话,CFormView就可以响应WM_KEYDOWN消息了!
3、重载PreTranslateMessage虚函数可以解决你必须用FormView做基类,还必须要用KeyDown的问题:
用FormView做基类,我估计你想添加控件,而有了控件后,WM_KEYDOWN消息就不会响应了,所以得重载视类的PreTranslateMessage虚函数。如下:
用这个BOOL CMyView::PreTranslateMessage(MSG* pMsg)
{

if (pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_DOWN: //下方向键
//你的操作代码
break;
case 65: //大写字母A的ASCII值
case 97: //小写字母a的ASCII值
//你的代码
break;
default:
break;
}

}
return CFormView::PreTranslateMessage(pMsg);
}
来代替你原来的
void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
//你的代码
}
CFormView::OnKeyDown(nChar, nRepCnt, nFlags);
}
同时,你得把关于WM_KEYDOWN消息的映射关系去调。
多试试,有些问题就自己解决了!
flyelf 2003-10-19
  • 打赏
  • 举报
回复
重载PreTranslateMessage比较好
nonocast 2003-10-19
  • 打赏
  • 举报
回复
直接重载PreTranslateMessage
Paris_Luo 2003-10-19
  • 打赏
  • 举报
回复
Dispatch是由该窗口所在的线程来完成的,不是窗口
aXu 2003-10-19
  • 打赏
  • 举报
回复
akiko(弥弥)、flyelf(空谷清音)、maoxianwang(大大㊣BETAⅡ //楼主,请把分给猪)
你们好!
1、CFormView是CWnd的子类,应该可以响应WM_KEYDOWN消息,但是当我执行KeyDown的时候,叮叮叮……响个不停,在DeBug里根本看不到nChar, nRepCnt, nFlags的值。无论框架还是视图都不接受该消息!看来只有重载下面的虚函数了。
2、重载PreTranslateMessage虚函数,
BOOL CTelecomView::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
//这里消息如何Dispatch?
//如何能使ON_KEYDOWN消息有效?请指示…………
}
return CFormView::PreTranslateMessage(pMsg);
}
谢谢!我是新手,好多东西不会,我用别人的号来问,请不要见笑!
maoxianwang 2003-10-18
  • 打赏
  • 举报
回复
可以的呀
akiko 2003-10-18
  • 打赏
  • 举报
回复
CFormView是CWnd的子类,可以响应WM_KEYDOWN消息,
还有可以重载PreTranslateMessage,
if(pMsg->message == WM_KEYDOWN)...

16,470

社区成员

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

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

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