采用如下的方法,不能实现预期的效果。请问该如何实现?在按钮按下的代码中用GetDlgItem(IDC_EDIT1)->SetFocus();可以成功将IDC_EDIT1设为当前的焦点。
如果此时改为按钮按下的代码中开始一个线程,在线程中设置焦点,则运行时不能成功设置焦点。线程为:
UINT (LPVOID lpParam)
{
CFocusDlg pDlg;
pDlg = (*CFocusDlg)lpParam;
pDlg->GetDlgItem(IDC_EDIT1)->SetFocus();
return 0;
}
如果此时改为按钮按下的代码中开始一个线程,在线程中设置焦点,则运行时不能成功设置焦点。线程为:
UINT (LPVOID lpParam)
{
CFocusDlg pDlg;
pDlg = (*CFocusDlg)lpParam;
pDlg->GetDlgItem(IDC_EDIT1)->SetFocus();
return 0;
}
解决方案 »
- 有没有做证劵软件相关的童鞋,讨论一下业务
- 请教高手,如何让单文档应用程序不在标题栏上绘制标题
- 关于采集时间和预期时间对不上的问题!
- 怎样让自定义的类接收到菜单的命令消息?
- CSplitterWnd边框颜色问题
- 下载Visual C++ 8.0Beta
- VC中的CTreeCtrl有没有类似Delphi中TTreeView的ChangeDelay的属性
- 为什么到了main函数调用时就不对了,运行出来的结果是错的,求指导
- 汉字的内码 拼音 和 具体的汉字 之间的转化
- 难道,难道技术真的有穷尽了吗?
- vc中有没有浏览文件夹的通用对话框?
- 在多文档 的应用程序中,CChildFrame与CMainFrame的关系怎样?
UINT (LPVOID lpParam/* 传入Edit窗口HWND*/)
{
SetFocus((HWND)lpParam);
return 0;
}
这样还是不行
但是目前你的第二个线程有自己的消息队列,CFocusDlg这个窗口属于第一个线程,所以他使用的是第一个线程的消息队列。
还有
UINT (LPVOID lpParam)
{
CFocusDlg pDlg;
pDlg = (*CFocusDlg)lpParam;应该为
CFocusDlg* pDlg;
pDlg = (CFocusDlg*)lpParam;
吧
CWnd* SetFocus( );Return ValueA pointer to the window object that previously had the input focus. It is NULL if there is no such window. The returned pointer may be temporary and should not be stored.我觉得你说的很有道理,那我应该怎样做才能得到期望的结果呢?
CWnd* CWnd::SetFocus()
{
ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlSite == NULL)
return CWnd::FromHandle(::SetFocus(m_hWnd));
else
return m_pCtrlSite->SetFocus();
}
解决这个问题可以用SendMessage,或PostMessage,发送WM_KILLFOCUS和WM_SETFOCUS,我不知道你程序为什么要获得焦点,当在DLG上实现时,光获得焦点还是不够的,对话框管理逻辑会把Enter键的输入发送给DefaultButton,所以你还要改变按钮的风格。详细,可以用SPYXX跟踪一下在对话框上按TAB键,对话框的消息处理过程。
pDlg->GetDlgItem(IDC_EDIT1)->SendMessage(WM_SETFOCUS)(WM_SETFOCUS);
发送消息,焦点倒是可以转换了,可是Edit控件无法输入字符了! 是不是我发消息发的不对?