创建一个MFC的单文档工程,实现利用键盘输入文字功能,并存在光标跟随移动。
学习到对于鼠标消息,字符输入消息的响应。
MFC单文档程序创建后,有四个类,也是四个文件。CMainFrame,CMFC_tets1App,CMFC_tets1Doc,CMFC_tets1View。CMainFrame属于框架类,包括客户区和非客户区,视图类即View类的父窗口,视图就显示在MainFrame的客户区中。
CMFC_tets1App 负责:处理消息,将收到的消息分发给相应的对象。CMFC_tets1Doc 文档类。CMFC_tets1View视图类,主要是客户区处理。
1、首先创建光标,在OnCreate()函数中,如果没有,利用WM_CREATE消息创建
<span style="font-size:18px;">int CMFC_tets1View::OnCreate(LPCREATESTRUCT lpCreateStruct) //创建客户区窗口时调用的函数
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);//创建客户区类型
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);//获取当前字符高度和宽度值,来矫正插入光标的大小
CreateSolidCaret(tm.tmAveCharWidth / 8, tm.tmHeight);//创建插入符
ShowCaret();//显示插入符
SetTimer(1, 100, NULL);//设置定时器消息,1表示定时器标识符,100表示100ms产生一个消息,NULL指的是进入消息队列产生WM_TIMER消息
// TODO: 在此添加您专用的创建代码
return 0;
}</span>
2、利用鼠标按下消息,使光标跟随鼠标移动
void CMFC_tets1View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCaretPos(point);//根据鼠标点击显示光标位置
m_ptOrigin = point;
m_strLine.Empty();//每次点击改变光标位置时,将用于显示的存储字符串清空
CView::OnLButtonDown(nFlags, point);
}
3、利用WM_CHAR消息响应键盘输入信息
void CMFC_tets1View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);//获取当前输入字符的高度和宽度
if (0x0d == nChar)//0x0d表示回车符,点击回车后的一些操作
{
m_strLine.Empty();
m_ptOrigin.y += tm.tmHeight;//将光标下移一个字符
}
else if (0x08 == nChar)//0x08退格符,下面使用实现的方法是,先将文本背景色取出,然后将背景色设置为字体颜色,重写字体,即覆盖了原来字体。然后将字体颜色恢复,同时将字符串中减少一个字符,再重写字体,实现删除一个字体功能
{
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 + (TCHAR)nChar;
}
CSize cs;
cs = dc.GetTextExtent(m_strLine);//获取这一行文本的高度和宽度值
CPoint pt;
pt.x = m_ptOrigin.x + cs.cx;
pt.y = m_ptOrigin.y;
SetCaretPos(pt);//重新设置光标位置,跟随字符输入移动
dc.TextOutW(m_ptOrigin.x, m_ptOrigin.y, m_strLine);//根据原鼠标点击位置输出字符
CView::OnChar(nChar, nRepCnt, nFlags);
}