关于对话框上焦点,鼠标点击,回车键的问题 一个Dialog上有3*3个Button。PreTranslate中截获4个方向键,并在每次操作后用SetFoucs()来设定焦点。发现设定后的焦点不能像以前TAB的默认焦点一样正常响应回车按下的Click事件。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有点诡异的是如果在pretranslate中的pMsg->wParam == VK_RETURN判断下写个像MessageBox(L"XXX")之后反而可以正确响应 去掉就不行 。 pMsg->wParam == VK_RETURN;这个是TAB键??我记得怎么是Enter。。 没说是TAB键。。可能我没说清楚 我的意思是默认会给你一个焦点的移动顺序。如果按默认顺序走,没有问题。如果按照自己的顺序,就是SetFocus()才会出现上面的现象。 (CEdit*)GetDlgItem(IDC_BUTTON1)-> SetFocus(); 这样写不能实现?我试试 CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON1); pButton->SetButtonStyle(BS_DEFPUSHBUTTON); pButton->SetFocus(); CButton* pButton = (CButton*)GetDlgItem(IDCANCEL); SendMessage(WM_NEXTDLGCTL, (WPARAM)pButton->GetSafeHwnd(), TRUE);或者这个,这样可能会效果比较好一些 http://blog.csdn.net/VisualEleven/archive/2010/12/06/6058687.aspx else if (pMsg->wParam == VK_UP ) { m_pSelButton->SetFocus(); CExBitmapButton *pButton = (CExBitmapButton*)m_pSelButton->GetFocus(); long nIndex = GetButtonIndex(pButton); if (nIndex == 9) { m_pSelButton->SetButtonSel(FALSE); m_oMannualTest.SetButtonSel(TRUE); m_oMannualTest.SetFocus(); m_pSelButton = &m_oMannualTest; } else if (nIndex > 4 && nIndex <= 8) { nIndex -= 4; CExBitmapButton *pButtonTemp = GetButton(nIndex); SelButton(pButtonTemp); pButtonTemp->SetFocus(); } else if (nIndex <= 4) { m_pSelButton->SetButtonSel(FALSE); m_oExit.SetButtonSel(TRUE); m_oExit.SetFocus(); m_pSelButton = &m_oExit; } }代码比较长 上个片段 很多是自己写的函数 忽略就是了这样SetFocus应该是没有问题的吧然后我希望它按下return时候响应对应的click事件。再默认顺序下是没有问题的。自己写的这种顺序会出现不响应click而去响应Onok 是不是你创建对话框最开始的那个OK按钮你没删除或者直接改为自己的键了,系统默认开始的焦点在那个键上,看是不是在那里调了ONOK()? 这个按钮我去掉了,我重载了OnOK() 并且在初始化时候就SetFocus到一个按钮上了 初始化SetFocus()时返回值要是 FALSE才行。你单步跟一下 看哪会进ONOK() 基本上稍微多按几下方向选择后就会进OnOK() 回车键会默认调用OnOK(),试试在哪里把回车键的消息截获了,让它不可能去调用OnOK(),而不是通过重载OnOK()的方式或者在OnOK()也加上特定的处理,模拟为按下了对应的Button,不过不是很好的解决办法 上面说的不准,不一定是截获消息,是在回车响应的函数执行链的某个环节进行截断或改向,让它不可能去调用OnOK() 在默认顺序下是没有问题的。自己写的这种顺序会出现不响应click而去响应Onok尝试了多次还是失败了。改回原来截获if(pMsg->wParam == VK_RETURN)的方式来处理了if (pMsg->wParam == VK_RETURN) { //m_pSelButton->SetFocus(); long nIndexTemp = GetButtonIndex(m_pSelButton); if (nIndexTemp == 1) { CDlg1 dlg; dlg.DoModal(); } else if (nIndexTemp == 4) { CDlg2 dlg; dlg.DoModal(); } else { return CDialog::PreTranslateMessage(pMsg); } return TRUE; //对话框资源返回TRUE谢谢大家了 SetWindowsHookEx 无法在 IE8 上正常工作吗? PlaySound 在Ontimer中应用播放声音问题 OpenGL绘图时整个桌面闪烁的问题 ???我用ADO添加时,为什么会出错? 关于CStrng,为啥他只接受512字节??!! 有没有关于正则表达式的c++类,急! 大神推荐一本MFC多线程的书籍 串口操作的几个问题············· 有做过扫描仪相关软件的举手,兄弟需要帮忙。oicq=197575,[email protected] 刚做了一个3D小游戏,提意见者20分相送(共260分) 找不到DLL动态库 模拟点击网页元素
之后反而可以正确响应 去掉就不行 。
我的意思是默认会给你一个焦点的移动顺序。
如果按默认顺序走,没有问题。如果按照自己的顺序,就是SetFocus()才会出现上面的现象。
我试试
pButton->SetButtonStyle(BS_DEFPUSHBUTTON);
pButton->SetFocus();
CButton* pButton = (CButton*)GetDlgItem(IDCANCEL);
SendMessage(WM_NEXTDLGCTL, (WPARAM)pButton->GetSafeHwnd(), TRUE);或者这个,这样可能会效果比较好一些
{
m_pSelButton->SetFocus();
CExBitmapButton *pButton = (CExBitmapButton*)m_pSelButton->GetFocus();
long nIndex = GetButtonIndex(pButton);
if (nIndex == 9)
{
m_pSelButton->SetButtonSel(FALSE);
m_oMannualTest.SetButtonSel(TRUE);
m_oMannualTest.SetFocus();
m_pSelButton = &m_oMannualTest;
}
else if (nIndex > 4 && nIndex <= 8)
{
nIndex -= 4;
CExBitmapButton *pButtonTemp = GetButton(nIndex);
SelButton(pButtonTemp);
pButtonTemp->SetFocus();
}
else if (nIndex <= 4)
{
m_pSelButton->SetButtonSel(FALSE);
m_oExit.SetButtonSel(TRUE);
m_oExit.SetFocus();
m_pSelButton = &m_oExit;
} }
代码比较长 上个片段
这样SetFocus应该是没有问题的吧然后我希望它按下return时候响应对应的click事件。
再默认顺序下是没有问题的。
自己写的这种顺序会出现不响应click而去响应Onok
或者在OnOK()也加上特定的处理,模拟为按下了对应的Button,不过不是很好的解决办法
自己写的这种顺序会出现不响应click而去响应Onok尝试了多次还是失败了。改回原来截获if(pMsg->wParam == VK_RETURN)的方式来处理了
if (pMsg->wParam == VK_RETURN)
{
//m_pSelButton->SetFocus(); long nIndexTemp = GetButtonIndex(m_pSelButton);
if (nIndexTemp == 1)
{
CDlg1 dlg;
dlg.DoModal();
}
else if (nIndexTemp == 4)
{
CDlg2 dlg;
dlg.DoModal();
}
else
{
return CDialog::PreTranslateMessage(pMsg);
}
return TRUE; //对话框资源返回TRUE
谢谢大家了