CComboBox的tpye为Drop List,并通过InsertString(0,"F1"),InsertString(1,"F2"),,,,InsertString(11,"F12"),实现按下F1键自动变成F1项,按下F2自动变成F2项...按下F12键自动变成F12项.可是,出现一个问题,就是按F10的时候不会自动变成F10项,其余都可以。通过PreTranslateMessage(MSG* pMsg)和OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)都不可以实现。哪位知道的回下,本人不甚感激。
BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(WM_SYSKEYDOWN == pMsg->message || WM_KEYDOWN == pMsg->message)
{
switch(pMsg->wParam)
{
case VK_F10:
m_combo.SetCurSel(9);
break; default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
按F1会调用系统的帮助文档,其实是找不到系统的帮助文档,所以会谈出个对话框,但也会改变到F1项。
按F4则是显示下拉框的全部内容,也会改变到F4项。
但是按F10就很奇怪了,好像是禁止控件接受F1~F9,F11~12。同时我发现按完F10键后(不发生改变),再去按F1键,控件继续去调用系统的帮助文档(就是弹出个对话框),但不改变成F1项,这时再去按其他键就可以改变了。
简而言之,就是,按完F10之后,控件禁止接受F1~F9,F11,F12。但是这个时候按F1会调用系统的帮助文档。
不知道哪位大侠能解释解释。
{
// TODO: Add your specialized code here and/or call the base class
if(WM_SYSKEYDOWN == pMsg->message || WM_KEYDOWN == pMsg->message)
{
switch(pMsg->wParam)
{
case VK_F10:
m_combo.SetCurSel(9);
break; default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}按完F10之后,控件禁止接受F1~F9,F11,F12。但是这个时候按F1会调用系统的帮助文档是
因为热键冲突
BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(WM_SYSKEYDOWN == pMsg->message || WM_KEYDOWN == pMsg->message)
{
switch(pMsg->wParam)
{
case VK_F10:
m_combo.SetCurSel(9);
break; default:
break;
}
return 1;
}
return CDialog::PreTranslateMessage(pMsg);
}
对于这个函数,我认真的看了下MSDN上的解释,终于清楚了,相信大家看完也就明白了。
Return Value
Nonzero if the message was translated and should not be dispatched; zero if the message was not translated and should be dispatched.
但是还是有个问题,按F1照样会调用系统帮助文档,这时可增加WM_HELPINFO,并在
BOOL CXXXDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
// TODO: Add your message handler code here and/or call default
return 1;
//return CComboBox::OnHelpInfo(pHelpInfo);
}
就可以解决F1的问题了。