采用如下的方法,不能实现预期的效果。请问该如何实现?在按钮按下的代码中用GetDlgItem(IDC_EDIT1)->SetFocus();可以成功将IDC_EDIT1设为当前的焦点。
如果此时改为按钮按下的代码中开始一个线程,在线程中设置焦点,则运行时不能成功设置焦点。线程为:
UINT (LPVOID lpParam)
{
  CFocusDlg pDlg;
  pDlg = (*CFocusDlg)lpParam;
  pDlg->GetDlgItem(IDC_EDIT1)->SetFocus();
  return 0;
}

解决方案 »

  1.   

    你不如这样
    UINT (LPVOID lpParam/* 传入Edit窗口HWND*/)
    {
      SetFocus((HWND)lpParam);
      return 0;
    }
      

  2.   

    问题是在线程里我还需要进行别的与窗口有关操作,只传Edit的话,其它的操作就不能做了。我试了一下SetFocus((HWND)(pDlg->GetDlgItem(IDC_EDIT1)));还是不行那为什么在线程中pDlg->GetDlgItem(IDC_BUTTON1)->EnableWindow(false);这种操作就能实现呢?
      

  3.   

    ((CEdit *)pDlg->GetDlgItem(IDC_EDIT1))->SetFocus();
      

  4.   

    ((CEdit *)pDlg->GetDlgItem(IDC_EDIT1))->SetFocus();
    这样还是不行
      

  5.   

    SetFocus()函数的MSDN解释是The SetFocus function sets the keyboard focus to the specified window. The window must be attached to the calling thread's message queue. 
    但是目前你的第二个线程有自己的消息队列,CFocusDlg这个窗口属于第一个线程,所以他使用的是第一个线程的消息队列。
    还有
    UINT (LPVOID lpParam)
    {
      CFocusDlg pDlg;
      pDlg = (*CFocusDlg)lpParam;应该为
      CFocusDlg* pDlg;
      pDlg = (CFocusDlg*)lpParam;
      

  6.   

    谢谢,我的确抄错了。源程序中应该用的是下面这个函数,MSDN解释如下:
    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.我觉得你说的很有道理,那我应该怎样做才能得到期望的结果呢?
      

  7.   

    MFC中的源代码如下,其实它调用的是SetFocus这个API,所以上次我直接就把API的解释粘贴上了,
    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键,对话框的消息处理过程。
      

  8.   

    我在线程中用
    pDlg->GetDlgItem(IDC_EDIT1)->SendMessage(WM_SETFOCUS)(WM_SETFOCUS);
    发送消息,焦点倒是可以转换了,可是Edit控件无法输入字符了! 是不是我发消息发的不对?
      

  9.   

    可以把源程序发给我吗?,我帮你看看。我的信箱是[email protected]
      

  10.   

    多谢黑暗之光!原来在发送SETFOCUS消息后还要发一个ACTIVATE消息