默认消息的处理方法
1.确认什么消息
2.添加消息处理函数
3.添加代码
默认消息指在消息定义中已存在的消息
这里我们对文本做换行处理
1.我们在ondraw里修改代码,这样,无论放大,缩小,都不会改变文本
void CMFCpaintView::OnDraw(CDC* pdc){
CString sub = _T(" ");
int y = 0;
for (int i=0;i<m_strText.GetLength();i++)
{
if ((m_strText.GetAt(i)=='\n'))
{
pdc->TextOut(0, y, sub);
sub.Empty();
y += 20;
continue;
}
sub += m_strText.GetAt(i);
}
if (sub.IsEmpty() == FALSE)
{
pdc->TextOut(0, y, sub);
}
}
如果遇到换行符,就输出文本,并且换行,并将接下来的文本,储存起来,并通过第二个if,将它打印,这里打印后,发现并没有我们想要的换行,进行调试
首先,打上断点
依次监视各个局部变量,按F5执行,并键入a、回车
可以看到,回车在这里的值为\r,我们打开m_strtext的文本可视化,把鼠标移到m_strtext上面,点击放大镜图标,可以看到这里成功换行了
所以说明是我们的if那里出了问题,综上,是换行转成了\r而不是\n
所以将代码修改为
if ((m_strText.GetAt(i)=='\n')|| (m_strText.GetAt(i) == '\r'))
知识扩展*:由上可得知,textout只能显示单行文本
2.光标随着文本移动
CPoint pt;
pt.y = y;
CSize csize=pdc->GetTextExtent(sub);
pt.x = csize.cx;
SetCaretPos(pt);
gettextExtent确定文本大小,内部包含两个成员变量 cx 和 cy,setcaretpos设置光标位置,里面的两个参数分别是xy,鼠标移到函数上面,看到参数必须是POINT类型,而CPOINT是它的子类,所以可以传递CPOINT对象进去
查看setcaretpos定义
AFXWIN_INLINE void PASCAL CWnd::SetCaretPos(POINT point)
{ ::SetCaretPos(point.x, point.y); }
发现它还有一个重构的版本,所以也可以写成这样,这是一个系统API函数
::SetCaretPos(pt.x, pt.y);