C++笔记:文本编程
来源:优易学  2011-12-21 18:10:45   【优易学:中国教育考试门户网】   资料下载   IT书店

  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);

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

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训