我们要在屏幕上输出连续的字符串,首先要创建消息响应函数WM_ONCHAR,此函数是用来读取键盘输入的字符串。接下来添加变量 m_strLine 来保存输入的字符串,m_strLine 是属于CString类的。通过if语句 分别响应回车键 退格键和其他字符。
void CTEXTView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
/**********************wjl****************************
<键入字符串>
1. 在OnChar下添加消息响应 就是响应键盘输入的字符
2. 在键盘上按下回车键,字符串的输入就要换行(在Y方向上增加一个字符高度)
3. 在键盘上按下退格键,删除一个字符,这里并不是直接删除,而是把文本设置成背景色,
然后去掉最后一个字符,再显示出来,附上之前的颜色
4. 在键盘上按下字符后,直接在原有字符串m_strLine 后面加上nChar 字符
5. 最后要用TextOut 输出按键后的字符串
6. 要让光标跟随字符的输入,让光标获取当前字符串的尺寸,从而重新显示光标
***********************wjl****************************/
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if (0x0d == nChar) // 如果是按下回车键 清空之前的字符串
{
m_strLine.Empty();
m_ptOrigin.y += tm.tmHeight; // 对回车键的处理 按下回车后光标跑到下一行
}
else if (0x08 == nChar) // 按下退格键 消除一个字符
{
// 首先将文本设置成背景色(要保存之前的颜色 SetTextColor函数返回先前的颜色)
COLORREF clr = dc.SetTextColor(dc.GetBkColor());
dc.TextOutW(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
// 接下来 减少一个字符
m_strLine = m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr); // 将文本颜色设置成之前的颜色
}
else // 将字符加到之前的对象中
{
m_strLine = m_strLine+(char)nChar;
}
// 让光标随着字符移动
CSize sz = dc.GetTextExtent(m_strLine); // 获得当前字符串的尺寸
CPoint pt;
pt.x = m_ptOrigin.x + sz.cx;
pt.y = m_ptOrigin.y;
SetCaretPos(pt); // 重新显示光标
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
CView::OnChar(nChar, nRepCnt, nFlags);
}
我们想要插入符随着鼠标左键移动,首先创建消息响应函数WM_OnLButtonDown,用来捕获鼠标左键,SetCaretPos() 函数是光标的位置函数
void CTEXTView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
/**********************wjl****************************
<鼠标左键响应>
1. 按下鼠标左键,光标自动定位到鼠标处
***********************wjl****************************/
SetCaretPos(point); // 让光标跟着鼠标左键走
m_strLine.Empty(); // 将CString 里面的内容清空
m_ptOrigin = point; // 将鼠标左键按下的坐标赋给 m_ptOrigin 用来确定字符串的起始位置
CView::OnLButtonDown(nFlags, point);
}