在View类通过类向导增加create消息函数,描绘焦点
int CText3View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//创建焦点
CreateSolidCaret(10, 40);
ShowCaret();
return 0;
}
添加char消息函数监听键盘
添加m_strLine成员变量保存键盘的输入, m_ptOrgin保存鼠标的坐标
void CText3View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
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.TextOutW(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);
dc.SetTextColor(clr);
//删除的原理是先将字符空白显示,然后再截取掉最后一个字符,再显示字符
}
else
{
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);
}
void CText3View::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCaretPos(point);
m_ptOrigin = point;
m_strLine.Empty();
CView::OnLButtonDown(nFlags, point);
}