项目需要希望能够有个输入界面,类似于象在cmd环境下一样,可以根据输入的命令执行相应的动作,我考虑编写一个shell控件,为了节省时间,打算直接从CEdit类派生,但是做下来发现要处理的问题太多,我选了两个实在想不出的列在下面,请大家指点。1. 怎么实现让当前的输入点总是最后一行,鼠标可以使光标移动到任何位置,但输入的内容只能出现在最后一个提示符(例如"->")后面?2. 怎么能实现在输入回车键后,显示的内容不包含上次的输入,如"->abcdefg",如果将光标移动到"cd"之间,敲回车的时候,d后面的所有字符会出现在下一行。说实话直接从CEdit派生我能想到的处理办法都试过了,均不奏效,都快考虑从CWnd派生来自画了,不过那样周期太长了,大家有什么好办法吗?

解决方案 »

  1.   

    你可以用到SetCursor() 和 GetCursor()两个API函数啊,试试看啊
      

  2.   

    This function establishes the cursor shape.HCURSOR SetCursor(
    HCURSOR hCursor);
    This function retrieves the handle to the current cursor. HCURSOR GetCursor(VOID)
      

  3.   

    listbox可以这样写
    CString str;
    str.Format ("asdfasdf");
    m_TextWin.AddString (str.GetBuffer (0));
    int numList=m_TextWin.GetCount()-1;
    m_TextWin.SetTopIndex(numList);
    m_TextWin.SetCurSel(numList);

    //水平滚动
    int max_width=0;
    CSize sz;
    CClientDC dc(this);
    for(int i=0;i<m_TextWin.GetCount();i++)
    {
    m_TextWin.GetText(i,str);
    sz=dc.GetTextExtent(str);
    if(max_width<sz.cx)
    max_width=sz.cx;
    }
    m_TextWin.SendMessage(LB_SETHORIZONTALEXTENT,max_width,0);
    好象还要对回车键进行响应处理
    BOOL CDBallGameDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if (pMsg->message == WM_KEYDOWN)
    {
                  if(pMsg->wParam==VK_RETURN)
         {
                  //通过对游标位置的确定,然后对本行字段需要的部分进行串行处理
                   }
              }
               
    }
        return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    非要自己做吗?在程序里调用cmd不行吗?
      

  5.   

    我觉得第一个很好实现阿,你需要在你的派生类中响应OnChar函数,然后不要用默认的CEdit::OnChar
    大概这样
    void CCmdEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    CString str,strtotal;
    GetWindowText(str);
    strtotal.Format("%s%c",str,nChar);
    SetWindowText(strtotal);
    // CEdit::OnChar(nChar, nRepCnt, nFlags);
    }基本能实现无论插入点在哪里都可以只输入到最后,你可以配合SetCaretPos(),使效果更好
    感觉第二个也可以解决,你的派生类
    通过OnKeyDown,OnChar,SetCaretPos,这函数来动态的修改插入点和插入内容,实现这些效果应该没有问题,只是需要很多算法罢了。你如果想省事点,可以象ZMud那样,一个edit输入命令,一个edit输出执行结果,那样效果也不错
      

  6.   

    首先感谢大家的帮忙,谢谢!可能我的问题没说清楚,我这个Shell是不能够每次输入一个字符都要用GetWindowText/SetWindowText,因为我最后是要给用户注册自己的命令的接口,一旦注册了接口命令,就可以在shell下直接输入,要注意的是,用户命令的输出内容可能是相当多的,换句话说,如果每次都进行全部文本的操作代价可想而知,所以wangjianddy(世界上最好的猫!(抵制日货!)) 提供的代码能解决这个问题,但不实用。其实shell和edit的区别是,shell有输入和输出两个部分,而edit是输入和回显,其实我只会保留一部分的已经显示过的内容,其余的是要删除的。
      

  7.   

    你做2个CEdit.上面一个COutEdit(多行),下面一个CInEdit(1行)。
    用户在CInEdit输入。每次敲回车的结果,增加到COutEdit.
    COutEdit和CInEdit可以做的没有边框,好看一点。
    COutEdit自己向上滚动。
    至于
    ->abcdefg",如果将光标移动到"cd"之间,敲回车的时候,d后面的所有字符会出现在下一行。
    你可以做的灵活一点,比如用户鼠标可以点COutEdit的一行,copy下来到CInEdit,或者
    双击COutEdit一行后,在CInEdit显示这一行。
    这样做好吧
      

  8.   

    你说的我也做过,不过是用Java做的,就是按我说的做的,很好用啊
      

  9.   

    楼上说的方法我考虑过,不过好像不太合适,因为输入的edit相当于是固定在最底行,而我需要让它随着显示内容的增加自动变化,必要的时候可以改变位置。另外输入的edit不能是一个单行的,因为有可能用户在创建我的shell时候rect太小,命令太长,自动换行。
      

  10.   

    to:  vcmute不太明白能详细说说吗?
      

  11.   

    终于搞定了,一个CEdit实现了,谢谢大家的帮助。