CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

从CEdit类派生一个CConsoleShell类,迷惑中...

楼主98440622(民工++)2005-04-02 10:35:53 在 VC/MFC / 基础类 提问

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

1 楼Darrren2185(考拉)回复于 2005-04-02 10:39:10 得分 1

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

2 楼xuzheng318(忧郁王子)回复于 2005-04-02 10:54:27 得分 1

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

3 楼psprite(小皮)回复于 2005-04-02 11:13:30 得分 30

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);  
  }Top

4 楼zx_sanjin(www.chmbook.com - CHM电子书网)回复于 2005-04-02 11:28:40 得分 1

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

5 楼wangjianddy(~~~~>_<~~~~)回复于 2005-04-02 15:36:10 得分 30

我觉得第一个很好实现阿,你需要在你的派生类中响应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输出执行结果,那样效果也不错Top

6 楼98440622(民工++)回复于 2005-04-02 17:46:24 得分 0

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

7 楼98440622(民工++)回复于 2005-04-02 21:44:11 得分 0

up   一下  
  Top

8 楼Mackz(在相互)回复于 2005-04-02 22:21:35 得分 0

这个东西自己编一下也不难的。Top

9 楼cut9(切瓜玩)回复于 2005-04-02 22:54:48 得分 30

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

10 楼cut9(切瓜玩)回复于 2005-04-02 22:57:12 得分 1

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

11 楼98440622(民工++)回复于 2005-04-03 09:22:44 得分 0

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

12 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-04-03 11:10:04 得分 1

SetSelTop

13 楼98440622(民工++)回复于 2005-04-03 14:09:33 得分 0

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

14 楼helenhf(rtos.bigwww.com)回复于 2005-04-03 22:16:25 得分 5

upup~~Top

15 楼98440622(民工++)回复于 2005-04-04 15:37:53 得分 0

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

相关问题

  • 从CEdit类派生一个CConsoleShell类,迷惑中...
  • 在派生的CEdit中设置风格,应该在哪里设?
  • CDialogBar中的CEdit派生对象为何不能响应消息??
  • 关于一个派生一个CEdit类的问题
  • 巨菜的问题:从CEdit派生的类在何处初始化?
  • 在MFC程序中,能不能派生CEdit類時對CEdit類進行子類化?
  • 迷惑!
  • 迷惑...
  • 迷惑
  • 迷惑

关键词

  • 函数
  • 字符
  • 用户
  • 内容
  • 移动
  • 效果
  • 输入
  • coutedit
  • 派生
  • cedit

得分解答快速导航

  • 帖主:98440622
  • Darrren2185
  • xuzheng318
  • psprite
  • zx_sanjin
  • wangjianddy
  • cut9
  • cut9
  • vcmute
  • helenhf

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo