5.1 插入符
插入符Caret用来提示用户当前相应的位置。如果想要在程序中创建插入符,可以用CWnd类的CreateSolidCaret函数来完成,函数原型如下。
1 Void CreateSolidCaret(int nWidth,int nHeight);//两个参数分别表示插入符的宽度和高度
在一个MFC的单文档应用程序中,对文本的操作通常在View类中实现,要在View窗口创建之后再创建一个插入符,需要使用OnCreate函数。插入符的宽度通常为当前设备表述表中字符的平均宽度的1/8,高度和字符高度相同。
01 int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
02 {
03 if (CView::OnCreate(lpCreateStruct) == -1)
04 return -1;
05 // TODO: Add your specialized creation code here
06 CClientDC dc(this);
07 TEXTMETRIC tm;
08 dc.GetTextMetrics(&tm);
09 CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
10 ShowCaret();
11 return 0;
12 }
5.2窗口重绘
View类窗口产生和重绘时都要调用OnDraw函数。
5.3字符输入
1.消息捕获
字符输入属于WM_CHAR消息,可以通过捕获WM_CHAR消息来获取键盘输入信息。
2.应该在插入符的位置输出键盘输入信息,输入之前需要先设定插入符位置,输出的时候相应修改插入符位置,以便下次输入输出,在View类区域的任何位置点击鼠标,设定插入符位置。
1 void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
2 {
3 // TODO: Add your message handler code here and/or call default
4 m_ptOrigin=point;
5 SetCaretPos(point);
6 //SetCaretPos(m_ptSecond);一个类中同时只能有一个插入符
7 m_strLine.Empty();
8 CView::OnLButtonDown(nFlags, point);
9 }
3.回车与退行,字体
01 void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
02 {
03 // TODO: Add your message handler code here and/or call default
04 CClientDC dc(this); //设置字体
05 CFont font;
06 font.CreatePointFont(200,"华文楷体",NULL);
07 CFont *pOldFont=dc.SelectObject(&font);
08 TEXTMETRIC tm;
09 dc.GetTextMetrics(&tm);
10 if(0x0d==nChar)//回车
11 {
12 m_strLine.Empty();
13 m_ptOrigin.y+=tm.tmHeight;
14 }
15 else if(0x08==nChar)//退行
16 {
17 COLORREF clr=dc.SetTextColor(dc.GetBkColor());
18 dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
19 m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
20 dc.SetTextColor(clr);
21 }
22 else
23 {
24 m_strLine+=nChar;
25 }
26 //输出文本之前先重定位插入符的位置
27 CSize cs=dc.GetTextExtent(m_strLine);
28 CPoint pt;
29 pt.x=m_ptOrigin.x+cs.cx;
30 pt.y=m_ptOrigin.y;
31 SetCaretPos(pt);
32 dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
33 dc.SelectObject(pOldFont);
34 CView::OnChar(nChar, nRepCnt, nFlags);
35 }
5.4定时器Timer
CWnd类的SetTimer成员函数可以设置定时器,该函数的声明形式如下表示:
1 UINT SetTimer( UINT <EM>nIDEvent</EM>, UINT <EM>nElapse</EM>, void (CALLBACK EXPORT* <EM>lpfnTimer</EM>) (HWND, UINT, UINT, DWORD) );
添加一个WM_Timer函数
1 void CTextView::OnTimer(UINT nIDEvent)
2 {
3 // TODO: Add your message handler code here and/or call default
4 MessageBox("。。。");
5 CView::OnTimer(nIDEvent);
6 }
并在View类的OnCreate函数内设置一个定时器SetTimer
1 SetTimer(1,1,NULL);
运行,开启声音,彷如机关枪扫射的感觉,没几秒钟,程序就自动卡死了。
责任编辑:小草