第5章 文本编程
1.插入符
可以利用CWnd类的CreateSolidCaret函数来创建插入符,该函数的原型如下:
void CreateSolidCaret( int nWidth, int nHeight );
插入符的创建应该在窗口创建之后进行,可以在WM_CREATE消息的响应函数OnCreate中(在创建窗口的代码之后)添加创建插入符的代码。
为了能够让插入符适合当前字体的大小,首先就需要得到设备描述表中当前字体的信息,也就是文本信息,然后根据字体的信息来调整插入符的大小。调用CDC的GetTextMetrics成员函数可以得到设备描述表中当前字体的度量信息,该函数的原型声明如下:
BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) const;
如下代码演示了如何创建合适的插入符:
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight); //字体平均宽度除以8是一个经验值
ShowCaret();
此外,void CreateCaret( CBitmap* pBitmap );函数可以用来创建图形插入符。
2.窗口重绘
Windows程序运行时,如果窗口大小发生变化,窗口会发生重绘,如果希望输入的内容始终保留在窗口上,就要在响应WM_PAINT消息的函数中将内容再次输出。WM_PAINT消息的响应函数为OnDraw:
void CTextView::OnDraw(CDC* pDC)
{
CTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
…
}
CString类:MFC提供了一个CString类,这个类没有基类。一个CString对象由一串可变长度的字符组成。CString类同时重载了多个操作符,并且提供了多种构造方法。
3.路径
在MFC中创建路径层是利用CDC类提供的BeginPath和EndPath这两个函数来实现的,首先调用BeginPath,该函数的作用是在设备描述表中打开一个路径层;然后利用图形设备接口提供的绘图函数进行绘图操作,在绘图操作完成之后,应用程序通过调用EndPath函数关闭这个路径层。
裁剪区域:可以理解为一个绘图区域,其大小可以控制。CDC类提供了一个SelectClipPath函数,该函数的作用是把当前设置的路径层和设备描述表中已有的裁剪区域按照一种指定的模式进行一个互操作:
BOOL SelectClipPath( int nMode );
如指定新的裁剪区域包含当前裁剪区域,但是排除当前路径层区域:
CSize sz =pDC->GetTextExtent(str);
pDC->TextOut(250,150,str);
pDC->BeginPath();//打开一个路径层
pDC->Rectangle(250,150,250+sz.cx, 150+sz.cy); //画一个矩形,并将此矩形做为路径层
pDC->EndPath();//关闭一个路径层
pDC->SelectClipPath(RGN_XOR);
4.字符输入 让CTextView类捕获WM_CHAR消息,并为该类定义一个CString类型的成员变量:m_strLine专门用来存储输入的字符串,除此之外还须考虑如下问题:
①程序应当在当前插入符的位置输出字符,并且当在屏幕上输出字符时,插入符的位置也应发生改变; CWnd:SetCaretPos(POINT point)
②回车、退格键的处理;CDC:setTextColor、CDC:GetBkColor、CString:Left
③字体;CFont类
定时器:
CWnd :SetTimer
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
SetTimer(1,100,NULL);
void CTextView::OnTimer(UNIT nIDEvent)
//nIDEvent为定时器的标识,可以通过对其进行判断来解决多个定时器冲突的问题
{
…
CView::OnTimer(nIDEvent);
}
MFC提供了CEditView和CRichEditView两个类来帮助实现功能强大的字处理程序。