《VC++深入详解》学习笔记 第五章 文本编程

来源:互联网 发布:淘宝大买家 编辑:程序博客网 时间:2024/05/22 16:01

1.插入符

 (1)创建文本插入符:CWnd类的CreateSolidCaret()函数

  函数原型:void  CreateSolidCaret(int nWidth,int nHeight);

 (2)显示插入符:ShowCaret()函数

       CreateSolidCaret(2,20);

        ShowCaret();

(3)让插入符适合当前字体的大小(首先得到设备描述表中当前字体的信息,根据字体信息来调整插入符的大小):CDC的类GetTextMetrics()成员函数

   函数原型:BOOL GetTextMetrics(LPTEXTMETRIC  lpMetrics)const;

   该函数的参数是一个指向TEXTMETRIC结构体的指针.定义一个TEXTMETRIC结构体的变量,将变量地址传递给这个参数,GetTextMetrics函数会用设备描述表中当前字体的信息来填充这个结构体。

    CClientDC dc(this);

      TEXTMETRIC tm;

        dc.GetTextMetrics(&tm);

    CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);

        ShowCaret();

 (4)创建图形插入符:CWnd类的CreateCaret()函数

    函数原型:void  CreateCaret(CBitmap*  pBitmap);

    CTestView 类私有成员变量 CBitmap bitmap;

    bitmap.LoadBitmap(IDB_BITMAP2);

       CreateCaret(&bitmap);

       ShowCaret();

2.窗口重绘

   (1)WM_PAINT消息响应函数OnDraw()

   (2)如果希望输入的图形和文字始终能在窗口上显示,要在OnDraw函数中处理。

   (3)OnDraw函数参数中有CDC对象指针,可以直接用,不需要再去构造

   (4)MFC中提供了一个字符串类:CString类

   (5)CDC类封装的TextOut函数和SDK中TextOut函数的区别:不需要DC句柄做参数,因为CDC类有一个m_hDC保存了DC句柄。

    OnDraw函数中:

     CString str("深入详解");

     pDC->TextOut(50,50,str);

   (6)添加字符串资源:CString类LoadString()函数

      函数原型:BOOL LoadString(UINT uID);

      CString str;

      str.LoadString(IDS_TESTSTRING);

  pDC->TextOut(100,100,str);

3.路径层:画界限,划分区域(设备描述表)

   (1)创建路径层:CDC类的BeginPath()和EndPath()函数

   (2)利用图形设备接口(GDI)提供的绘图函数绘图

  (3)绘图完成后用EndPath()函数关闭这个路径层

  (4)得到一个字符串在屏幕上显示的高度和宽度:CDC类GetTextExtent()函数

   函数原型:CSize GetTextExtent(const CString& str ) const;

   typedef  struct tagSize{

              int  cx;

              int  cy;

}SIZE;//CSize类似于SIZE结构体

程序示例:CString str("深入详解");

           pDC->TextOut(50,50,str);

           CSize sz=pDC->GetTextExtent(str);

           pDC->BeginPath();

           pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);

           pDC->EndPath();//表面上看没什么不同,因为路径层作用没有体现。

      (5)路径作用

            1.剪裁区域:可以理解为绘图区域,可以限制一个矩形区域作为剪裁区域,把以后的绘图区域仅限于这个矩形内:CDC类提供SelectClipPath()函数

        函数原型:BOOL SelectClipPath(int nMode)//参数nMode用来指定互操作模式

例如:RGN_DIFF:该模式的含义是新的剪裁区包含当前剪裁区,但排除当前路径层。

       RGN_ADD:该模式的含义是新的剪裁区域是当前剪裁区域和路径层的交集。

            2.路径层和剪裁区域互操作,可以让路径层上的文字等不被覆盖或突出显示

4.字符输入

  (1)在CTestView中定义一个私有变量存放输入字符串:CString m_strLine;

  (2)插入符移动到按下鼠标左键位置:SetCaretPos()函数

        函数原型:static void PASCAL SetCaretPos(POINT point);//静态函数

  (3)插入符位置改变后清空当前strLine中的内容:strLine.Empty();

  (4)保存插入符的位置,以便在OnDraw()函数中输出字符串:CPoint  m_ptOrigin

  (5)回车字符的处理

  (6)退格键的处理

        1.获取背景色;CDC类的GetBkColor()函数

        2.设置文本颜色:CDC类的SetTextColor()函数

         函数原型:virtual  COLORREF SetTextColor(COLORREF  crColor);//这个函数将会返回文本先前的颜色,需要保存下来,以后要把文本颜色还原

        3.从字符串中删除一个字符:CString类的Left()函数

          CString  Left(int  nCount)const;//这个函数返回一个CString对象,即返回指定字符串左边指定数目的字符

        4.得到字符串的长度:CString类的 GetLength()函数

示例: 添加响应按键消息WM_CHAR的函数OnChar(),输入以下代码:

CClientDC dc(this);

TEXTMETRIC tm;

dc.GetTextMetrics(&tm);

if(0x0d == nChar)    //回车

{

     m_strLine = "";

     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 sz = dc.GetTextExtent(m_strLine);  //移动输入符

CPoint pt;

pt.x = m_ptOrigin.x+sz.cx;

pt.y = m_ptOrigin.y;

SetCaretPos(pt);

 

dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);

  (7)设置字体:MFC的CFont类专门用来设置字体,它派生于CGdiObject类,封装了一个Windows图形设备接口(GDI)的字体,在构造了CFont对象之后,还需要利用该类提供的几个初始化函数之一对该对象进行初始化。

          1.初始化函数:

CreateFont,  CreateFontIndirect,  CreatePointFont,   CreatePointFontIndirect

这些初始化函数的作用主要是将CFont这个C++对象与字体资源关联起来

函数原型:BOOL CreatePointFont(int nPointSize,LPCTSTR lpszFaceName,CDC* pDC = NULL)

// nPointSize设置将要创建的字体的高度,单位是一个点的十分之一

// lpszFaceName字体的名称

// pDC CDC对象的指针,用来把nPointSize中指定的高度转化为逻辑单位,值为空,就使用一个屏幕设备描述表来完成这种转换

          2.将创建的字体选入设备描述表:CDC类的SelectObject()函数

          3.输出后恢复字体

       CFont font;

       font.CreatePointFont(300,"华文行楷");

       CFont* pOldFont = dc.SelectObject(&font);

       dc.SelectObject(pOldFont);

     (8)字幕变色功能的实现:CDC类提供的另一个输出函数DrawText()

         1.函数原型:int  DrawText(const CString& str,LPRECT lpRect,UINT nFormat);

//str指定要输出的字符串

//lpRect指定文学显示范围的矩形

//nFormat指定文本的输出格式       

//这个函数将文字的输出局限在一个矩形范围内,超出部分会被截断

         2.定时器(每隔一段时间发送一条消息WM_TIMER):CWnd类的SetTimer()函数

         函数原型:UINT SetTimer(

                     UINT  nIDEvent,//指定一个非零值的定时器标识(函数返回此标识)

                     UINT  nElapse,//指定定时器的时间间隔(毫秒为单位)

                     Void (CALLBACK  EXPORT* lpfnTimer)(HWND,UINT,UINT,DWORD)

//函数指针,要求一个回调函数,处理定时器消息WM_TIMER,若为NULL,由程序中响应该消息的窗口对象处理。

);

示例:(1)视类的OnCreate函数中SetTimer(1,100,NULL);

          (2)视类中添加响应WM_TIMER的函数OnTimer

          (3)视类中添加int型变量m_nWidth记录输出矩形的宽度并在构造函数中置0

          (4)OnTimer()中添加代码

       m_nWidth += 5;

       CClientDC dc(this);

       TEXTMETRIC tm;

       dc.GetTextMetrics(&tm);

       CRect rect;

       rect.left = 0;

       rect.top = 200;

       rect.right = m_nWidth;

       rect.bottom = rect.top+tm.tmHeight;

 

       dc.SetTextColor(RGB(255,0,0));

       CString str;

       str.LoadString(IDS_TESTSTRING);

       dc.DrawText(str,rect,DT_LEFT);

 

       CSize sz=dc.GetTextExtent(str); //字符串宽度,超出后矩形框变0,重新输出

       if(m_nWidth > sz.cx)

       {

           m_nWidth = 0;

           dc.SetTextColor(RGB(0,255,255));

           dc.TextOut(0,200,str);

       }

   5.EditView和CRichEditView这两个类可以帮助我们实现功能更强大的字处理程序(若视类派生与这两个类其中之一,可直接获得一些字处理功能)