1插入符
1) 创建文本插入符
在程序中想要创建插入符,可以利用CWnd类的CreateSolidCaret()函数来完成
void CreateSolidCaret(int nWidth,ing nHeight);
nWidth:指定插入符的宽度(逻辑单位),如果该参数的值为0,那么系统将其设置为系统定义的窗口边界的宽度。
nHeight:指定插入符的高度(逻辑单位),如果该参数的值为0,那么系统将其设置为系统定义的窗口边界的高度。
2).创建图形插入符
利用CWnd类的另一个函数CreateCaret来实现
void CreateCaret(CBitmap *pBitmap)
插入符的创建应该在窗口创建之后进行,可以在WM_CREATE消息的响应函数OnCreate中添加创建插入符的代码。
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CView::OnCreate(lpCreateStruct) == -1)
return -1;
//TODO:Add your specialized creation code here
//创建文本插入符
CClientDC t_dc(this); //创建设备描述表
TEXTMETRIC t_tm; //定义文本信息结构体变量
t_dc.GetTextMetrics(&t_tm); //获得设备描述表中的文本信息
CreateSolidCaret(t_tm.tmAveCharWidth/8,t_tm.tmHeight); //根据字体大小,创建合适的插入符
ShowCaret(); //显示插入符
/*
//创建图形插入符
m_bitmap.LoadBitmap(IDB_BITMAP1);
CClientDC t_dc(this);
CreateCaret(&m_bitmap);
ShowCaret();
*/
return 0;
}
2 窗口重绘
Windows程序运行时,如果程序窗口大小发送变化,窗口会发生重绘,窗口中已输入的文字或图形就会被擦除掉,如果希望输入的内容始终保留在窗口上,就要在响应WM_PAINT消息的函数中将内容再次输出.在MFC AppWizard产生的视类代码中,给我们提供了一个类似于WM_PAINT消息响应函数的ONDraw函数,在窗口发生重绘时,应用程序框架代码会调用该函数
3 路径
在设备描述表中还有一个路劲层(path bracket)的概念.
在MFC中,创建路径层是利用CDC类提供的BeginPath和EndPath这两个函数来实现的。首先应调用前者,该函数的作用是在设备描述表中打开一个路径层,然后利用图形设备接口(GDI)提供的绘图函数进行绘图操作,例如绘制一些点,矩形,椭圆等,最后在绘图操作完成之后,应用程序通过调用EndPath函数关闭这个路径层.
CDC类为我们提供了一个GetTextExtent函数,利用这个函数可以获得一个字符串在屏幕上显示的宽度和高度。
CSize GetTextExtent(const CString& str) const;
CSize类类似于Windows的SIZE结构体,定义如下
typedef struct tagSIZE
{
int cx;
int cy;
}SIZE;
不要把这个函数和前面讲过的GetTextMetrics函数混淆了,对GetTextMetrics函数来说,它获得的是设备描述表中当前字体的度量信息,而GetTextExtent函数则是获得某个特定的字符串在窗口中显示时所占据的宽度和高度
CDC类提供了一个SelectClipPath函数,该函数的作用是把当前设置的路径层和设备描述表中已有的裁剪区域按照一种指定的模式进行一个互操作,该函数的声明形式如下:
BOOL SelectClipPath(int nMode);
其中,参数nMode用来指定互操作的模式,有多种取值,例如RGN_DIFF,RGN_AND
void CMFCTextView::OnDraw(CDC* pDC)
{
CMFCTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString t_str = "退一步,海阔天空";
CSize t_sz;
t_sz = pDC->GetTextExtent(t_str);
pDC->TextOut(50,50,t_str);
pDC->BeginPath();
pDC->Rectangle(50,50,50 + t_sz.cx,50 + t_sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_AND);
for(int i = 0;i < 300; i+=10)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}
}
4.字体
MFC提供了义个CFont类专门用来设置字体。这个类派生于CGdiObject类,封装了一个Windows图形设备接口(GDI)的字体。在实际编程时,在构造了一个CFont对象后,还必须利用该类提供的几个初始化函数之一对该类对象进行初始化,然后才能使用这个对象.
CClient dc(this);
CFont font;
font.CreatePointFong(300,"华文楷体",NULL);
CFont *pOldFont = dc.selectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
...
...
dc.SelectObject(pOldFont);
MFC提供了CEditView和CRichEditView这两个类,可以用例帮助我们实现强大的字处理程序,其中,后者提供的功能比前者更为强大,如果让程序的视类直接派生于这两个类之一的话,程序就已经具备字处理程序的一些基本功能.
5. 字幕变色功能的实现
CDC类提供了一个输出文字的函数:DrawText,该函数作用是在指定的矩形范围内输出文字。
int DrawText(const CString& str,LPRECT lpRect,UINT nFormat);
str:指定要输出的字符串
lpRect:指定文字显示范围的矩形
nFormat:指定文本的输出格式.
DrawText函数实际上是把文字的输出局限在一个矩形范围内,单输出的文字太多,以至于超过设定的矩形范围时,DrawText函数就会截断输出的文字,只显示在设定矩形内能够显示的那部分文字.
CWnd类的SetTimer成员函数可以设置定时器。
UNIT SetTimer(UNIT nIDEvent,UNIT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT,UINT,DWORD));
如果这个函数调用成功,那么它将返回新的定时器的标识
nIDEvent:指定一个非零的定时器标识,如果这个函数执行成功,它的第一个参数和返回值就是相等的.
nElapse:指定定时器的时间间隔,以毫秒为单位。
lpfnTimer:这是一个函数指针,并且要求是一个回调函数。当设定好定时器后,每隔设定的时间间隔,它就发送一条定时器消息。如果在这里设置了回调函数,这是操作系统就会调用这个回调函数来处理定时器消息,如果我们将此参数设置为NULL,定时器消息即WM_TIMER消息就会放到应用程序的消息队列中,然后有程序中响应此消息的窗口对象来处理.