友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
VC语言6.0程序设计从入门到精通-第24部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
UINT mask;
UINT lpReserved1;
UINT lpReserved2;
LPTSTR pszText;
int cchTextMax;
int iImage;
} TCITEMHEADER; *LPTCITEMHEADER;
此外 CTabCtrl 还提供了一些函数用于得到和修改控件的状态:
int GetCurSel()/int SetCurSel(int nItem);//用于得到/设置当前被选中的页位置
BOOL DeleteItem(int nItem)/BOOL DeleteAllItems();//用于删除指定/所有页面
void RemoveImage(int nImage);//用于删除某页选择位置上的图标
在当前页发生改变时需要隐藏当前的一些子窗口,并显示其他的子窗口。下面的代码演
示了如何实现上述功能,主要的代码如下:
CParentWnd::OnCreate(。。。)
{
m_tab。Create(。。。);
m_tab。InsertItem(0;〃Option 1〃);
m_tab。InsertItem(1;〃Option 2〃);
Create a edit box as the m_tab’s Child
Create a static box as the m_tab’s Child
edit_box。ShowWindow(SW_SHOW); // edit box 在属性页的第一页
static_box。ShowWindow(SW_HIDE); // static box 在属性页的第二页
}
void CParentWnd::OnSelectChangeTab(NMHDR* pNMHDR; LRESULT* pResult)
{
//处理页选择改变后的消息
if(m_tab。GetCurSel()==0)
{//根据当前页显示/ 隐藏不同的子窗口
edit_box。ShowWindow(SW_SHOW);
static_box。ShowWindow(SW_HIDE);
}
else
·144 ·
…………………………………………………………Page 154……………………………………………………………
第 5 章 常用控件
{//
edit_box。ShowWindow(SW_HIDE);
static_box。ShowWindow(SW_SHOW);
}
}
技巧:获取对话框中控件的窗口指针并进行一些常用的操作
对于对话框中的控件,实际上是对话框的一个子窗口。在实际编程中,可能常常会对控件
进行一些操作,得到该控件窗口的指针是第一步,通过 CWnd::GetDlgItem 可以很方便地得
到控件窗口的指针。假设某对话框上有一个 ID 为 IDC_XXX_STATIC 的静态文本控件,可
以通过下面这行代码重新设置文本内容:
GetDlgItem(IDC_XXX_STATIC)…》SetWindowText(…)
对于其他操作窗口的常用操作,也可以通过 GetDlgItem 传回的指针来调用对应的窗口操作
函数来完成。
5。11 本章小结
本章对 MFC 编程中常常用到的控件进行了介绍,包括传统的 Windows 控件和新型的
Win32 控件。在传统控件中主要介绍了静态文本控件、文本编辑控件、滚动条控件、按钮控
件(包括命令按钮、单选按钮、复选按钮)、列表框控件、组合框控件、图片控件等。在新型
控件中主要介绍了列表控件、树状控件、选项卡控件。本章对这些控件本身的特性、使用方
法以及主要的成员函数进行了介绍,掌握这些控件的使用方法是构建 Windows 应用程序的前
提条件,因为在用户界面程序设计中是离不开控件的使用的。
关于控件的创建和使用总结起来的要点如下。
o 传统控件的通知消息一般是通过 WM_MAND 消息发给父窗口的,Win32 控件的
通知消息则是通过 WM_NOTIFY 消息发送的,该消息可以附带大量信息。
o 由于所有的控件都是子窗口,所有的控件类都是 CWnd 类的派生类。因此可以用
ShowWindow、EnableWindow 和 MoveWindow 这样的 CWnd 成员函数来控制控件。
o 控件的创建有自动和手工两种常用方法。 控件的自动创建是通过向对话框模板中添加
控件实现的。手工创建则需要构建一个控件对象并调用相应的 Create 函数。
o 访问控件的方法包括:通过对话框的数据交换功能来查询和设置控件;通过控件对象
来访问控件;利用 CWnd 类的一些用于管理控件的成员函数来访问控件。
虽然本章对各种控件的功能和使用方法有一个较为全面的介绍,但是读者在具体使用某
个控件时可能还会有更多自己的功能需求,这时可以通过 Visual C++ 的联机帮助获得更多的
与该控件相关的帮助信息。
·145 ·
…………………………………………………………Page 155……………………………………………………………
第 6 章 文本和字体类
第 6 章 文本和字体类
Windows 经常使用 GDI 进行文本和图形输出。实际上,文本和图形并没有明显的界限,
Windows 把文本当作一种特殊的图形来对待,即,文本被看作是按照指定的“字
在很多时候,
体”格式画出来的。字体用于描述字符集中每一个字母、数字和标点符号的形状及外表的特
殊信息。
本章将对字体类 Cfont 及文本的输出过程进行介绍。
6。1 基础知识介绍
当任何窗口被第一次建立时,它假定是使用默认的系统字体。事实上,除非另外指定,
默认字体也就是系统字体 。使用字体的方法很简单,主要是通过 WM_GETFONT 消息或者函
数 CreateFont()取得字体。消息 WM_GETFONT 经常被发送到窗口以确定字体的类型,该字
体可能在它的窗口中作为默认值 。此消息返回字体句柄或者空(如果正使用系统字体)。系统
字体的实际句柄可由调用 GetStockObject(SYSTEM_FONT)得到。
在绘制文本时,不仅需要考虑描绘文本在窗口中使用的颜色,还应考虑文本的背景颜色
和文本描绘“模式 ”,表 6…1 所示为控制颜色和描绘文本模式所需的函数。
表 6…1 控制颜色和模式的函数
函数 描述
GetBkColor() 传递显示描述表时,返回 COLORREF 值指示描绘文本时使用的背景色
SetBkColor() 传递显示描述表和 COLORREF 值,设置绘制文本的背景颜色
GetTextColor() 传递显示描述表时,返回 COLORREF 值,指示绘制文本的颜色
SetTextColor() 传递显示描述表和 COLORREF 时,为绘制的文本设置颜色
GetBkMode() 传递显示描述表时,返回绘画方式,可以是 OPAQUE 或者 TRANSPARENT
SetBkMode() 传递显示措述表和 OPAQUE 或 TRANSPARENT 参数时设置背景文本绘制方式
6。2 CFont 类
6。2。1 概述
CFont 类封装了一个 Windows 图形设备接口(GDI )字体并提供管理字体的成员函数。
为使用 Cfont 类,可构造一个 CFont 对象并用 CreatFont()、CreateFontIndirect()、CreatePointFont()
或 CreatePointFontIndirect()将一个 Windows 字体附加给对象,然后用对象的成员函数操纵字
体。使用 CreatePointFont()和 CreatePointFontIndirect()常比使用 CreateFontIndirect()更容易,
…………………………………………………………Page 156……………………………………………………………
第 6 章 文本和字体类
因为前者可自动将字体高度的单位从点转换为逻辑单位。CFont 类在 MFC 类库中的继承关系
如图 6…1 所示。
图 6…1 CFont 类在 MFC 类库中的位置
6。2。2 主要成员函数
CFont 类中封装了与字体集相关的成员函数,通过这些成员函数可以方便地设置文本输
出的字体。Cfont 类中的主要成员函数如表 6…2 所示。
表 6…2 Cfont 类中的成员函数
成员 作用
CFont 构造一个 CFont 对象初始化
CreateFontIndirect 初始化一个由 LOGFONT 结构给出其特征的 CFont 对象
CreateFont 初始化用指定特性定义的 CFont 对象
CreatePointFont 用指定高度(用 0。1 点)和字体初始化一个 CFont 对象
CreatePointFontIndirect 与 CreateFontIndirect 相似,但字体高度用 0。1 点定义而不用逻辑单位定义操作
FromHandle 当给定一个 Windows HFONT 时,返回一个指向 CFont 对象的指针
HFONT 返回附加给 CFont 对象的 Windows GDI 字体句柄
GetLogFont 用附加给 CFont 对象的逻辑字体信息填充一个 LOGFONT
下面详细介绍常用的成员函数。
1.CFont::CreateFont()函数
可以调用该函数创建自定义字体,该函数声明如下:
BOOL CreateFont
(
int nHeight;
int nWidth;
int nEscapenment;
int nOrientation;
int nWeight;
BYTE bItalic;
BYTE bUnderline;
BYTE cStrikeOut;
BYTE nCharset;
BYTE nOutPrecision;
BYTE nClipPrecision;
BYTE nQuality;
·147 ·
…………………………………………………………Page 157……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
BYTE nPitchAndFamily;
LPCTSTR lpszFacename
);
(1)nHeight
以逻辑单位方式指定字体的高度,字体高度可为以下值之一:
o 大于 0,此时高度被转化为设备单位,与可用字体的网格高度相比较;
o 等于 0,此时使用合理的默认大小;
o 小于 0,此时高度被转化为设备单位,而绝对值与可用字体的字符高度相比较。
nHeight 绝对值在转化后不可超过 16 384 设备单位。在所有的高度对比中,如果字体超
过所要求的值,则字体映像器会寻找最大的或者最小的不超过所需大小的字体。
(2 )nWidth
指定字体中字符平均宽度(用逻辑单位 )。如果为 0,设备方向比率与可用字体的数字方
向比率相比较,找一个最近的匹配,这个最近的匹配由值的差的绝对值决定。
(3 )nEscapement
指定偏离垂线与 x 轴在显示面上的夹角(用 0。1 度单位)。偏离垂线时从一行中开始一个
字符到最后一个字符的线,此角从 x 轴逆时针方向度量。
(4 )nOrientation
指定字符基线和 x 轴之间的夹角(用 0。1 度单位)。此度数在坐标轴中由 x 轴顺时针度量
时坐标系中 y 轴向下,顺时针方向从 x 轴旋转时,y 轴向上。
(5 )nWeight
指定字体磅数(用每 1000 点中墨点像素数计)。nWeight 可为 0 到 1000 中的任意整数值。
(6 )bItalic
指定字体是否为斜体。
(7 )bUnderline
指定字体是否带下划线。
(8)bStrikeOut
指定是否突出显示字符。如果设置为非零,则突出。
(9 )nCharSet
指定字体的字符集,预定义预定义字符集如表 6…3 所示。
表 6…3 预定义字符集
常数 值
ANSI_CHARSET 0
DEFAULT_CHARSET 1
SYMBOL_CHARSET 2
SHIFTJIS_CHARSET 1280
EM_CHARSET 255
OEM 字符集是和系统相关联的,而具有其它字符集的字体也可能存在于系统之中。一个
使用未知字符集字体的应用不能翻译或解释一个以此字符集着色的字符串,相反,应将字符
串直接输入到设备驱动。字体映射器不使用 DEFAULT_CHARSET 值,一个应用可以使用此
·148 ·
…………………………………………………………Page 158……………………………………………………………
第 6 章 文本和字体类
值让字体名和大小完全描述逻辑字体。如果指定的名字不存在,为避免不可预料的结果,应
用应谨慎地使用 DEFAULT_CHARSET 。
(10)nOutPrecision
指定所需的输出精度 。输出精度可定义需要的字体高度、宽度,字符方向、走格、间距之
间 的 接 近 程 度 。 系 统 包 含 多 个 给 定 字 体 时 , 可 用 OUT_DEVICE_PRECIS 、
OUT_RASTER_PRECIS 和 OUT_TT_PRECIS 值控制字体映射器如何选择字体。例如,如果
一个系统包含一个名叫 Symbol 的字体,以光栅和 TrueType 形式存在,通过 OUT_TT_PRECIS
可使字体映射器选择 TrueType 类型(指定 OUT_TT_PRECIS 强制字体映射器选择 TrueType
字体)。
(11)nClipPrecision
指定所需的剪贴精度。剪贴精度用于定义如何剪贴部分超过范围的字符。要使用插入的
只读字体,必须指定 CLIP_ENCAPSULATE 。要建立设备旋转、TrueType 和矢量字库,可以
用 OR 操作符将 CLIP_LH_ANGLES 值与其他 nClipPrecision 值组合。如果 CLIP_LH_ANGLES
位被设置,所有字体的旋转都根据坐标系的定位是左手方向还是右手方向来决定(要了解有
关坐标轴定位的更多信息,请参阅 nOrientation 参数的描述)。如果 CLIP_LH_ANGLES 未被
设置,设备字体按逆时针方向旋转,但其他字体的旋转依赖于坐标系的旋转定位。
(12)nQuality
指示字体的输出质量,定义了 GDI 必须使逻辑字体特性和物理字体特性相匹配的程度。
可为以下值之一。
o DEFAULT_QUALITY :字体的外观无关紧要。
o DRAFT_QUALITY :当 PROOF_QUALITY 使用时,字体的外观不太重要 。对 GDI 光
栅字体来说,允许缩放。黑体、斜体、下划线、突出字体和综合处理在需要时可以综
合。
o PROOF_QUALITY :字体的字符质量比精确的逻辑字体特性的匹配更重要。对 GDI
光栅字体,缩放无效,大小最接近的字体被选用。黑体、斜体、下划线、突出和综合
处理在需要时可以综合。
(13)nPitchAndFamily
指定字体的间距和家族。两个低位指定字体的间距,值可为:DEFAULT_PITCH 或
VARIABLE_PITCH 。FIXED_PITCH 应用可以将 TMPF_TRUETYPE 加到 nPitchAndFamily
参数中,并选择一个 TrueType 字体。高四位指定字体家族,可为以下值之一。
o FF_DECORATIVE :新奇字体,如以前英格兰的字体。
o FF_DONTCARE :不在意或不知道。
o FF_MODERN :笔型宽度不变的字体,有或无衬线。固定斜度的字体常是现代风格的,
如 Pica;Elite 和 Courier New 。
o FF_ROMAN :笔划宽度可变(接比例调整空间)及有衬线字体。如 Times New Roman
和 Century Schoolbook 。
o FF_SCRIPT :与手写体相似的字体,如 Script 和 Cursive 。
o FF_SWISS :笔划宽度可变(接比例调整空间)及不带有衬线字体,如 MS Sans Serif 。
可用布尔操作 OR 指定一个 nPithAndFamily 值,以组合一个斜体和一个家族常数 。字体
·149 ·
…………………………………………………………Page 159……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
家族用普通方式描述了字体的外观,它们在所需铅字体无效时定义指定的字体。
(14)pszFacename
指定字体样式,可为 Cstring 型,或一个一空终止符结尾的字符串。此字符串的长度不能
超过 30 个字符,Windows CE 中的 EnumFontFamilies 函数可用于枚举所有当前可用字体。如
果为 NULL ,则 GDI 使用一个不依赖设备的字体。
总的说来,CreateFont 成员函数用于以指定的特征初始化一个 CFont 对象。此字体可被
选作任何设备上下文的字体。CreateFont 函数不创建一个新 Windows GDI 字体,只是从 GDI
物理字体库中选择最相近的匹配字体。当构造一个逻辑字体时,大部分参数可使用默认值。
如果没有给定 nHeight 和 lpszFace Name,则逻辑字体是与设备有关的。当用 CreateFont 函数
完成了一个 CFont 对象的创建时,先从设备环境中选出字体,然后删除 CFont 对象(字体定
义完后就删除对象,以节省空间 )。
2 .CFont::CreateFontIndirect()函数
该成员函数以间接方式生成一个自定义字体,声明如下:
BOOL CreateFontIndirect(const LOGFONT* lpLogFont);
其中参数 lpLogFont 指向一个定义逻辑字体特征的 LogFont 结构。该函数用 lpLogFont
指向的 LOGFONT 结构定义的特征初始化一个 CFont 对象,之后此字体即可被任何设备选作
当前字体。此字体具有 LOGFONT 结构定义的特征。当使用 CDC::SelectObject 成员函数选择
时,GDI 字体映射器将努力将逻辑字体和已存在的物理字体相匹配 。如果找不到匹配的逻辑
字体,则尽可能找与之特性匹配最多的字体替代 。当用 CreateFontIndirect 函数完成 CFont 对
象的创建后,先在设备环境中选出字体,然后删除 CFont 对象。
3 .CFont::CreatePointFont()函数
此函数用于创建指定字体和点的大小,声明如下:
BOOL CreatePointFont(int nPointSize;LPCTSTR lpszFaceName;CDC*pDC=NULL);
参数意义如下:
o nPointSize :指定所需字体高度(用 0。1 点表示,例如,传递 120 表示 12 点字体)。
o lpszFaceName :定�
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!