《VC++深入详解–学习笔记》(5)文本编程

Filed Under (VC++ 学习笔记) by panmaoru on 09-12-2009

本章简单介绍了一些关于文本编程的知识,其中比较重要的几个概念:插入符,窗口重绘,字符输入,定时器。

5.1 插入符

插入符Caret用来提示用户当前相应的位置。如果想要在程序中创建插入符,可以用CWnd类的CreateSolidCaret函数来完成,函数原型如下。

Void CreateSolidCaret(int nWidth,int nHeight);//两个参数分别表示插入符的宽度和高度

在一个MFC的单文档应用程序中,对文本的操作通常在View类中实现,要在View窗口创建之后再创建一个插入符,需要使用OnCreate函数。插入符的宽度通常为当前设备表述表中字符的平均宽度的1/8,高度和字符高度相同。

int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
       if (CView::OnCreate(lpCreateStruct) == -1)
              return -1;
       // TODO: Add your specialized creation code here
       CClientDC dc(this);
       TEXTMETRIC tm;
       dc.GetTextMetrics(&tm);
       CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
       ShowCaret();
       return 0;
}

5.2窗口重绘

View类窗口产生和重绘时都要调用OnDraw函数。

5.3字符输入

1.消息捕获

字符输入属于WM_CHAR消息,可以通过捕获WM_CHAR消息来获取键盘输入信息。

2.应该在插入符的位置输出键盘输入信息,输入之前需要先设定插入符位置,输出的时候相应修改插入符位置,以便下次输入输出,在View类区域的任何位置点击鼠标,设定插入符位置。

void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
{
       // TODO: Add your message handler code here and/or call default
       m_ptOrigin=point;
       SetCaretPos(point);
       //SetCaretPos(m_ptSecond);一个类中同时只能有一个插入符
       m_strLine.Empty();
       CView::OnLButtonDown(nFlags, point);
}

3.回车与退行,字体

void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
       // TODO: Add your message handler code here and/or call default
       CClientDC dc(this);       //设置字体
       CFont font;
       font.CreatePointFont(200,"华文楷体",NULL);
       CFont *pOldFont=dc.SelectObject(&font);
       TEXTMETRIC tm;
       dc.GetTextMetrics(&tm);
       if(0x0d==nChar)//回车
       {
              m_strLine.Empty();
              m_ptOrigin.y+=tm.tmHeight;
       }
       else if(0x08==nChar)//退行
       {
              COLORREF clr=dc.SetTextColor(dc.GetBkColor());
              dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
              m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
              dc.SetTextColor(clr);
       }
       else
       {
              m_strLine+=nChar;
       }
       //输出文本之前先重定位插入符的位置
       CSize cs=dc.GetTextExtent(m_strLine);
       CPoint pt;
       pt.x=m_ptOrigin.x+cs.cx;
       pt.y=m_ptOrigin.y;
       SetCaretPos(pt);
       dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
       dc.SelectObject(pOldFont);
       CView::OnChar(nChar, nRepCnt, nFlags);
}

5.4定时器Timer

CWnd类的SetTimer成员函数可以设置定时器,该函数的声明形式如下表示:

UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer) (HWND, UINT, UINT, DWORD) );

添加一个WM_Timer函数

void CTextView::OnTimer(UINT nIDEvent)
{
       // TODO: Add your message handler code here and/or call default
       MessageBox("。。。");
       CView::OnTimer(nIDEvent);
}

并在View类的OnCreate函数内设置一个定时器SetTimer

SetTimer(1,1,NULL);

运行,开启声音,彷如机关枪扫射的感觉,没几秒钟,程序就自动卡死了。

Comments (1)

  1. 开启声音,彷如机关枪扫射的感觉,没几秒钟,程序就自动卡死了。 牛了。茫茫多弹出窗口,。。。

Post a comment