关于CWnd::SetFocus的一点问题
- C/C++ code
BOOL CDlgBillInfo::OnInitDialog(){ CDialog::OnInitDialog(); /* DoSomething */ GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus(); return FALSE; //除非将焦点设置到控件,否则返回TRUE}
将OnInitDialog的返回值设置成FALSE之后,在这个对话框初始化的时候,是能够将焦点设置到指定的控件上。但是,有这么一个问题:这个窗口是一个父窗口,在打开它的一个子窗口时,父窗口没有关闭,而后子窗口通过发消息的方式,让父窗口的某个控件获得焦点,却一直失效。几段小代码如下:
打开子窗口:
- C/C++ code
void CDlgBillInfo::OnBnClickedButtonQuery(){ CDlgCustom dlg; dlg.m_customHwnd = this->m_hWnd; dlg.DoModal();}
子窗口处理完之后,给父窗口发送消息:
- C/C++ code
void CDlgCustom::OnBnClickedButtonOkCustom(){ /* DoSomething */ SendMessage( WM_CLOSE, 0, 0 ); ::SendMessage( m_customHwnd, WM_CUSTOMTOINFO_MESSAGE, 0, 0 );}
父窗口接收消息,并进行相应的处理:
- C/C++ code
LRESULT CDlgBillInfo::GetCustomToInfoMessage(WPARAM wParam, LPARAM lParam){ /* DoSomething */ GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus(); return 0;}
父窗口接收消息时,原本是想将焦点设置到IDC_EDIT_SHBILLNO这个ID对应的控件上,但是却一直失效,看SetFocus()的返回值是空的。这是什么导致的呢?
[解决办法]
别发消息了,直接加上下面这句话就行了
如果分情况设置焦点,就判断dlg.DoModal();的返回值
- C/C++ code
void CDlgBillInfo::OnBnClickedButtonQuery(){ CDlgCustom dlg; dlg.m_customHwnd = this->m_hWnd; dlg.DoModal(); [color=#FF0000]GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus();[/color]}