我在使用CComboBox时碰到了一个问题,请各位帮忙看看:
我自己从CComboBox继承了一个CMyComboBox,然后自己响应WM_SETFOCUS和WM_KILLFOCUS消息(仅仅增加这两个函数,其他不变),输出信息:
void CMyComboBox::OnSetFocus(CWnd* pOldWnd) 
{
CComboBox::OnSetFocus(pOldWnd);
TRACE0("+CMyComboBox::OnSetFocus\n");
}
void CMyComboBox::OnKillFocus(CWnd* pNewWnd) 
{
CComboBox::OnKillFocus(pNewWnd);
TRACE0("+CMyComboBox::OnKillFocus\n");
}我创建了一个CBS_DROPDOWN类型的CMyComboBox MyComboBox1,
然后我在一个按钮中调用MyComboBox1.SetFocus(),结果却输出了两行信息:
+CMyComboBox::OnKillFocus      ????怎么会有这个???
+CMyComboBox::OnSetFocus但是如果我创建的是CBS_DROPDOWNLIST类型的CMyComboBox MyComboBox2,
再调用MyComboBox2.SetFocus(),结果只有一行:
+CMyComboBox::OnSetFocus不知那位知道这是怎么回事?????????因为我程序中的状态就是根据Focus来变化的,但是现在在SetFocus之前冒出一个KillFocus,我的状态就不正确了。

解决方案 »

  1.   

    可能是不是你的界面默认焦点在combobox上,ctrl+d 改变tab顺序
      

  2.   

    焦点到底在哪,用以下代码检查一下:
    CWnd *pCtrl = CWnd::GetFocus();
    if(pCtrl != NULL)
        TRACE1("Focus@%d\n", pCtrl->GetDlgCtrlID() );你可以在给组合框设置焦点前检查一下,输出的是控件ID
      

  3.   

    大家可能不知道具体情况,可以建立一个工程试试,反正也很简单的。不管原来焦点在那个窗体上,我调用
    MyComboBox1.SetFocus() 后 ,
    就应该只有WM_SETFOCUS,不应该有WM_KILLFOCUS出现的。为什么CBS_DROPDOWNLIST有这种情况,CBS_DROPDOWN就没有这种情况呢?请大家试试!!
      

  4.   

    我又试了一下,有如下发现:对话框CTest2Dlg上有一个CMyComboBox,有一个按钮,
    按钮调用的函数就是CMyComboBox::SetFocus()===================================================
    原来焦点不在CMyComboBox上,我点击按钮后,输出
    +CMyComboBox::OnKillFocus
    +CTest2Dlg::OnSetfocusCombo2
    +CMyComboBox::OnSetFocus为什么CMyComboBox::OnKillFocus被调用而CTest2Dlg::OnKillfocusCombo2怎么没有调用呢?===================================================================
    如果原来焦点就在CMyComboBox上,我按下(只是按下,还没有松开)输出
    +CTest2Dlg::OnKillfocusCombo2
    然后松开按钮,输出
    +CMyComboBox::OnKillFocus
    +CTest2Dlg::OnSetfocusCombo2
    +CMyComboBox::OnSetFocus我觉得奇怪,当按下按钮的时候,焦点就切换到按钮上了,CMyComboBox失去了焦点,这时为什么单单只有CTest2Dlg::OnKillfocusCombo2响应,CMyComboBox::OnKillFocus为什么没有响应呢?为什么会等到我松开按钮,CMyComboBox::OnKillFocus才会响应呢?