项目需要希望能够有个输入界面,类似于象在cmd环境下一样,可以根据输入的命令执行相应的动作,我考虑编写一个shell控件,为了节省时间,打算直接从CEdit类派生,但是做下来发现要处理的问题太多,我选了两个实在想不出的列在下面,请大家指点。1. 怎么实现让当前的输入点总是最后一行,鼠标可以使光标移动到任何位置,但输入的内容只能出现在最后一个提示符(例如"->")后面?2. 怎么能实现在输入回车键后,显示的内容不包含上次的输入,如"->abcdefg",如果将光标移动到"cd"之间,敲回车的时候,d后面的所有字符会出现在下一行。说实话直接从CEdit派生我能想到的处理办法都试过了,均不奏效,都快考虑从CWnd派生来自画了,不过那样周期太长了,大家有什么好办法吗?
解决方案 »
- 有没有Visual Studio 2010 使用手册
- 关于连接字符串问题
- HTML help workshop目录的问题
- 各位,老师真是要我们命
- 请问如何取得frame的状态,也就是最大化,最小化。。。。?
- CMap使用,结构体作为键值 HashKey和CompareElement的重写?
- 有谁知道如何使用使用INF 2.5格式来安装我们的控件?
- 11天我升到了四角,特放200分——顺便问一个超级难题
- 一个关于属性页的简单问题,在线等待!《〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈!
- 帮忙,哪里出错了?(50送首位解开答案者)
- 多线程程序在P4-HTCPU机器上的问题
- 如何给悬浮窗设置ToolTip提示?
HCURSOR hCursor);
This function retrieves the handle to the current cursor. HCURSOR GetCursor(VOID)
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);
}
大概这样
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输出执行结果,那样效果也不错
用户在CInEdit输入。每次敲回车的结果,增加到COutEdit.
COutEdit和CInEdit可以做的没有边框,好看一点。
COutEdit自己向上滚动。
至于
->abcdefg",如果将光标移动到"cd"之间,敲回车的时候,d后面的所有字符会出现在下一行。
你可以做的灵活一点,比如用户鼠标可以点COutEdit的一行,copy下来到CInEdit,或者
双击COutEdit一行后,在CInEdit显示这一行。
这样做好吧