MFC (四) 处理文本

默认消息的处理方法

1.确认什么消息

2.添加消息处理函数

3.添加代码

默认消息指在消息定义中已存在的消息

这里我们对文本做换行处理

1.我们在ondraw里修改代码,这样,无论放大,缩小,都不会改变文本

void CMFCpaintView::OnDraw(CDC* pdc){  
  CString sub = _T(" ");
	int y = 0;
	for (int i=0;iTextOut(0, y, sub);
			sub.Empty();
			y += 20;
			continue;
		}
		sub += m_strText.GetAt(i);
	}
	if (sub.IsEmpty() == FALSE)
	{
		pdc->TextOut(0, y, sub);
	}
}

如果遇到换行符,就输出文本,并且换行,并将接下来的文本,储存起来,并通过第二个if,将它打印,这里打印后,发现并没有我们想要的换行,进行调试

首先,打上断点

MFC (四) 处理文本_第1张图片

 依次监视各个局部变量,按F5执行,并键入a、回车

MFC (四) 处理文本_第2张图片

 可以看到,回车在这里的值为\r,我们打开m_strtext的文本可视化,把鼠标移到m_strtext上面,点击放大镜图标,可以看到这里成功换行了

MFC (四) 处理文本_第3张图片

所以说明是我们的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);

你可能感兴趣的:(C++大一下学期之MFC,mfc,c++)