继续前行...
对于字符的输入功能,大家都很熟悉了,即是当我们在键盘上按下某个字符的时候,该字符即会输出到程序窗口上。
这里我们让CString类型的变量m_strLine来存储输入的字符串,首先初始化为空:
private:
CString m_strLine;
m_strLine = "";
这时,首先我们要解决的是插入符位置的问题,当程序运行时,我们希望插入符能跟着我们的鼠标走,这时,通过OnLButtonDown响应函数,利用CWnd类的SetCaretPos()来实现;
static void PASCAL SetCaretPos( POINT point );
在OnLButtonDown添加如下:
SetCaretPos(point);
即可实现插入符随我们动;
另外,之前我们创建了一个CString类型的m_strLine存储输入的字符串,当我们插入符换个位置时,这时候我们的字符串实际上已经是空的了。
所以,在OnLButtonDown中添加如下:
m_strLine.Empty();
第三个问题,因为每次输入的字符都是从插入符开始,所以我们得有一个CPoint类型的变量来存储坐标:
创建变量:private:
CPoint m_ptOrigin;
赋初值:
m_ptOrigin=0;
在OnLButtonDown中添加:
m_ptOrigin=point;
最后还得考虑到回车字符,以及退格键的问题,这个我们在实际使用中比较频繁;
在对字符处理是,是有WM_CHAR消息响应函数来对字符进行输出处理:
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar) //回车
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
else if(0x08==nChar) //退格
{
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine+=nChar;
}
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
CView::OnChar(nChar, nRepCnt, nFlags);
其中:TEXTMETRIC,GetTextMetrics和之前一样,获得当前设备描述表中字体的高度信息,回车操作即是改变鼠标插入符位置,将纵坐标加上高度即可;
而退格键实际上是先将文本的颜色设置为背景色,输出它;然后在m_strLine中删除,然后将文本的颜色改回来,最后输出它;
具体实现:
COLORREF clr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
然后dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine)即可;
执行:
这时我们发现虽然回车,退格什么都实现了,但是我们输入的时候插入符并没有跟着我们走,所以这时候我们要将插入符的位置的横坐标不断变化;
添加如下:
CSize sz=dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+sz.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt);
执行:
这时,我们发现基本可以了...
小工程可见:http://download.csdn.net/detail/xjm199/6782761
继续加油...o(∩_∩)o