VC语言6.0程序设计从入门到精通-第35部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Visual C++ 6。0 程序设计从入门到精通
MFC 中使用 CTabCtrl 类来封装属性页控件的各种操作。通过调用 Create 函数创建一个
窗口,Create 函数声明如下:
BOOL Create(DWORD dwStyle;const RECT& rect;CWnd* pParentWnd;UINT nID)
其中 dwStyle 中可以使用以下一些属性页控件的专用风格。
o TCS_BUTTONS :使用按钮来表示页选择位置。
o TCS_MULTILINE :分行显示页选择位置。
o TCS_SINGLELINE :只使用一行显示页选择位置。
在控件创建后必需向其中添加页面才可以使用,添加页面的函数为:
BOOL InsertItem(int nItem;LPCTSTR lpszItem);
其中 nItem 为位置,从 0 开始,lpszItem 为页选择位置上显示的文字。如果希望在页选
择位置处显示一个图标,可以调用 InsertItem (在此之前必须调用SetImageList 设置正确的
ImageList )。
对组成选项卡(TabControl )控件(CTabCtrl )选项卡的外观和行为可以有相当多的设置
方法。每个选项卡可以有与之关联的标签、图标、项状态和应用程序定义的 32 位数值。对每
个选项卡,可以显示图标、标签或两者都显示。
另外,每个选项卡项可以有 3 种可能的状态:已按下、非按下或突出显示 。该状态仅能
通过修改现有选项卡项来设置 。若要修改现有选项卡项,应调用 GetItem()函数检索它,修改
TCITEM 结构(特别是 dwState 和 dwStateMask 数据成员),然后通过调用 SetItem 返回修改
过的 TCITEM 结构。若要清除 CTabCtrl 对象中所有选项卡项的项状态,应调用 DeselectAll()
函数。该函数重新设置所有选项卡项或所有项的状态(当前选定的项除外)。
下列代码清除所有选项卡项的状态,然后修改第三项的状态:
//modify the third item to be highlighted
TCITEM curItem;
m_tabCtrl。DeselectAll(FALSE); //reset all tab items
curItem。mask= TCIF_STATE;
m_tabCtrl。GetItem(2; &curItem);
curItem。mask= TCIF_STATE;
curItem。dwState= TCIS_HIGHLIGHTED;
curItem。dwStateMask= TCIS_HIGHLIGHTED;
m_tabCtrl。SetItem(2; &curItem);
5。10。2 选项卡控件通知消息
当单击选项卡或按钮时,选项卡(TabControl )控件(CTabCtrl )向其父窗口发送通知消
息。如果要进行某种响应,应对这些消息进行处理。例如,当单击选项卡时,也许想在显示
选项卡之前在页面上预设控件数据,即响应单击选项卡消息时作出预设数据的响应。
处理来自视图或对话框类中的选项卡(TabControl )控件的 WM_NOTIFY 消息,用“属
性”窗口创建带 switch 语句的 OnChildNotify()处理函数。选项卡控件向父窗口发送的主要通
知消息如表 5…25 所示。
·142 ·
…………………………………………………………Page 152……………………………………………………………
第 5 章 常用控件
表 5…25 选项卡控件的通知消息
通知消息 含义
NM_CLICK 通知父窗口用户在控件区域范围内点击了鼠标左键
NM_RCLICK 通知父窗口用户在控件区域范围内点击了鼠标右键
NM_RELEASEDCAPTURE 通知父窗口在控件区域范围内释放鼠标捕获消息
TCN_FOCUSCHANGE 通知父窗口控件的按钮聚焦已经改变
TCN_GETOBJECT 当具有 TCS_EX_REGISTERDROP 扩展特性时并且对象被拖动的通知消息
TCN_KEYDOWN 通知父窗口在控件范围内键盘被按下
TCN_SELCHANGE 通知父窗口控件的选项卡选择项已经改变
TCN_SELCHANGING 通知父窗口控件的选项卡选择项正在改变
选项卡控件还涉及到一些重要的数据结构,这些预定义的数据结构在该控件应用中起着
重要作用。主要涉及到的的结构如下。
1.NMTCKEYDOWN 结构
该结构包含键盘按下时的相关信息,主要用于处理 TCN_KEYDOWN 通知消息,该结构
定义如下:
typedef struct tagNMTCKEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} NMTCKEYDOWN
2 .TCHITTESTINFO 结构
该结构主要用于鼠标单击测试的通知消息,定义如下:
typedef struct tagTCHITTESTINFO {
POINT pt;
UINT flags;
} TCHITTESTINFO; *LPTCHITTESTINFO;
3 .TCITEM 结构
该结构指定选项卡控件选项的具体属性,定义如下:
typedef struct tagTCITEM {
UINT mask;
#if (_WIN32_IE 》= 0x0300)
DWORD dwState;
DWORD dwStateMask;
#else
UINT lpReserved1;
UINT lpReserved2;
#endif
LPTSTR pszText;
·143 ·
…………………………………………………………Page 153……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
int cchTextMax;
int iImage;
LPARAM lParam;
} TCITEM; *LPTCITEM;
4 .TCITEMHEADER 结构
该结构用于指定或接收选项卡控件本身的属性,定义如下:
typedef struct tagTCITEMHEADER {
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 所示为控制颜色和描绘文本模式所需的函数。