1、在消息WM_CREAT响应函数OnCreat中窗口创建文本插入符。
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);
TEXTMETRIC tm; //定义一个文本信息结构体,用于接收文本的字体信息
dc.GetTextMetrics(&tm); //获取当前文本的字体信息,主要需要字体的高度和宽度
CreateSolidCaret(tm.tmAveCharWidth, tm.tmHeight); //创建一个 文件插入符
ShowCaret(); //显示光标
return 0;
}
2、设置光标的位置为当前鼠标的点击位置
CString strLine; //存放文本缓冲区
POINT OldPoint; //存放鼠标的当前位置
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetCaretPos(point); //设置光标的位置为鼠标当前点击位置
OldPoint = point; //存放当前鼠标位置
strLine.Empty(); //清空文本缓冲区,就行下一次输入
CView::OnLButtonDown(nFlags, point);
}
3、通过捕获WM_CHAR消息,获取键盘输入消息。
void CMyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm); //获取文本信息
if (0x0d == nChar) //换行处理
{
strLine.Empty(); //情况缓冲区等待下一次输入
OldPoint.y += tm.tmHeight; //文本插入符 Y坐标加一个文本高度
}
else if (0x08 == nChar) //回车键处理
{
COLORREF clr = dc.SetTextColor(dc.GetBkColor()); //设置文本颜色为白色背景
dc.TextOut(OldPoint.x, OldPoint.y, strLine); //输出文本
strLine = strLine.Left(strLine.GetLength()-2); //去掉输出字符串的最后一位+空格
dc.TextOut(OldPoint.x, OldPoint.y, strLine);
dc.SetTextColor(clr); //恢复文本颜色
}
else
{
strLine += nChar; //把输入的字符 缓存在缓冲区中
}
/* 设置文本插入符的位置为当前输入位置 */
CSize sz = dc.GetTextExtent(strLine); //获取字符串文本信息
POINT pt;
pt.x = OldPoint.x + sz.cx;
pt.y = OldPoint.y;
SetCaretPos(pt); //设置文本插入符为当前文本输出的最后
dc.TextOut(OldPoint.x, OldPoint.y, strLine); //输出文本
CView::OnChar(nChar, nRepCnt, nFlags);
}