一. 模态对话框
在OnInitDialog中使用SetFocus.并且返回FALSE
看MFC自动生成的注释
return FALSE; // return TRUE unless you set the focus to a control
二、非模态对话框在OnInitDialog或任何用于初始化的函数中发送WM_SETFOCUS消息,即通过消息实现SetFocus
1 SetFocus函数实际完成了三个步骤
(1)发送Kill_Focus到前一个窗口
(2)发送Set_Focus到现在的窗口
(3)激活现在的窗口
2.WM_SETFOCUS函数仅实现了上述第(2)步,第一步由系统完成,因此还需要实现第三步
3.激活窗口用WM_ACTIVATE消息实现。
综述,实现方式为:
// ((CEdit*)GetDlgItem(IDC_EDIT_FILEDIR))->SetSel(-1);//指定光标到末尾
::PostMessage(GetDlgItem(IDC_EDIT_FILEDIR)->m_hWnd, WM_SETFOCUS, 0, 0);
::PostMessage(GetDlgItem(IDC_EDIT_FILEDIR)->m_hWnd, WM_ACTIVATE, WA_ACTIVE, 0);
注:由上可知,一个窗口被SetFocus了但不代表其是活动窗口,也就不能接收键盘消息。
不过很奇怪,对于CCombobox,则只需要WM_SETFOCUS也可以。