控件初始化时会在上面显示两个字符,不想让用户通过鼠标将光标移动到这两个字符之前,即控制光标在这两个字符后面移动。我的想法是添加CEdit的Setfocus响应函数,然后在里面判断光标的位置,如果发现光标的位置是0或者1,就将光标位置移动到2,可是实现起来发现不起作用。当我用鼠标点最前面,响应函数里能判断出位置为0,但是移动光标不起作用。移动光标用的是SetSel的方法。后来这样做的,当判断光标的位置小于2时,将焦点转到其它控件上,然后再设置光标的位置,可实验中发现光标还是位置没有发生改变。再后来这样实验了一下,当光标位置大于10时,就将焦点转到其它控件上,不转回来了,然后一直输入,结果光标一直好好的在Edit控件上。不太清楚原理,不知道能不能通过这种方式实现。

解决方案 »

  1.   

    恩,貌似在LBUTTONDOWN里面处理就可以了。试试,晚上结帖。
      

  2.   

    要是这两个字符给别人看的,做成label
    要是内部用的,获取输入后,自己添加
      

  3.   

    我测试了一下,可以实现,在CEdit的SetFous消息里不能正确获得光标位置,处理LBUTTONDOWN与LBUTTONUP同样达不到效果需在PreTranslateMessage中截获LBUTTONUP消息,才能正确获得光标所在EDIT的位置,一下为测试代码:
    BOOL CTest2Dlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message==WM_LBUTTONUP)
    {
    CRect rcEdit;
    m_cltEdit.GetWindowRect(&rcEdit);
    CPoint point = pMsg->pt;
    if(rcEdit.PtInRect(point))
    {
    int nS,nE;
    nS = nE = 0;
    m_cltEdit.GetSel(nS,nE);

    CString str;
    str.Format("nS:%d,nE:%d",nS,nE);//取得当前光标位置
    TRACE(str+"\n");
    if(nS<4)
      m_cltEdit.SetSel(4,4);//将光标移动到第四个光标之后
    }
      }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    因为是写在组件里,所以PreTranslateMessage的方法就放弃了。
    现在基本上实现了这个功能了,派生了一个CEdit类,响应了WM_CHAR、WM_LBUTTONDOWN、WM_LBUTTONUP三个消息,方法就是在消息响应函数里判断光标位置,如果位置小于2,就移动光标,现在的问题就是用WM_LBUTTONDOWN消息处理时,移动光标间隔性的成功,用WM_LBUTTONUP来处理时,每次都能移动成功,但移动成功后会把移动后的位置与当前位置间的内容选定。 LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    CPoint pt = this->GetCaretPos();
    int nPos = this->CharFromPos(pt);
    if(nPos < 2)
    {
    this->SetSel(2, 2, TRUE);
    this->SetFocus();
    return 0;
    }
    bHandled = FALSE;
    return 0;
    }
    LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    CPoint pt = this->GetCaretPos();
    int nPos = this->CharFromPos(pt);
    if(nPos < 2)
    {
    this->SetSel(2, 2, TRUE);
    this->SetFocus();
    return 0;
    }
    bHandled = FALSE;
    return 0;
    }
    看能不能改进一下?
      

  5.   

    处理一下 EM_SETSEL 看看
      

  6.   

    CEdit的Setfocus响应函数中:
    edit.SetSel(edit.GetWindowTextLength(),edit.GetWindowTextLength());
    edit.SetFocus();
      

  7.   

    Edit里光标是系统通过 WM_SYSTIMER来进行刷新的
      

  8.   


    最简单的办法就是换 VS2008 sp1, 有个 CMFCMaskedEdit你看图上 Mask4 的 0x、Mask3 的 S/N 就是固定的,光标移动不过去。
      

  9.   

    解决了,贴上代码 LRESULT OnKey(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    if(VK_LEFT == wParam)
    {
    CPoint pt = this->GetCaretPos();
    int nPos = this->CharFromPos(pt);
    if(nPos <= 2)
    {
    return 0;
    }
    }
    bHandled = FALSE;
    return 0;
    }
    LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // CPoint pt = this->GetCaretPos();
    int nPos = this->CharFromPos(GET_X_LPARAM(lParam));
    if(nPos < 2)
    {
    this->SetSel(2, 2, TRUE);
    this->SetFocus();
    return 0;
    }
    bHandled = FALSE;
    return 0;
    }
    LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    int nPos = this->CharFromPos(GET_X_LPARAM(lParam));
    if(nPos < 2)
    {
    return 0;
    }
    bHandled = FALSE;
    return 0;
    }
    由于受到处理键盘时思路的影响,处理鼠标时也用了GetCaretPos(),绕了一个弯,总算绕回来了。