MFC 子窗体不能响应键盘事件
我的代码是生成一个ocx后缀的文件提供给父窗体使用。现在提了一个需求,需要我设置快捷键在父窗体中弹出一个子窗体计算器来方便用户计算,问题就处在这里了。程序完成后按下快捷键...
我的代码是生成一个ocx后缀的文件提供给父窗体使用。现在提了一个需求,需要我设置快捷键在父窗体中弹出一个子窗体计算器来方便用户计算,问题就处在这里了。程序完成后按下快捷键,计算器窗体可以正确显示,填入计算公式后点击确定也可以得到正确的计算结果并显示在父窗体中。可是为了方便用户使用小键盘计算,我想把确定键作为默认键,按下Enter后就直接计算而不必手动点击确定键了。但是不管怎么尝试子窗体就是不响应Enter事件。
按下F1键弹出子窗体 非模态对话框
void CEOBExportQACtrl::MoneyCalculate( LPDISPATCH pApp )
{
if ( m_pMoneyCalculating != NULL)
{
m_pMoneyCalculating->DestroyWindow();
m_pMoneyCalculating = new MoneyCalculating(pApp);
m_pMoneyCalculating->Create( IDD_CALCULATE,this);
m_pMoneyCalculating->ShowWindow( SW_SHOW );
}
else if ( m_pMoneyCalculating == NULL)
{
m_pMoneyCalculating = new MoneyCalculating(pApp);
m_pMoneyCalculating->Create( IDD_CALCULATE,this);
m_pMoneyCalculating->ShowWindow( SW_SHOW );
}
}
(想要的效果是在示例编辑框内写入计算公式后直接按下Enter键得到结果返回给父框)
虽然设置了顺序 按Tab键时也没有任何响应
只有确定按钮的Default Button属性设置为true,按下Enter后没有任何反应
后来试了下重载PreTranslateMessage(MSG* pMsg) 也不行
BOOL MoneyCalculating::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN && pMsg->wParam==VK_RETURN)
{
Calculate();
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
重载OnKeyDown也不行,对键盘还是一点反应都没有,断点也进不去
void MoneyCalculating::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_SPACE || nChar == VK_RETURN)
{
Calculate();
}
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
刚用MFC没多多久 脑袋已经一片浆糊了 望有大神可以指点迷津 展开
按下F1键弹出子窗体 非模态对话框
void CEOBExportQACtrl::MoneyCalculate( LPDISPATCH pApp )
{
if ( m_pMoneyCalculating != NULL)
{
m_pMoneyCalculating->DestroyWindow();
m_pMoneyCalculating = new MoneyCalculating(pApp);
m_pMoneyCalculating->Create( IDD_CALCULATE,this);
m_pMoneyCalculating->ShowWindow( SW_SHOW );
}
else if ( m_pMoneyCalculating == NULL)
{
m_pMoneyCalculating = new MoneyCalculating(pApp);
m_pMoneyCalculating->Create( IDD_CALCULATE,this);
m_pMoneyCalculating->ShowWindow( SW_SHOW );
}
}
(想要的效果是在示例编辑框内写入计算公式后直接按下Enter键得到结果返回给父框)
虽然设置了顺序 按Tab键时也没有任何响应
只有确定按钮的Default Button属性设置为true,按下Enter后没有任何反应
后来试了下重载PreTranslateMessage(MSG* pMsg) 也不行
BOOL MoneyCalculating::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN && pMsg->wParam==VK_RETURN)
{
Calculate();
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
重载OnKeyDown也不行,对键盘还是一点反应都没有,断点也进不去
void MoneyCalculating::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_SPACE || nChar == VK_RETURN)
{
Calculate();
}
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
刚用MFC没多多久 脑袋已经一片浆糊了 望有大神可以指点迷津 展开
1个回答
展开全部
你做成了ocx控件,肯定是嵌套在父窗口里面了吧。这个时候,控件是不能接收回车键的,回车键一律由使用控件的对话框(也就是父窗口)接收,因此你怎么改这个控件也没用。
你只能在调用窗口之中,设置一个默认按钮(可以是隐藏的),按钮响应函数中,调用控件变量(或者获取控件指针)的方法Caculate。
你只能在调用窗口之中,设置一个默认按钮(可以是隐藏的),按钮响应函数中,调用控件变量(或者获取控件指针)的方法Caculate。
更多追问追答
追问
谢谢 原来是是这么回事 难怪我再怎么在子窗体里改也没用,不过见谅我水平有限,可以再详细说下吗?您说的意思是我不可能在子窗体中使用回车键来触发默认按钮吗?
这个响应函数中调用的控件变量指的是什么?
我之前在子窗体中设置过确定按钮的Default Button属性为True了,在单击确定按钮时也加上了 Calculate()
追答
是的,我认为你这样作为控件是不可能的。这里的原因不是别的,而是对话框窗体的特殊模式:回车截获,哪个控件(包括最基本控件)也不能直接得到回车消息。
是在父窗口的默认按钮,而不是控件窗口的默认按钮。控件变量就是。。。你这个ocx控件的变量或者指针啊,你在其它对话框类里面怎么调用这个控件方法,这里就怎么调用,一样的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询