【VC++】007字符输入

继续前行...

对于字符的输入功能,大家都很熟悉了,即是当我们在键盘上按下某个字符的时候,该字符即会输出到程序窗口上。

这里我们让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);

其中:TEXTMETRICGetTextMetrics和之前一样,获得当前设备描述表中字体的高度信息,回车操作即是改变鼠标插入符位置,将纵坐标加上高度即可;

而退格键实际上是先将文本的颜色设置为背景色,输出它;然后在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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值