字符输入
Posted 大道至简-giserDev
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符输入相关的知识,希望对你有一定的参考价值。
本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6258168.html
建立一个MFC单文档工程Test,为其添加一个OnChar()函数,让CTextView类捕获WM_CHAR消息,接着定义一个专门用于存储输入的字符串的CString类型的成员变量:m_strLine,并在构造函数中初始化为空,如图,编译器(VS2010)已经自动完成此工作。
需要注意的几个问题:
问题一:插入符应定位在鼠标左键单击的位置,并在此位置处开始往后输出字符。
为此需要在WM_LBUTTONDOWN消息中利用如下函数完成:SetCaretPos(Point); ,此时会发现插入符会在单击View中的某一处时随单击位置移动。
问题二:用来存储输入字符的字符串的成员变量m_strLine的取值变化问题。
当鼠标单击一个新位置时,应清空已有的输入字符,使得之后的输入都从此处开始输出到View中。
问题三:保存当前单击处的坐标,便于却确定字符串每次的输出位置。
为此添加CPoint类型的变量m_ptOrigin,并初始化为0,在鼠标按下时记录当前位置。
问题四:回车符的处理。
当按下回车时需要重新计算插入符的新位置,此时插入符的横坐标不变(?),新的纵坐标可以利用已保存的当前插入点的纵坐标加上当前字体的高度即可得到。GetTextMetrics()函数获取当前设备描述表中字体的高度信息。
问题五:特殊字符处理:退格键(Backspace键)
(利用文本颜色与背景色一致的技巧)利用CDC类的GetBkColor函数获取背景色,利用CDC类的SetTextColor函数设置文本颜色,利用CString类的Left函数从字符串中删除一个字符。
具体代码如下:
运行程序,进行测试。
结果发现,插入符并不会随着字符的输入而移动,我们可以利用SetCaretPos函数来设置插入符的位置,对同一行的输入,纵坐标不变,横坐标需要获取输入字符的宽度来确定插入符移动之后的位置。如图示:在输出字符串之前设定插入符的位置。
运行,结果如图所示:
如果有疑问,可以联系giserdev@163.com,更多内容请参考:http://www.cnblogs.com/mxbs/,技术交流请加QQ群:586571286。
以上是关于字符输入的主要内容,如果未能解决你的问题,请参考以下文章
事先允许最多五个英文字符串输入后,再指定输出顺序的编号(即对应输入字符串的顺序),使对应输出的英文字符