vs 文本输入 回退后留下光标的线

 书上抄的一段代码,处理键盘输入的字符并显示,但在处理回退键的时候出现了下面这样的问题

代码:

void CMFCApplication1View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	//创建设备描述表
	CClientDC dc(this);
	CFont font;
	CFont *oldFont = dc.GetCurrentFont();
	font.CreatePointFont(300,  (LPCTSTR)"宋体",NULL);
	dc.SelectObject(&font);
	TEXTMETRIC tm;//文本消息结构体
	dc.GetTextMetrics(&tm);//获得设备信息描述表中的文本信息//仅仅作为一个度量
	if (0x0d == nChar)//回车
	{
		m_strLine.Empty();
		m_ptOrigin.y += tm.tmHeight;
	}
	else if(0x08 == nChar)//backspace回格
	{
		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 += (WCHAR)nChar; 
	}
	HideCaret();
	CSize sz = dc.GetTextExtent(m_strLine);
	CPoint pt;
	pt.x = m_ptOrigin.x + sz.cx;
	pt.y = m_ptOrigin.y;
	SetCaretPos(pt);
	ShowCaret();
	dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);

	dc.SelectObject(oldFont);
	CView::OnChar(nChar, nRepCnt, nFlags);
}

问题及处理办法:

1、回退出现竖线:注释掉字体设置那一行。  因为TextOut这个函数,收到字体影响很大,它会自动刷新默认字体区域,但如果字体特殊,会造成部分残留。

2、中文回退出现‘’?‘’号:把m_string+=(char)nChar

改成m_string+=(WCHAR)nChar; 就可以了,因为汉字是双字符

3、输入中文的时候可能会出现乱码:项目右键--> 属性  将 character set改成unicode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值