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 焦点

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部