笨笨问题1:CEdit或CRichEdit中取得当前光标位置该响应哪个消息?
想在状态栏中随时显示当前光标的位置,难道是处理鼠标左键按下和键盘方向键消息吗?还有字符输入时光标也移动阿。不会这莫罗嗦吧?笨笨问题2:鼠标右键菜单弹出时,其中的剪切和复制项会随着文本框中是否有选定
文本显示出不同的状态,我想在文本框中有选定文本的时候进行即时处理,请问要做到这些应该处理哪一个消息?别让我用Spy++,我看过了,但没找出来:(。谢谢。

解决方案 »

  1.   

    问题1:可以处理EditChanged的消息
      

  2.   

    1.看看下面delphi的代码
        LPos:=SendMessage(RichEdit1.Handle,EM_LINEFROMCHAR,
             RichEdit1.SelStart,0);
        CPos:=SendMessage(RichEdit1.Handle,EM_LINEINDEX,LPos,0);
        LineLength:=SendMessage(RichEdit1.Handle,EM_LINELENGTH,CPos,0);
        CPos:=RichEdit1.SelStart-CPos;
        LPos:=LPos+1;
        CPos:=CPos+1;
        StatusBar1.Panels[0].Text:='行: '+IntToStr(LPos)+'   列: '+
                         IntToStr(CPos)+'  此行字数: '+IntToStr(LineLength);
      

  3.   

    问题2:不太理解你的意思,你看看WM_CONTEXTMENU消息吧
      

  4.   

    2.rich edit里面有EN_SELCHANGE 消息
    不过没有看到一般edit有这个消息可以在复制ID_EDIT_COPY的那个UP_COMMAND_UI
    消息里面,判断有没有选定的内容
    如果有,加复制代码
      

  5.   

    这个函数中用到了设置获取光标的东西GetSel(),SetSel()
    void CTestDlgDlg::OnChangeEdit1() 
    {
    static char *str=",";
    char str2[3]={0,0,0};
    CString text;
    GetDlgItem(IDC_EDIT1)->GetWindowText(text);
    int iStart=HIWORD(((CEdit*)GetDlgItem(IDC_EDIT1))->GetSel());
    if(iStart!=0)
    {
    if(!((text[iStart-1]>='0'&&text[iStart-1]<='9')||(text[iStart-2]==str[0]&&text[iStart-1]==str[1])))
    {
    str2[0]=text[iStart-1];
    BOOL bDB=FALSE;
    if(text[iStart-1]<0)
    {
    str2[1]=str2[0];
    str2[0]=text[iStart-2];
    bDB=TRUE;
    }
    text.Replace(str2,"");
    GetDlgItem(IDC_EDIT1)->SetWindowText(text);
    if(bDB)
    {
    ((CEdit*)GetDlgItem(IDC_EDIT1))->SetSel(iStart-2,iStart-2,-1);
    }else
    {
    ((CEdit*)GetDlgItem(IDC_EDIT1))->SetSel(iStart-1,iStart-1,-1);
    }
    }
    }
    }
      

  6.   

    不好意思,这两天特忙,无法验证朋友们的代码,先挂两天在结贴。to jacky_zwq() :
    我的意思是一旦在文本框中有文本被选中(可能是鼠标的操作或键盘的操作)就即时
    响应,比如弹出带有选定文本的对话框,这时该响应哪个消息?谢谢朋友的关注!