您的位置:首页 > 编程语言 > C语言/C++

孙鑫VC++第5章文本编程

2012-09-11 23:00 169 查看
 

第五章、文本编程

 

1.      创建文本插入符

 

手动在视图类中添加WM_CREATE消息响应函数OnCreate函数,然后在里面添加;

 

 

CreateSolidCaret(20,100);//一个宽度,一个高度

         ShowCaret();

 

2.      调用CDC类的GetTextMetrics成员函数可以得到设备描述表中的当前字体的度量信息;

 

 

CClientDC dc(this);

TEXTMETRIC tm;//定义文本信息结构体变量

 

dc.GetTextMetrics(&tm);//获取设备描述表中的文本信息

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

ShowCaret();

 

 

3.      创建图形插入符

 

 

//CBitmapbitmap;//是一个局部变量,在OnCreate函数执行完后对象就要析构,应该把bitmap声明为视图类的成员变量;

         bitmap.LoadBitmap(IDB_BITMAP1);

         CreateCaret(&bitmap);

         ShowCaret();

 

 

4.      窗口重绘

 

窗口大小改变的时候,窗口会发生重绘,窗口中已输入的文字或图形就会被擦除掉;

要想输入的内容始终保留在窗口上,就要在响应WM_PAINT消息中将内容再次输出。

MFC提供了一个OnDraw函数;

 

输出一串文字 TextOut函数

字符串类:CString,这个类没有基类;

 

 

CString str("VC++ 深入编程");

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

 

5.      利用字符串资源显示文本

 

 

str.LoadString(IDS_STRINGVC);

         pDC->TextOut(0,200,str);

 

6.      路径

 

路径层就是在地域上划分了界限,界限之内就是各自地盘,别人不能侵犯;

MFC中用CDC类提供的BeginPath和EndPath这两个函数来实现的;

 

CSize 所占据的高度和宽度

GetTextExtent函数则是获得某个特定的字符串在窗口中显示时所占据的宽度和高度;

 

CSize sz =pDC->GetTextExtent(str);

 

 

pDC->BeginPath();

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

         pDC->EndPath();

 

 

 

7.      路径层跟剪裁区域的互操作

 

 

CString str("VC++ 深入编程");

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

CSize sz =pDC->GetTextExtent(str);

 

str.LoadString(IDS_STRINGVC);

pDC->TextOut(0,200,str);

 

pDC->BeginPath();

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

pDC->EndPath();

pDC->SelectClipPath(RGN_DIFF);//CDC类提供的函数,把当前设置的路径层和设备描述表中已有的剪裁区域按照一种指定的模式进行一个互操作

 

for (int i=0; i < 300; i+=10)

{

           pDC->MoveTo(0,i);

           pDC->LineTo(300,i);

           pDC->MoveTo(i,0);

           pDC->LineTo(i,300);

}

 

 

8.      字符输入:WM_CHAR消息响应函数 OnChar函数中

 

         CClientDCdc(this);

         TEXTMETRICtm;

         dc.GetTextMetrics(&tm);

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

         {

                   m_strLine.Empty();//清空字符串

                   m_ptOrigin.y+=tm.tmHeight;

         }

         elseif(0x08 == nChar)//退格

         {

                   //获取背景颜色

                   COLORREFclr =dc.SetTextColor(dc.GetBkColor());

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

                   //Left函数删除一个字符

                   m_strLine= m_strLine.Left(m_strLine.GetLength()-1);

                   dc.SetTextColor(clr);

         }

         else

         {

                   m_strLine+= nChar;

         }

 

         //让光标随着输入的字符移动

         CSizesz = dc.GetTextExtent(m_strLine);

         CPointpt;

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

         pt.y= m_ptOrigin.y;

         SetCaretPos(pt);

 

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

 

 

 

 

9.设置字体

 

     CFont font;

         font.CreatePointFont(300,"华文行楷",NULL);//必须进行初始化,300指的是高度,最后面的参数指针是用来把指定的高度转换为逻辑单位,可以为空;

 

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

 

         dc.SelectObject(pOldFont);

 

  MFC提供了专门的的字处理类:CEditView和CRichEditView两个类;

 

 

 

9.      字幕变色功能的实现

 

需要要用到:DrawText来实现;

需要定时器,SetTimer函数来设置;(在OnCreate函数中设置)

SetTimer(1,100,NULL);//非零标识,毫秒发送WM_TIMER消息,回调函数;

 

在WM_TIMER消息处理函数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_STRINGVC);

dc.DrawText(str,rect,DT_LEFT);//DT_LEFT左对齐

 

//向右显示

 

rect.top = 150;

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

dc.DrawText(str,rect,DT_RIGHT);

 

//实现已经显示的文本变成绿色

 

 

CSize sz = dc.GetTextExtent(str);

if (m_nWidth >sz.cx)

{

           m_nWidth = 0;

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

           dc.TextOut(0,200,str);

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 vc++ mfc timer 图形 null