《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这两个类可以帮助我们实现功能更强大的字处理程序(若视类派生与这两个类其中之一,可直接获得一些字处理功能)
(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这两个类可以帮助我们实现功能更强大的字处理程序(若视类派生与这两个类其中之一,可直接获得一些字处理功能)
相关文章推荐
- VC++深入详解第五章——文本编程
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(1)
- 第五章-文本编程
- 《VC++深入详解》学习笔记[4]——第5章 文本编程
- 孙鑫《vc ++深入详解》第五章文本编程
- 《VC++深入详解》学习笔记[11]——第14章 网络编程
- VC++深入详解(3):MFC文本编程
- 《VC++深入详解》学习笔记[13]——第16章 线程同步与异步套接字编程
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(4)
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(5)
- [连载]VC++深入详解(孙鑫视频)第5章-文本编程 笔记
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(2)
- 《Linux高性能服务器编程》学习笔记——第五章 Linux网络编程基础API(3)
- 第五章,文本编程
- UG OPEN API编程基础 10辅助文本、尺寸及辅助制图
- Windows-文本编程基本技术
- 第五章 面向对象的编程风格(定义一个抽象基类)
- 49.java编程思想——创建窗口和程序片 文本 复选框 单选框 下拉列表
- 《unix/linux编程实践教程》学习笔记:第五章 连接控制:学习stty
- Qt-编程模块 001: 浏览(选择)、打开 文件和文件夹(目录) --- 如何让按钮**记忆上次打开的文本路径**的功能