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

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

2012-09-09 17:06 495 查看
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这两个类可以帮助我们实现功能更强大的字处理程序(若视类派生与这两个类其中之一,可直接获得一些字处理功能)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: