从CEdit类派生一个CConsoleShell类,迷惑中...
项目需要希望能够有个输入界面,类似于象在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




