关于CWnd::SetFocus的一点问题

mashimaro1225 2012-07-24 10:31:01
BOOL CDlgBillInfo::OnInitDialog()
{
CDialog::OnInitDialog();

/* DoSomething */

GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus();

return FALSE; //除非将焦点设置到控件,否则返回TRUE
}


将OnInitDialog的返回值设置成FALSE之后,在这个对话框初始化的时候,是能够将焦点设置到指定的控件上。但是,有这么一个问题:这个窗口是一个父窗口,在打开它的一个子窗口时,父窗口没有关闭,而后子窗口通过发消息的方式,让父窗口的某个控件获得焦点,却一直失效。几段小代码如下:
打开子窗口:
void CDlgBillInfo::OnBnClickedButtonQuery()
{
CDlgCustom dlg;
dlg.m_customHwnd = this->m_hWnd;
dlg.DoModal();
}

子窗口处理完之后,给父窗口发送消息:
void CDlgCustom::OnBnClickedButtonOkCustom()
{
/* DoSomething */
SendMessage( WM_CLOSE, 0, 0 );
::SendMessage( m_customHwnd, WM_CUSTOMTOINFO_MESSAGE, 0, 0 );
}

父窗口接收消息,并进行相应的处理:
LRESULT CDlgBillInfo::GetCustomToInfoMessage(WPARAM wParam, LPARAM lParam)
{
/* DoSomething */
GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus();
return 0;
}


父窗口接收消息时,原本是想将焦点设置到IDC_EDIT_SHBILLNO这个ID对应的控件上,但是却一直失效,看SetFocus()的返回值是空的。这是什么导致的呢?
...全文
335 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mashimaro1225 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

别发消息了,直接加上下面这句话就行了
如果分情况设置焦点,就判断dlg.DoModal();的返回值
C/C++ code

void CDlgBillInfo::OnBnClickedButtonQuery()
{
CDlgCustom dlg;
dlg.m_customHwnd = this->m_hWnd;
dlg.DoModal();

[color……
[/Quote]

HOHO~这方法貌似很好用的说...目前就试了一个,再试试别的,如果可以的话,果断结贴给分!
hotpos 2012-07-26
  • 打赏
  • 举报
回复

void CDlgBillInfo::OnBnClickedButtonQuery()
{
CDlgCustom dlg;
dlg.DoModal();

GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus();
}
hotpos 2012-07-25
  • 打赏
  • 举报
回复
DoModal的时候主窗口被Disable了,看下DoModal的源码就知道了。
dahaiI0 2012-07-25
  • 打赏
  • 举报
回复
BringWindowToTop(this->Getsafehwnd() );
GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus();
试试
这个娜戒海了 2012-07-25
  • 打赏
  • 举报
回复
void CDlgCustom::OnBnClickedButtonOkCustom()
{
/* DoSomething */
SendMessage( WM_CLOSE, 0, 0 );
::SendMessage( m_customHwnd, WM_CUSTOMTOINFO_MESSAGE, 0, 0 );
}

窗口都销毁了,怎么发消息
你把这句话上下换个顺序看看
mashimaro1225 2012-07-25
  • 打赏
  • 举报
回复
一天了...还是没人...貌似已经沉了...
mashimaro1225 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

BringWindowToTop(this->Getsafehwnd() );
GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus();
试试
[/Quote]

试过了,虽然加上BringWindowToTop()这句话后,主窗口会显示光标,但是并不是在我想设置焦点的控件上,而是在打开子对话框之前的那个控件上。就是说:打开子对话框之前,光标在EDIT1上,而关闭子对话框后,我想让光标回到EDIT2上,可是加上BringWindowToTop()这句话之后,光标还是在EDIT1上。
mashimaro1225 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

DoModal的时候主窗口被Disable了,看下DoModal的源码就知道了。
[/Quote]

真是这样的话,那该怎么处理呢?难道要用Create(),然后ShowWindow()?
  • 打赏
  • 举报
回复
别发消息了,直接加上下面这句话就行了
如果分情况设置焦点,就判断dlg.DoModal();的返回值

void CDlgBillInfo::OnBnClickedButtonQuery()
{
CDlgCustom dlg;
dlg.m_customHwnd = this->m_hWnd;
dlg.DoModal();

GetDlgItem( IDC_EDIT_SHBILLNO )->SetFocus();
}
mashimaro1225 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

void CDlgCustom::OnBnClickedButtonOkCustom()
{
/* DoSomething */
SendMessage( WM_CLOSE, 0, 0 );
::SendMessage( m_customHwnd, WM_CUSTOMTOINFO_MESSAGE, 0, 0 );
}

窗口都销毁了,怎么发消息
……
[/Quote]

消息的确是发出去了,而且主对话框也收到了消息,就是SetFocus()那句话没效果而已。发消息绝对是没问题的。
shen_wei 2012-07-24
  • 打赏
  • 举报
回复
焦点只显示在当前激活窗口上。。。
赵4老师 2012-07-24
  • 打赏
  • 举报
回复
楼主请移驾到VC/MFC论坛。(^_^)

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧