OnInitDialog()中SetFocus()设置焦点不起作用解决方法
清泛原创
BOOL Cxxx::OnInitDialog()
{
...
::SetFocus(m_wndEdit); // 不起作用,请参照如下的注释(VS自动生成的)。
...
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
当然,改为return FALSE;能解决问题,但是感觉不太优雅,使用SendMessage解决,如下:
::SetFocus(m_wndEdit); -> ::SendMessage(m_wndEdit, WM_SETFOCUS, 0, 0);
这时,你会发现,输入框确实获得了焦点,但是此时键盘无法输入内容,因此此方法不可行。
-----------------------------解决方法-----------------------------
使用自定义用户消息的方法,如下:
#define WM_USER_SETFOCUS_MSG (WM_USER+1)
BEGIN_MESSAGE_MAP(CMainDlg, CDialogEx)
...
ON_MESSAGE(WM_USER_SETFOCUS_MSG, OnUserSetFocus)
END_MESSAGE_MAP()
LRESULT CMainDlg::OnUserSetFocus(WPARAM wParam, LPARAM lParam)
{
::SetFocus(m_wndEdit);
return S_OK;
}
BOOL Cxxx::OnInitDialog()
{
...
PostMessage(WM_USER_SETFOCUS_MSG, 0, 0);
...
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
至此,完美解决。
{
...
::SetFocus(m_wndEdit); // 不起作用,请参照如下的注释(VS自动生成的)。
...
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
当然,改为return FALSE;能解决问题,但是感觉不太优雅,使用SendMessage解决,如下:
::SetFocus(m_wndEdit); -> ::SendMessage(m_wndEdit, WM_SETFOCUS, 0, 0);
这时,你会发现,输入框确实获得了焦点,但是此时键盘无法输入内容,因此此方法不可行。
-----------------------------解决方法-----------------------------
使用自定义用户消息的方法,如下:
#define WM_USER_SETFOCUS_MSG (WM_USER+1)
BEGIN_MESSAGE_MAP(CMainDlg, CDialogEx)
...
ON_MESSAGE(WM_USER_SETFOCUS_MSG, OnUserSetFocus)
END_MESSAGE_MAP()
LRESULT CMainDlg::OnUserSetFocus(WPARAM wParam, LPARAM lParam)
{
::SetFocus(m_wndEdit);
return S_OK;
}
BOOL Cxxx::OnInitDialog()
{
...
PostMessage(WM_USER_SETFOCUS_MSG, 0, 0);
...
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
至此,完美解决。
上一篇:CreateWindow()动态创建一个EditBox
下一篇:csplitterwnd 窗口不能自适应的解决方法