📄 0501005.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0065)http://person.zj.cninfo.net/~vcpark/study/common_ctrl/tabctrl.htm -->
<HTML><HEAD><TITLE>五、PWIN98/95下演练CTab</TITLE>
<META content="text/html; charset=gb_2312-80" http-equiv=Content-Type>
<META content="Microsoft FrontPage 4.0" name=GENERATOR>
<STYLE>BIG {
COLOR: #000000; FONT-SIZE: 14px
}
A {
COLOR: #000000; FONT-SIZE: 14px
}
SMALL {
COLOR: #000000; FONT-SIZE: 9pt
}
.h16 {
LINE-HEIGHT: 16px
}
A:link {
COLOR: #000000; TEXT-DECORATION: none
}
A:visited {
COLOR: #7e704e; TEXT-DECORATION: none
}
A:hover {
COLOR: #ff8000; TEXT-DECORATION: underline
}
</STYLE>
</HEAD>
<BODY><BIG>
<P align=center><FONT
color=#0080c0><STRONG>五、PWIN98/95下演练CTab</STRONG></FONT></P>
<P align=justify>(一)标签控制的主要功能</P>
<P align=justify>标签控制(Tab
Control)是用来在一个窗口如对话框等中的同一用户区域控制多组显示信息或控制信息,由顶部的一组标签来控制不同的信息提示,标签即可以是文本说明也可以是一个代表文本含义的图标,或是两者的组合。针对不同的选择标签,都会有一组提示信息或控制信息与之相对应,供用户进行交互操作,这在WINDOWS98的属性表中最常见。另外还存在一种特殊风格的标签,即TBS_BUTTONS风格的标签,这种标签外观类似按钮,通过鼠标点击改变状态,一般用来执行一些功能而不是用来显示或控制信息。</P>
<P align=justify>提到标签,最快想到的应该是属性表对话(Property
Sheet),这两者的配合应用更是随处可见。属性表对话框有时也称为多页对话框(Multiple-Page Dialog)或是标签对话框(Table
Dialog),最多可设置24个属性页(Property
Page),通过顶部的标签来选择不同的属性页。另外还有一种特殊的属性表对话框,就象VC++5.0中的类向导AppWizard一样,其不存在供用户选择的标签,而是按照顺序依次控制属性页的显示,并且还有一般属性页中不存在的“确认”、“上一步”、“下一步”、“完成”和“帮助”等按钮。</P>
<P
align=justify>标签控制在MFC中只存在一种封装形式,即控制类CtabCtrl。在使用标签时即可以在对话框中直接添加,也可以在窗口中作为子窗口来使用,只不过这样应用时需要选创建标签。</P>
<P align=justify>(二)标签控制的对象结构</P>
<P align=justify>1、标签控制的建立方法</P>
<P align=justify>CTabCtrl&tabCtrl 建立标签控制对象结构</P>
<P align=justify>Create 建立标签控制并绑定对象</P>
<P align=justify>标签控制CTabCtrl::Create的调用格式如下:</P>
<P align=justify>BOOL Create( DWORD dwStyle, const RECT& rect, CWnd*
pParentWnd, UINT nID );</P>
<P
align=justify>其中参数dwStyle用来确定标签控制的风格;rect用来控制标签的大小和位置;pParentWnd用来确定标签控制的父窗口句柄;nID用来确定标签控制的标识符。</P>
<P align=justify>标签控制的风格可以是如下值的组合:</P>
<P align=justify>TCS_BUTTONS 表示将标签外观定义成类似按钮</P>
<P align=justify>TCS_FIXEDWIDTH 使所有标签具有相同的宽度</P>
<P align=justify>TCS_FOCUSNEVER 使特定标签永远不接收输入焦点</P>
<P align=justify>TCS_FOCUSONBUTTONDOWN 当标签被鼠标点击时接收输入焦点,其仅与TCS_BUTTONS合用</P>
<P align=justify>TCS_FORCEICONLEFT 强制图标在左面,剩余部分使标签居中</P>
<P align=justify>TCS_FORCELABELLEFT 使图标和标签均左对齐</P>
<P align=justify>TCS_MULTILINE 允许标签控制显示多行标签</P>
<P align=justify>TCS_OWNERDRAWFIXED 允许父窗口自绘标签</P>
<P align=justify>TCS_RIGHTJUSTIFY 使标签右对齐</P>
<P align=justify>TCS_SHAREIMAGELISTS 当控制被撤消时标签控制的图像不被撤消</P>
<P align=justify>TCS_TOOLTIPS 允许标签控制存在工具提示控制</P>
<P align=justify>TCS_TABS 标签正常显示,为默认状态</P>
<P align=justify>TCS_SINGLELINE 将标签只显示在一行上,默认状态</P>
<P align=justify>TCS_RAGGEDRIGHT 不使标签自动填满控制区域,默认状态</P>
<P align=justify>同样,标签控制还可以使用窗口的一些控制风格:</P>
<P align=justify>WS_CHILD 为标签控制创建子窗口,只能与WS_POPUP风格一起使用</P>
<P align=justify>WS_VISIBLE 建立一个初始可视的标签控制</P>
<P align=justify>WS_DISABLED 建立一个初始不可视的标签控制</P>
<P align=justify>WS_GROUP 建立标签控制群组的第一个控制</P>
<P align=justify>WS_TABSTOP 建立可用TAB键移动的标签控制</P>
<P align=justify>2、标签控制的属性类</P>
<P
align=justify>标签控制的属性类包括取得与标签控制相关联的图像列表GetImageList、设置标签控制的图像列表SetImageList、取得标签控制中标签的总数GetItemCount、取得标签控制中特定标答的相关信息GetItem、设置标签的部分或全部属性SetItem、检测当前被选中的标签GetCurSel、将一个标签设置为选中状态SetCurSel和取得具有当前输入焦点的标签SetCurSel等。</P>
<P align=justify>3、标签控制的操作方法</P>
<P align=justify>标签控制的操作方法包括在标签控制中插入一个标签InsertItem、删除一个标签
DeleteItem、从标签控制中删除所有项目DeleteAllItems、从标签控制中删除一个图像列表RemoveImage和绘制标签控制中的特定一项DrawItem等。</P>
<P align=justify>(三)标签控制的数据结构</P>
<P align=justify>在使用标签控制时,必须使用的函数就是在标签控制中插入标签。函数InsertItem的原形如下:</P>
<P align=justify>BOOL InsertItem(int nItem,TC_ITEM * pTabCtrlItem);</P>
<P align=justify>该函数中的TC_ITEM为添加标签时所使用信息的数据结构,其数据成员的定义方法及含义如下:</P>
<P align=justify>typedef struct _TC_ITEM { </P>
<P align=justify>UINT mask; // 确定结构成员的屏蔽或设置位</P>
<P align=justify>UINT lpReserved1; // 保留未用</P>
<P align=justify>UINT lpReserved2; // 保留未用 </P>
<P align=justify>LPSTR pszText; // 标签名称字符串</P>
<P align=justify>int cchTextMax; // 标签名称字符串缓冲区大小</P>
<P align=justify>int iImage; // 标签控制的图像索引号</P>
<P align=justify>LPARAM lParam; // 应用程序定义的相关32位数据</P>
<P align=justify>} TC_ITEM; </P>
<P align=justify>当鼠标点击标签控制中的标签时,标签控制就会向其父窗口发送相关的通知消息,通过处理这些通知消息,程序可以实现各种功能。</P>
<P align=justify>(四)属性表和属性页的基本用法</P>
<P
align=justify>在标签控制过程中,属性表对话框和属性页是必不可少的。在MFC类库中,属性表对话框类CpropertySheet是由CWnd类派生而来的,而属性页类CpropertyPage是由Cdialog类派生而来的,它们的用法基本相同:</P>
<P
align=justify>1、创建所有的属性页。创建属性页的方法与创建一般对话框资源的方法一样,利用对话框编辑器可以为每个属性页创建一个对话框模板,其区别在于,当利用类向导ClassWizard为属性页生成类时应选择属性页类CpropertyPage作为基类,而不是将一般的对话框类Cdialog作为基类;</P>
<P
align=justify>2、创建属性表对话框,并将事先创建好的各属性页添加进去,两者的创建顺序可以互换,但在创建完之后将属性页添加到属性表对话框中去这一步是必须要做的;</P>
<P
align=justify>3、显示属性表对话框。虽然属性表对话框类CpropertySheet不是由对话框类Cdialog派生而来的,但两者的操作非常类似,调用DoModal()函数就会显示一个模态属性表对话框,而调用Create()操作就会显示一个非模态的属性表对话框;</P>
<P
align=justify>4、对数据交换的处理。和对话框类似,属性表对话框与对象之间的数据交换也是通过数据成员2来实现的,只是属性表本身不带数据成员,而实际进行数据交换的是属性页中的数据成员;</P>
<P
align=justify>5、对向导对话框的处理。如果要显示一个向导对话框,在显示之前应首先调用SetWizardMode()函数对向导对话框进行特殊处理,对于存在按钮的向导对话框,还应调用SetWizardButtons()来对向导对话框的按钮功能进行定制,在用户操作结束时还应调用SetFinishText()函数将“完成”按钮设置为有效状态。</P>
<P align=justify>(五)标签控制的应用技巧示例程序</P>
<P
align=justify> 本文给出一个基于文档的标签应用实例。实例程序中通过简单设置菜单、标签和属性表来演示标签控制的实际应用技巧,程序通过选择菜单选项弹出设置正文颜色、字体和修饰等属性表对话框来和用户进行简单交互。其实现步骤如下:</P>
<P align=justify>1、利用应用程序向导AppWizard创建一个基于文档的工程TAB,在选择工程类型时应选择单文档;</P>
<P align=justify>2、利用资源中的菜单生成器,删除无用菜单,并增加如下菜单结构</P>
<P align=justify>菜单名 标识符</P>
<P align=justify>设置(S) (弹出菜单名)</P>
<P align=justify>背景设置(B) IDM_BKGRND</P>
<P align=justify>前景设置(F) IDM_FRGRND</P>
<P align=justify>3、利用对话框设计器设置属性表对话框所需要的四个属性页,注意在选择基类时应将属性
页类CpropertyPage作为基类,并将对话框及菜单等控件的所有属均改为中文。四个属性页及其包括的控件内容分别为:(1)文字属性对话框包括一个输入文字的文本输入框,用于输入和修改在窗口上显示的文字;(2)字体属性对话框包括三个选中框,用来确定显示的字体修饰;(3)字间距属性对话框包括一个用于显示提示信息的标签和用于输入字间距大小的文本输入框;(4)颜色属性对话框包括一个成组框和三个单选圆钮;(5)窗口中设置一个用于显示输入文字的标签。</P>
<P align=justify>以上控制的设置参数如下:</P>
<HR SIZE=1 width="72%">
<P>控制名称 标题名称 标识符串</P>
<HR SIZE=1 width="73%">
<P>标签控制 IDC_TABCTRL</P>
<P align=justify>表态文本 字间距(10-100) IDC_STATIC1</P>
<P align=justify>编辑框 IDC_LIST</P>
<P align=justify>成组框 颜色 IDC_STATIC2</P>
<P align=justify>单选按钮 黑色 IDC_BLACK</P>
<P align=justify>红色 IDC_RED</P>
<P align=justify>蓝色 IDC_BLUE</P>
<P align=justify>文本框(编辑框) IDC_TEXT</P>
<P align=justify>设置字体(复选按钮)粗体 IDC_BOLD</P>
<P align=justify>斜体 IDC_ITALIC</P>
<P align=justify>下划线 IDC_UNDERLINE</P>
<P align=justify>按 钮 确认 IDOK</P>
<P align=justify>取消 IDCANCEL</P>
<HR SIZE=1 width="72%">
<P
align=justify>利用类向导ClassWizard在属性表对话框CtabDlg、属性页对话框CtextPage和CstylePage中分别加入如下数据成员:</P>
<HR align=left SIZE=1 width="66%">
<P>标识符串 类型 数据成员</P>
<HR align=left SIZE=1 width="67%">
<P>IDC_TABCTRL CtabCtrl m_tabCtrl</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -