6-文本的换行处理

文本的换行处理

1.默认消息的处理方法

MFC中,绝大部分消息都已经被系统默认覆盖到了,如果需要,只需去实现并做好响应即可,具体步骤如下:

  • 1 确认响应什么消息

  • 2 添加消息响应函数

  • 3 追加消息响应内容

2.消息创建顺序

在窗口创建时,WM_CREATE消息被响应,对应函数为OnCreate函数。

当窗口配置好了,调用DoModal或者ShowWindow时,会响应WM_PAINT的绘制消息,这个消息将发消息给该窗口的所有控件,让每一个控件各自绘制自己的区域。在绘制前只有主框架,里面每一个控件都是空白的。

3.换行操作实现

由于TextOut只能实现单行文本,因此每次换行都要下移输出的位置,以此达到换行的效果。

思路:读取到的字符串成员变量,在输出时,遍历每一个字符成员。将两个换行间的字符存储到临时字符串中,遇到换行则输出该字符串,并移动打印位置和完成临时字符串的清空。

注意:换行在此处只是一个\r,原因未知。

//OnDraw
CString temp = _T("");
int y = 0;
for (int i = 0; i < m_strText.GetLength(); i++)
{
if (m_strText.GetAt(i) == '\r' || m_strText.GetAt(i) == '\n')
{
pDC->TextOut(0, y, temp);
y += 20;
temp.Empty();
continue;
}
temp += m_strText.GetAt(i);
}

if(!temp.IsEmpty())
pDC->TextOut(0, y, temp); //在设备上下文中输出文本

4.光标跟踪

使用SetCaretPos函数来改变光标位置

由于字符串显示时,每个字符的宽度不一致,因此直接使用GetTextExtent函数获取对应字符在显示时占的宽度,再将参数传给光标位置的函数

注意:CPoint是point的子类对象

//OnDraw
CSize cz = pDC->GetTextExtent(temp); //获取字符串的拓展信息,即对应的宽度和高度
CPoint pt; //创建传参
pt.y = y; //y是当前字符串的y值
pt.x = cz.cx; //x是当前字符串扩展信息的x值
SetCaretPos(pt); //在对应位置打印光标