清泛IT社区

标题: OnInitDialog()中SetFocus()设置焦点不起作用解决方法 [打印本页]

作者: zqp2013    时间: 2014-12-25 15:47
标题: 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
}

至此,完美解决。






欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3