新手的问题

hello83 2005-09-18 01:09:58
BOOL CDemoDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
return CDialog::PreTranslateMessage(pMsg);
}

1:在上面的这段代码里,我在对话框中敲击一次shift,为什么焦点的移动不是一次而是三次?
2:CDialog *m_p=(CDialog*)AfxGetMainWnd();改成CDialog *m_p=(CDialog*)GetParent();,就会报错??
3:我将if (pMsg->wParam==VK_SHIFT) 改成if (::GetKeyState(VK_SHIFT)<0)焦点就会变换不停,其他事件就无法相应
...全文
115 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
femalelover 2005-09-18
  • 打赏
  • 举报
回复
朝五晚九的做法一般很正确.
jardyson 2005-09-18
  • 打赏
  • 举报
回复
3:我将if (pMsg->wParam==VK_SHIFT) 改成if (::GetKeyState(VK_SHIFT)<0)焦点就会变换不停,其他事件就无法相应

如果你不按着SHIFT键的话,GetKeyState(VK_SHIFT)永远都是小于0,因此程序也一直运行此代码,因为你的程序是单线程,所以你程序就一直卡在消息处理过程,说白了也就相当于一个死循环。
晚九朝五也作出很好的答案
jardyson 2005-09-18
  • 打赏
  • 举报
回复
windows是基于事件驱动,所以windows程序也如此。windows窗体在运行时是在一个while循环里不停的运行,一个好的while循环虽然对事件有判断的能力,但对windows输入任何消息时它都会把消息注入相应的应用程序当中,当你按下一个并放开就PRESS事件,当你按下键但不放开时是DOWN事件,两个事件虽为按键消息,但还是有不同之处。
你的程序最大问题‘晚九朝五’也说过了,没有事件判断,所以如果wParam为VS_SHIFT的话,就算不按键代码照样执行。为什么会出现连续三下跳转,我估计是事件驱动的原故,你在按SHIFT时程序不只收到WINDOWS的WM_KEYDOWN事件,还将收到WM_KEYUP,这其中还有其它事件会发生,如果wParam值一直是VK_SHIFT,连续跳转是有可能的。
你可以试试看用WM_KEYUP.
whs1980 2005-09-18
  • 打赏
  • 举报
回复
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
return CDialog::PreTranslateMessage(pMsg);

----------------------------------------------------
如果你处理了以后就不想让系统默认的函数再处理,应在处理后直接返回,而不是再调用CDialog::PreTranslateMessage(pMsg);用下面的代码试试
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
Stefine 2005-09-18
  • 打赏
  • 举报
回复
WM_KEYDOWN,WM_KEYUP,WM_CHAR等消息都会用wParam来保存按键消息,所以你的代码很危险。

if (pMsg->message == WM_KEYDOWN)
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
这样写就比较安全也比较实用。


i_noname(晚九朝五)
好像不能根本解决第一个问题吧
关注ing
i_noname 2005-09-18
  • 打赏
  • 举报
回复
if (::GetKeyState(VK_SHIFT))
i_noname 2005-09-18
  • 打赏
  • 举报
回复
CDialog *m_p=(CDialog*)GetParent();
GetParent当对象没有父窗口时返回NULL,m_p->NextDlgCtrl()肯定是非法的
i_noname 2005-09-18
  • 打赏
  • 举报
回复
WM_KEYDOWN,WM_KEYUP,WM_CHAR等消息都会用wParam来保存按键消息,所以你的代码很危险。

if (pMsg->message == WM_KEYDOWN)
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
这样写就比较安全也比较实用。

16,551

社区成员

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

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

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