我现在想实现的是这样的一个功能,我打算在主窗口屏幕上双击鼠标,这时候再鼠标的位置创建一个编辑控件,
这个编辑空间中默认有hello world这样的文本。我的问题是,我双击之后创建了编辑控件,但是这时候看不到光标在闪烁,必须得鼠标再次点击一下文本框才行。我现在想要的效果是,双击创建编辑控件后可以看到光标闪烁,而且光标位于这段文本的最右侧,同时可以直接输入文字编辑。我尝试了SetFocus(hEdit); //加上这句之后可以直接编辑了,但是看不到光标删除,而且是在最左侧插入字符。
        ShowCaret(hEdit);// 加上这个之后仍然看不到光标闪烁,并且产生的另外一个问题是点击鼠标居然也看不到光标了。各位帮忙看看咋回事儿呢?

解决方案 »

  1.   

    BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if((WM_LBUTTONDBLCLK == pMsg->message) && (GetSafeHwnd() == pMsg->hwnd))
    {
    CEdit edit;
    CPoint pt = pMsg->pt;
    ScreenToClient(&pt);
    edit.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL, CRect(pt, CSize(100, 20)), this, 0x11);
    edit.SetFocus();
    edit.SetSel(-1, -1);
    edit.ReplaceSel(_T("Hello, World!"));
    edit.UnsubclassWindow();
    return TRUE;
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   

    我是如下这样做的,为啥不行呢,我的目的是双击之后直接选中编辑控件里的文本:

    m_hEdit = CreateWindowEx( 0, TEXT("Edit"), m_atcText, WS_VISIBLE | WS_CHILD |
    WS_BORDER, m_ptTextPos.x, m_ptTextPos.y, m_iTextWidth,m_iTextHeight, m_hParent, NULL, NULL, NULL);SetFocus(m_hEdit);
    SendMessage( m_hEdit, EM_SETSEL, 0, lstrlen(m_atcText) ); //运行到这里程序就挂了,这句话感觉没有问题啊。 
      

  3.   

    是不是使用了移动窗体的函数(也就是用鼠标点击窗体上非标题栏的部分不松开,并移动鼠标,窗体随之移动)?
    这个函数要获取鼠标响应,你点击编辑框也要获得鼠标响应,所以在处理这个事件的时候要分清楚,鼠标点击的是子窗口控件还是主窗体。
    case WM_LBUTTONDOWN:
    switch(LOWORD(wParam))
    {
    case 1022://是子窗口控件就略过(可能要列出所有子窗口控件的ID)
    return 0; default://除了子窗口以外就是主窗体了
    OnLbuttonDown(hWnd,lParam);//在窗口上按住左键可拖动窗口
    break;