VC++ 如何在CTab控件上加载树形控件
1个回答
展开全部
第5章 演练CTab
5.1 标5.2 签控制的主要功能
标签控制(TabControl)是用来在一个窗口如对话框等中的同一用户区域控制多组显示信息或控制信息,由顶部的一组标签来控制不同的信息提示,标签即可以是文本说明也可以是一个代表文本含义的图标,或是两者的组合。针对不同的选择标签,都会有一组提示信息或控制信息与之相对应,供用户进行交互操作,这在WINDOWS98的属性表中最常见。另外还存在一种特殊风格的标签,即TBS_BUTTONS风格的标签,这种标签外观类似按钮,通过鼠标点击改变状态,一般用来执行一些功能而不是用来显示或控制信息。
提到标签,最快想到的应该是属性表对话(PropertySheet),这两者的配合应用更是随处可见。属性表对话框有时也称为多页对话框(Multiple-PageDialog)或是标签对话框(Table Dialog),最多可设置24个属性页(PropertyPage),通过顶部的标签来选择不同的属性页。另外还有一种特殊的属性表对话框,就象VC++5.0中的类向导AppWizard一样,其不存在供用户选择的标签,而是按照顺序依次控制属性页的显示,并且还有一般属性页中不存在的“确认”、“上一步”、“下一步”、“完成”和“帮助”等按钮。
标签控制在MFC中只存在一种封装形式,即控制类CtabCtrl。在使用标签时即可以在对话框中直接添加,也可以在窗口中作为子窗口来使用,只不过这样应用时需要选创建标签。
5.3 标5.4 签控制的对象结构
5.4.1 标5.4.2 签控制的建立方法
CTabCtrl&tabCtrl 建立标签控制对象结构
Create 建立标签控制并绑定对象
标签控制CTabCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定标签控制的风格;rect用来控制标签的大小和位置;pParentWnd用来确定标签控制的父窗口句柄;nID用来确定标签控制的标识符。
标签控制的风格可以是如下值的组合:
TCS_BUTTONS 表示将标签外观定义成类似按钮
TCS_FIXEDWIDTH 使所有标签具有相同的宽度
TCS_FOCUSNEVER 使特定标签永远不接收输入焦点
TCS_FOCUSONBUTTONDOWN 当标签被鼠标点击时接收输入焦点,其仅与TCS_BUTTONS合用
TCS_FORCEICONLEFT 强制图标在左面,剩余部分使标签居中
TCS_FORCELABELLEFT 使图标和标签均左对齐
TCS_MULTILINE 允许标签控制显示多行标签
TCS_OWNERDRAWFIXED 允许父窗口自绘标签
TCS_RIGHTJUSTIFY 使标签右对齐
TCS_SHAREIMAGELISTS 当控制被撤消时标签控制的图像不被撤消
TCS_TOOLTIPS 允许标签控制存在工具提示控制
TCS_TABS 标签正常显示,为默认状态
TCS_SINGLELINE 将标签只显示在一行上,默认状态
TCS_RAGGEDRIGHT 不使标签自动填满控制区域,默认状态
同样,标签控制还可以使用窗口的一些控制风格:
WS_CHILD 为标签控制创建子窗口,只能与WS_POPUP风格一起使用
WS_VISIBLE 建立一个初始可视的标签控制
WS_DISABLED 建立一个初始不可视的标签控制
WS_GROUP 建立标签控制群组的第一个控制
WS_TABSTOP 建立可用TAB键移动的标签控制
5.4.3 标5.4.4 签控制的属性类
标签控制的属性类包括取得与标签控制相关联的图像列表GetImageList、设置标签控制的图像列表SetImageList、取得标签控制中标签的总数GetItemCount、取得标签控制中特定标答的相关信息GetItem、设置标签的部分或全部属性SetItem、检测当前被选中的标签GetCurSel、将一个标签设置为选中状态SetCurSel和取得具有当前输入焦点的标签SetCurSel等。
5.4.5 标5.4.6 签控制的操作方法
标签控制的操作方法包括在标签控制中插入一个标签InsertItem、删除一个标签 DeleteItem、从标签控制中删除所有项目DeleteAllItems、从标签控制中删除一个图像列表RemoveImage和绘制标签控制中的特定一项DrawItem等。
5.5 标5.6 签控制的数据结构
在使用标签控制时,必须使用的函数就是在标签控制中插入标签。函数InsertItem的原形如下:
BOOL InsertItem(int nItem,TC_ITEM * pTabCtrlItem);
该函数中的TC_ITEM为添加标签时所使用信息的数据结构,其数据成员的定义方法及含义如下:
typedef struct _TC_ITEM {
UINT mask; // 确定结构成员的屏蔽或设置位
UINT lpReserved1; // 保留未用
UINT lpReserved2; // 保留未用
LPSTR pszText; // 标签名称字符串
int cchTextMax; // 标签名称字符串缓冲区大小
int iImage; // 标签控制的图像索引号
LPARAM lParam; // 应用程序定义的相关32位数据
} TC_ITEM;
当鼠标点击标签控制中的标签时,标签控制就会向其父窗口发送相关的通知消息,通过处理这些通知消息,程序可以实现各种功能。
5.7 属性表和属性页的基本用法
在标签控制过程中,属性表对话框和属性页是必不可少的。在MFC类库中,属性表对话框类CpropertySheet是由CWnd类派生而来的,而属性页类CpropertyPage是由Cdialog类派生而来的,它们的用法基本相同:
1、创建所有的属性页。创建属性页的方法与创建一般对话框资源的方法一样,利用对话框编辑器可以为每个属性页创建一个对话框模板,其区别在于,当利用类向导ClassWizard为属性页生成类时应选择属性页类CpropertyPage作为基类,而不是将一般的对话框类Cdialog作为基类;
2、创建属性表对话框,并将事先创建好的各属性页添加进去,两者的创建顺序可以互换,但在创建完之后将属性页添加到属性表对话框中去这一步是必须要做的;
3、显示属性表对话框。虽然属性表对话框类CpropertySheet不是由对话框类Cdialog派生而来的,但两者的操作非常类似,调用DoModal()函数就会显示一个模态属性表对话框,而调用Create()操作就会显示一个非模态的属性表对话框;
4、对数据交换的处理。和对话框类似,属性表对话框与对象之间的数据交换也是通过数据成员2来实现的,只是属性表本身不带数据成员,而实际进行数据交换的是属性页中的数据成员;
5、对向导对话框的处理。如果要显示一个向导对话框,在显示之前应首先调用SetWizardMode()函数对向导对话框进行特殊处理,对于存在按钮的向导对话框,还应调用SetWizardButtons()来对向导对话框的按钮功能进行定制,在用户操作结束时还应调用SetFinishText()函数将“完成”按钮设置为有效状态。
5.8 标5.9 签控制的应用技巧示例程序
本文给出一个基于文档的标签应用实例。实例程序中通过简单设置菜单、标签和属性表来演示标签控制的实际应用技巧,程序通过选择菜单选项弹出设置正文颜色、字体和修饰等属性表对话框来和用户进行简单交互。其实现步骤如下:
1、利用应用程序向导AppWizard创建一个基于文档的工程TAB,在选择工程类型时应选择单文档;
2、利用资源中的菜单生成器,删除无用菜单,并增加如下菜单结构
菜单名 标识符
设置(S) (弹出菜单名)
背景设置(B) IDM_BKGRND
前景设置(F) IDM_FRGRND
3、利用对话框设计器设置属性表对话框所需要的四个属性页,注意在选择基类时应将属性页类CpropertyPage作为基类,并将对话框及菜单等控件的所有属均改为中文。四个属性页及其包括的控件内容分别为:(1)文字属性对话框包括一个输入文字的文本输入框,用于输入和修改在窗口上显示的文字;(2)字体属性对话框包括三个选中框,用来确定显示的字体修饰;(3)字间距属性对话框包括一个用于显示提示信息的标签和用于输入字间距大小的文本输入框;(4)颜色属性对话框包括一个成组框和三个单选圆钮;(5)窗口中设置一个用于显示输入文字的标签。
以上控制的设置参数如下:
控制名称 标题名称 标识符串
标签控制 IDC_TABCTRL
表态文本 字间距(10-100) IDC_STATIC1
编辑框 IDC_LIST
成组框 颜色 IDC_STATIC2
单选按钮 黑色 IDC_BLACK
红色 IDC_RED
蓝色 IDC_BLUE
文本框(编辑框) IDC_TEXT
设置字体(复选按钮)粗体 IDC_BOLD
斜体 IDC_ITALIC
下划线 IDC_UNDERLINE
按 钮 确认 IDOK
取消 IDCANCEL
利用类向导ClassWizard在属性表对话框CtabDlg、属性页对话框CtextPage和CstylePage中分别加入如下数据成员:
标识符串 类型 数据成员
IDC_TABCTRL CtabCtrl m_tabCtrl
IDC_DIST int m_nDist
IDC_BLACK int m_nColor
IDC_TEXT Cstring m_cText
IDC_BOLD BOOL m_bBold
IDC_ITALIC BOOL m_bItalic
IDC_UNDERLINE BOOL m_bUnderline
以上数据成员也可以在TABDlg.h、StylePage.h和TextPage.h中利用手工方法增加。
4、将要显示的数据成员加入到视类中去,来和对话框之间进行数据交换,并且将其在初始化函数中进行数据初始化。
(1)在TabView.h中增加如下代码:
#include TabDlg.h
#include TextPage.h
#include StylePage.h
class CTabView : public CView
{public:
int nDist;//数值
int nColor;//颜色
CString cText;//中文字符串
BOOL bBold,bItalic,bUnderline;//字体属性
}
(2)在TabView.cpp中对数据成员进行如下初始化。
CTabView::CTabView()
{ nDist=20;
nColor=1;
cText=CString(标签控制演示实例);
bBold=bItalic=bUnderline=FALSE;
}
(3)在TabDlg.cpp中向控制中增加标签,来实现背景设置功能。
BOOL CTabDlg::OnInitDialog()
{ CDialog::OnInitDialog();
TC_ITEM tcItem;//添加标签
tcItem.mask=TCIF_TEXT;
tcItem.pszText=字 间 距;
m_tabCtrl.InsertItem(0,&tcItem);
tcItem.pszText=颜色设置;
m_tabCtrl.InsertItem(1,&tcItem);
m_tabCtrl.SetCurSel(1);
return TRUE;
}
当标签切换时,标签控制会自动向对话框窗口发送TCN_SELCHANGE通知消息,这时需要根据所选择的标签索引号对属性页的显示和隐藏进行切换控制,应完善OnSelchangeTabctrl()函数:
void CTabDlg::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT* pResult)
{ int iPage=m_tabCtrl.GetCurSel();//所选标签号
switch(iPage){
case 0://字间距
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE);//隐藏选择按钮
GetDlgItem(IDC_BLACK)->ShowWindow(SW_HIDE);//隐藏选择按钮
GetDlgItem(IDC_RED)->ShowWindow(SW_HIDE);//隐藏选择按钮
GetDlgItem(IDC_BLUE)->ShowWindow(SW_HIDE);//隐藏选择按钮
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);//显示输入项数
GetDlgItem(IDC_DIST)->ShowWindow(SW_SHOW);//显示输入项数
break;
case 1://颜色设置
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);//隐藏项数输入
GetDlgItem(IDC_DIST)->ShowWindow(SW_HIDE);//隐藏项数输入
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW);//显示选项选择
GetDlgItem(IDC_BLACK)->ShowWindow(SW_SHOW);//显示选项选择
GetDlgItem(IDC_RED)->ShowWindow(SW_SHOW);//显示选项选择
GetDlgItem(IDC_BLUE)->ShowWindow(SW_SHOW);//显示选项选择
break;
}
*pResult = 0;
}
(4)菜单功能的完善。在执行相应的菜单功能时,必须对类向导增加的相应功能函数进行代码完善,这就要处理TabView.cpp文件,背景设置功能函数如下:
void CTabView::OnBkgrnd()
{ CTabDlg ctd;
ctd.m_nDist=nDist;
ctd.m_nColor=nColor;
if(ctd.DoModal()==IDCANCEL) return;
nDist=ctd.m_nDist;
nColor=ctd.m_nColor;
Invalidate();//重新绘制窗口
}
同样,也要对前景设置功能函数进行完善:
void CTabView::OnFrgrnd()
{ CPropertySheet cps(前景设置);//创建属性表对象
CTextPage ctp; //显示文字属性页
CStylePage csp;//显示字体属性页
ctp.m_cText=cText;
csp.m_bBold=bBold;
csp.m_bItalic=bItalic;
csp.m_bUnderline=bUnderline;
cps.AddPage(&ctp);//添加属性页
cps.AddPage(&csp);
if(cps.DoModal()==IDCANCEL) return;
cText=ctp.m_cText;
bBold=csp.m_bBold;
bItalic=csp.m_bItalic;
bUnderline=csp.m_bUnderline;
Invalidate();//重新绘制窗口
}
(5)为了充分演示标签控制与各属性页之间的数据交换功能,应该实现标签控制各属性页与用户之间数据交换结束后的窗口显示功能,笔者实现的功能函数显示了由属性页中输入的字体及背景网格功能,TabView.cpp中的对应函数代码如下:
void CTabView::OnDraw(CDC* pDC)
{ CTabDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
RECT rc;
GetClientRect(&rc);
int i,j,k;
CPen pen,*pOldPen;
COLORREF color;
switch (nColor){
case 0:color=RGB(0,0,0); //设置黑色
break;
case 1:color=RGB(0xff,0,0);//设置红色
break;
case 2:color=RGB(0,0,0xff);//设置蓝色
break;
}
pen.CreatePen(PS_SOLID,1,color);
pOldPen=pDC->SelectObject(&pen);//绘制背景网格
j=rc.right/nDist+1;
k=rc.bottom/nDist+1;
for(i=0;i
pDC->MoveTo(i*nDist,0);
pDC->LineTo(0,i*nDist);
if(i
pDC->MoveTo(i*nDist,0);
pDC->LineTo(rc.right,(j-i)*nDist);
} else {
pDC->MoveTo(0,(i-j)*nDist);
pDC->LineTo(rc.right,i*nDist);
}
}
pDC->SelectObject(&pOldPen);
CFont font,*pOldFont;
font.CreateFont(50,0,0,0,bBold?1000:200,
bItalic,bUnderline,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH,NULL);
pOldFont=pDC->SelectObject(&font);
pDC->TextOut(20,20,cText);
pDC->SelectObject(pOldFont);
}
标签控制的整个实现过程虽然比较繁锁,但只要掌握其实现的本质,设计一个优秀的标签控制界面也并非很困难的事情。
笔者实现的标签控制的演练示例结果如下:
标签控制演练示例结果
第6章 演练CToolBar
6.1 工具条控制的主要功能
所谓工具条就是具有位图和分隔符组成的一组命令按钮,位图按钮部分可以是下推按钮、检查盒按钮、无线按钮等。工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CToolBar::GetToolBarCtrl是MFC类库中封装的一个成员函数,允许使用类库中提供的一般控制和附加功能,CtoolBar类控制成员控制提供了Windows一般控制的所有功能,然而,通过调用GetToolBarCtrl成员函数取得引用后,可以使工具条具有更强的特性。
工具条的创建具有四个步聚:首先是建立工具条资源;然后建立工具条对象结构;其次通过调用建立函数建立工具条对象并绑定;最后调用LoadToolBar调入工具条资源。
另外,还可以通过直接加载位图的方法来建立,步骤如下:首先建立工具条对象;然后通过调用建立函数建立工具条并绑定对象;其次调入包含按钮的位图;最后利用SetButtons 函数设置按钮的风格并与位图建立联系。
其中,所有按钮位图均存放在一个位图文件中,按钮位图的大小相同,默认为16点宽、15点高,位图必须从左至右存放。设置按钮函数具有指向一组控制标识符ID的指针和索引值,用来确定每个按钮的位置,如果存在分隔符ID_SEPARATOR,那么该图像就不存在索引值。正常情况下工具条中的按钮都是单排从左至右排列的,可以通过SetButtonInfo函数改变排序规则。工具条中最终形成的按钮大小相同,均为24 x 22象素,每个按钮只对象一幅图像。工具条中的按钮默认为下推按钮,通过设置TBBS_CHECKBOX风格可以实现检查盒按钮,通过调用SetRadio成员函数可以实现无线按钮。
6.2 工具条控制的对象结构
6.2.1 工具条的对象结构
6.2.1.1 工具条的建立方法
CToolBar &ToolBar 建立工具条对象结构
Create 建立工具条对象并绑定
工具条类CToolBar::Create 的调用格式如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
UINT nID = AFX_IDW_TOOLBAR );
其中参数pParentWnd用来确定指向工具条父窗口的指针;参数dwStyle用来确定工具条的风格,其取值如下;参数nID用来确定工具条子窗口的标识符。
CBRS_TOP 表示工具条在框架窗口的顶部
CBRS_BOTTOM 表示工具条在框架窗口的底部
CBRS_NOALIGN 表示工具条在父窗口改变大小时不响应
CBRS_TOOLTIPS 表示工具条具有动态提示功能
CBRS_SIZE_DYNAMIC 表示工具条是静态的不能改变
CBRS_SIZE_FIXED 表示工具条是动态的可以改变
CBRS_FLOATING 表示工具条是浮动的
CBRS_FLYBY 表示状态条上显示工具条中按钮的信息
CBRS_HIDE_INPLACE 表示工具条隐藏
除以上函数外,还包括设置按钮和位图的大小SetSizes、设置工具条的高度SetHeight、调入工具条资源LoadToolBar、调入工具条按钮位图LoadBitmap、设置工具条按钮位图SetBitmap、设置工具条中位图按钮的风格和索引值SetButtons等控制函数。
6.2.1.2 工具条的类属性
工具条控制类的属性包括取得标识符ID对象按钮索引CommandToIndex、取得索引对应的命令标识符ID或分隔符GetItemID、取得索引对应的矩形区域GetItemRect、取得按钮风格GetButtonStyle、设置按钮风格SetButtonStyle、取得按钮的ID标识-风格-图象数GetButtonInfo、设置按钮ID标识-风格-图象数SetButtonInfo、取得按钮提示文本GetButtonText、设置按钮提示文本SetButtonText和取得工具条直接存取控制GetToolBarCtrl等。
6.2.2 工具条控制的对象结构
6.2.2.1 工具条控制的建立方法
CToolBarCtrl &ToolBarCtrl 建立工具条控制对象结构
Create 建立工具条控制对象并绑定
工具条控制类CToolBarCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定工具条控制的风格,必须存在WS_CHILD风格;参数rect用来确定工具条控制的大小和位置;参数pParentWnd用来确定工具条控制的父窗口指针,不能为NULL;参数nID用来确定工具条控制的标识符。
可以利用WS_CHILD、WS_VISIBLE和WS_DISABLED来设置工具条窗口的风格,但必须合理设置如下控制风格:
CCS_ADJUSTABLE 允许用户处理工具条窗口大小,如果存在工具条窗口必须处理相应信
CCS_BOTTOM 使控制处于父窗口客户区域底部并与窗口同样宽
CCS_NODIVIDER 禁止在控制的顶部绘制2个象素的高亮条
CCS_NOHILITE 禁止在控制的顶部绘制1个象素的高亮条
CCS_NOMOVEY 使控制改变大小和移动时自动水平对齐,垂直对齐必须处理WM_SIZE消息
如果CCS_NORESIZE风格有效,则该风格无效
CCS_NOPARENTALIGN禁止控制自动移到父窗口顶部或底部,如果CCS_TOP或 CCS_BOTTOM风格
有效,则高度调整为默认而宽度可以改变
CCS_NORESIZE 禁止设置新的大小或无效值时使用默认宽度和高度值,而使用建立值
CCS_TOP 使控制自动停靠在父窗口客户区域顶部并与父窗口同样宽度
最后,还必须利用下面的风格来控制工具条
TBSTYLE_TOOLTIPS 使工具条建立并管理动态提示控制
TBSTYLE_WRAPABLE 使工具条控制按钮具有多行排列格式
6.2.2.2 工具条控制中的数据结构
工具条控制中最常用的数据结构为TBBUTTON,其具体结构如下:
typedef struct _TBBUTTON {
int iBitmap; // 基于0的位图索引值
int idCommand; // 按钮按下时发送的命令值
BYTE fsState; // 按钮的状态
BYTE fsStyle; // 按钮的风格
DWORD dwData; // 应用程序定义的数据
int iString; // 基于0的按钮标签字符串索引值
} TBBUTTON;
其中按钮状态fsState的值如下:
TBSTATE_CHECKED 表示按钮具有TBSTYLE_CHECKED风格并且被按下
TBSTATE_ENABLED 表示按钮允许接受输入,否则变灰不接受任何输入
TBSTATE_HIDDEN 表示按钮不可见并且不接受任何输入
TBSTATE_INDETERMINATE 表示按钮是变灰的
TBSTATE_PRESSED 表示按钮正被按下
TBSTATE_WRAP 表示按钮具有换行特性,该按钮必须具有TBSTATE_ENABLED状态
按钮风格style可以是下列值的组合:
TBSTYLE_BUTTON 表示建立标准下推按钮
TBSTYLE_CHECK 表示建立检查状态按钮
TBSTYLE_CHECKGROUP表示建立检查按钮群
TBSTYLE_GROUP 表示建立按下状态按钮群
TBSTYLE_SEP 表示建立按钮分隔符
6.2.2.3 工具条控制的类属性
工具条控制的类属性必然的联系判断按钮使能状态IsButtonEnabled、判断按钮检查状态IsButtonChecked、判断按钮按下状态IsButtonPressed、判断按钮是否隐藏IsButtonHidden、判断按钮变灰状态IsButtonIndeterminate、设置按钮状态SetState、取得按钮状态GetState、取得按钮有关信息GetButton、取得按钮总数GetButtonCount、取得按钮矩形区域GetItemRect、设置按钮结构大小SetButtonStructSize、设置按钮大小SetButtonSize、设置按钮位图大小SetBitmapSize、取得按钮提示控制GetToolTips、设置按钮提示控制SetToolTips等。
6.2.2.4 工具条控制类的操作方法
工具条控制类的操作方法包括使能按钮EnableButton、检查按钮CheckButton、按下按钮PressButton、隐藏按钮HideButton、变灰按钮Indeterminate、增加按钮AddButtons、插入按钮InsertButton、删除按钮DeleteButton、取得控制符ID对应的索引CommandToIndex、恢复工具条状态RestoreState、保存工具条状态SaveState和重新确定工具条大小AutoSize等。
5.1 标5.2 签控制的主要功能
标签控制(TabControl)是用来在一个窗口如对话框等中的同一用户区域控制多组显示信息或控制信息,由顶部的一组标签来控制不同的信息提示,标签即可以是文本说明也可以是一个代表文本含义的图标,或是两者的组合。针对不同的选择标签,都会有一组提示信息或控制信息与之相对应,供用户进行交互操作,这在WINDOWS98的属性表中最常见。另外还存在一种特殊风格的标签,即TBS_BUTTONS风格的标签,这种标签外观类似按钮,通过鼠标点击改变状态,一般用来执行一些功能而不是用来显示或控制信息。
提到标签,最快想到的应该是属性表对话(PropertySheet),这两者的配合应用更是随处可见。属性表对话框有时也称为多页对话框(Multiple-PageDialog)或是标签对话框(Table Dialog),最多可设置24个属性页(PropertyPage),通过顶部的标签来选择不同的属性页。另外还有一种特殊的属性表对话框,就象VC++5.0中的类向导AppWizard一样,其不存在供用户选择的标签,而是按照顺序依次控制属性页的显示,并且还有一般属性页中不存在的“确认”、“上一步”、“下一步”、“完成”和“帮助”等按钮。
标签控制在MFC中只存在一种封装形式,即控制类CtabCtrl。在使用标签时即可以在对话框中直接添加,也可以在窗口中作为子窗口来使用,只不过这样应用时需要选创建标签。
5.3 标5.4 签控制的对象结构
5.4.1 标5.4.2 签控制的建立方法
CTabCtrl&tabCtrl 建立标签控制对象结构
Create 建立标签控制并绑定对象
标签控制CTabCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定标签控制的风格;rect用来控制标签的大小和位置;pParentWnd用来确定标签控制的父窗口句柄;nID用来确定标签控制的标识符。
标签控制的风格可以是如下值的组合:
TCS_BUTTONS 表示将标签外观定义成类似按钮
TCS_FIXEDWIDTH 使所有标签具有相同的宽度
TCS_FOCUSNEVER 使特定标签永远不接收输入焦点
TCS_FOCUSONBUTTONDOWN 当标签被鼠标点击时接收输入焦点,其仅与TCS_BUTTONS合用
TCS_FORCEICONLEFT 强制图标在左面,剩余部分使标签居中
TCS_FORCELABELLEFT 使图标和标签均左对齐
TCS_MULTILINE 允许标签控制显示多行标签
TCS_OWNERDRAWFIXED 允许父窗口自绘标签
TCS_RIGHTJUSTIFY 使标签右对齐
TCS_SHAREIMAGELISTS 当控制被撤消时标签控制的图像不被撤消
TCS_TOOLTIPS 允许标签控制存在工具提示控制
TCS_TABS 标签正常显示,为默认状态
TCS_SINGLELINE 将标签只显示在一行上,默认状态
TCS_RAGGEDRIGHT 不使标签自动填满控制区域,默认状态
同样,标签控制还可以使用窗口的一些控制风格:
WS_CHILD 为标签控制创建子窗口,只能与WS_POPUP风格一起使用
WS_VISIBLE 建立一个初始可视的标签控制
WS_DISABLED 建立一个初始不可视的标签控制
WS_GROUP 建立标签控制群组的第一个控制
WS_TABSTOP 建立可用TAB键移动的标签控制
5.4.3 标5.4.4 签控制的属性类
标签控制的属性类包括取得与标签控制相关联的图像列表GetImageList、设置标签控制的图像列表SetImageList、取得标签控制中标签的总数GetItemCount、取得标签控制中特定标答的相关信息GetItem、设置标签的部分或全部属性SetItem、检测当前被选中的标签GetCurSel、将一个标签设置为选中状态SetCurSel和取得具有当前输入焦点的标签SetCurSel等。
5.4.5 标5.4.6 签控制的操作方法
标签控制的操作方法包括在标签控制中插入一个标签InsertItem、删除一个标签 DeleteItem、从标签控制中删除所有项目DeleteAllItems、从标签控制中删除一个图像列表RemoveImage和绘制标签控制中的特定一项DrawItem等。
5.5 标5.6 签控制的数据结构
在使用标签控制时,必须使用的函数就是在标签控制中插入标签。函数InsertItem的原形如下:
BOOL InsertItem(int nItem,TC_ITEM * pTabCtrlItem);
该函数中的TC_ITEM为添加标签时所使用信息的数据结构,其数据成员的定义方法及含义如下:
typedef struct _TC_ITEM {
UINT mask; // 确定结构成员的屏蔽或设置位
UINT lpReserved1; // 保留未用
UINT lpReserved2; // 保留未用
LPSTR pszText; // 标签名称字符串
int cchTextMax; // 标签名称字符串缓冲区大小
int iImage; // 标签控制的图像索引号
LPARAM lParam; // 应用程序定义的相关32位数据
} TC_ITEM;
当鼠标点击标签控制中的标签时,标签控制就会向其父窗口发送相关的通知消息,通过处理这些通知消息,程序可以实现各种功能。
5.7 属性表和属性页的基本用法
在标签控制过程中,属性表对话框和属性页是必不可少的。在MFC类库中,属性表对话框类CpropertySheet是由CWnd类派生而来的,而属性页类CpropertyPage是由Cdialog类派生而来的,它们的用法基本相同:
1、创建所有的属性页。创建属性页的方法与创建一般对话框资源的方法一样,利用对话框编辑器可以为每个属性页创建一个对话框模板,其区别在于,当利用类向导ClassWizard为属性页生成类时应选择属性页类CpropertyPage作为基类,而不是将一般的对话框类Cdialog作为基类;
2、创建属性表对话框,并将事先创建好的各属性页添加进去,两者的创建顺序可以互换,但在创建完之后将属性页添加到属性表对话框中去这一步是必须要做的;
3、显示属性表对话框。虽然属性表对话框类CpropertySheet不是由对话框类Cdialog派生而来的,但两者的操作非常类似,调用DoModal()函数就会显示一个模态属性表对话框,而调用Create()操作就会显示一个非模态的属性表对话框;
4、对数据交换的处理。和对话框类似,属性表对话框与对象之间的数据交换也是通过数据成员2来实现的,只是属性表本身不带数据成员,而实际进行数据交换的是属性页中的数据成员;
5、对向导对话框的处理。如果要显示一个向导对话框,在显示之前应首先调用SetWizardMode()函数对向导对话框进行特殊处理,对于存在按钮的向导对话框,还应调用SetWizardButtons()来对向导对话框的按钮功能进行定制,在用户操作结束时还应调用SetFinishText()函数将“完成”按钮设置为有效状态。
5.8 标5.9 签控制的应用技巧示例程序
本文给出一个基于文档的标签应用实例。实例程序中通过简单设置菜单、标签和属性表来演示标签控制的实际应用技巧,程序通过选择菜单选项弹出设置正文颜色、字体和修饰等属性表对话框来和用户进行简单交互。其实现步骤如下:
1、利用应用程序向导AppWizard创建一个基于文档的工程TAB,在选择工程类型时应选择单文档;
2、利用资源中的菜单生成器,删除无用菜单,并增加如下菜单结构
菜单名 标识符
设置(S) (弹出菜单名)
背景设置(B) IDM_BKGRND
前景设置(F) IDM_FRGRND
3、利用对话框设计器设置属性表对话框所需要的四个属性页,注意在选择基类时应将属性页类CpropertyPage作为基类,并将对话框及菜单等控件的所有属均改为中文。四个属性页及其包括的控件内容分别为:(1)文字属性对话框包括一个输入文字的文本输入框,用于输入和修改在窗口上显示的文字;(2)字体属性对话框包括三个选中框,用来确定显示的字体修饰;(3)字间距属性对话框包括一个用于显示提示信息的标签和用于输入字间距大小的文本输入框;(4)颜色属性对话框包括一个成组框和三个单选圆钮;(5)窗口中设置一个用于显示输入文字的标签。
以上控制的设置参数如下:
控制名称 标题名称 标识符串
标签控制 IDC_TABCTRL
表态文本 字间距(10-100) IDC_STATIC1
编辑框 IDC_LIST
成组框 颜色 IDC_STATIC2
单选按钮 黑色 IDC_BLACK
红色 IDC_RED
蓝色 IDC_BLUE
文本框(编辑框) IDC_TEXT
设置字体(复选按钮)粗体 IDC_BOLD
斜体 IDC_ITALIC
下划线 IDC_UNDERLINE
按 钮 确认 IDOK
取消 IDCANCEL
利用类向导ClassWizard在属性表对话框CtabDlg、属性页对话框CtextPage和CstylePage中分别加入如下数据成员:
标识符串 类型 数据成员
IDC_TABCTRL CtabCtrl m_tabCtrl
IDC_DIST int m_nDist
IDC_BLACK int m_nColor
IDC_TEXT Cstring m_cText
IDC_BOLD BOOL m_bBold
IDC_ITALIC BOOL m_bItalic
IDC_UNDERLINE BOOL m_bUnderline
以上数据成员也可以在TABDlg.h、StylePage.h和TextPage.h中利用手工方法增加。
4、将要显示的数据成员加入到视类中去,来和对话框之间进行数据交换,并且将其在初始化函数中进行数据初始化。
(1)在TabView.h中增加如下代码:
#include TabDlg.h
#include TextPage.h
#include StylePage.h
class CTabView : public CView
{public:
int nDist;//数值
int nColor;//颜色
CString cText;//中文字符串
BOOL bBold,bItalic,bUnderline;//字体属性
}
(2)在TabView.cpp中对数据成员进行如下初始化。
CTabView::CTabView()
{ nDist=20;
nColor=1;
cText=CString(标签控制演示实例);
bBold=bItalic=bUnderline=FALSE;
}
(3)在TabDlg.cpp中向控制中增加标签,来实现背景设置功能。
BOOL CTabDlg::OnInitDialog()
{ CDialog::OnInitDialog();
TC_ITEM tcItem;//添加标签
tcItem.mask=TCIF_TEXT;
tcItem.pszText=字 间 距;
m_tabCtrl.InsertItem(0,&tcItem);
tcItem.pszText=颜色设置;
m_tabCtrl.InsertItem(1,&tcItem);
m_tabCtrl.SetCurSel(1);
return TRUE;
}
当标签切换时,标签控制会自动向对话框窗口发送TCN_SELCHANGE通知消息,这时需要根据所选择的标签索引号对属性页的显示和隐藏进行切换控制,应完善OnSelchangeTabctrl()函数:
void CTabDlg::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT* pResult)
{ int iPage=m_tabCtrl.GetCurSel();//所选标签号
switch(iPage){
case 0://字间距
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE);//隐藏选择按钮
GetDlgItem(IDC_BLACK)->ShowWindow(SW_HIDE);//隐藏选择按钮
GetDlgItem(IDC_RED)->ShowWindow(SW_HIDE);//隐藏选择按钮
GetDlgItem(IDC_BLUE)->ShowWindow(SW_HIDE);//隐藏选择按钮
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);//显示输入项数
GetDlgItem(IDC_DIST)->ShowWindow(SW_SHOW);//显示输入项数
break;
case 1://颜色设置
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);//隐藏项数输入
GetDlgItem(IDC_DIST)->ShowWindow(SW_HIDE);//隐藏项数输入
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW);//显示选项选择
GetDlgItem(IDC_BLACK)->ShowWindow(SW_SHOW);//显示选项选择
GetDlgItem(IDC_RED)->ShowWindow(SW_SHOW);//显示选项选择
GetDlgItem(IDC_BLUE)->ShowWindow(SW_SHOW);//显示选项选择
break;
}
*pResult = 0;
}
(4)菜单功能的完善。在执行相应的菜单功能时,必须对类向导增加的相应功能函数进行代码完善,这就要处理TabView.cpp文件,背景设置功能函数如下:
void CTabView::OnBkgrnd()
{ CTabDlg ctd;
ctd.m_nDist=nDist;
ctd.m_nColor=nColor;
if(ctd.DoModal()==IDCANCEL) return;
nDist=ctd.m_nDist;
nColor=ctd.m_nColor;
Invalidate();//重新绘制窗口
}
同样,也要对前景设置功能函数进行完善:
void CTabView::OnFrgrnd()
{ CPropertySheet cps(前景设置);//创建属性表对象
CTextPage ctp; //显示文字属性页
CStylePage csp;//显示字体属性页
ctp.m_cText=cText;
csp.m_bBold=bBold;
csp.m_bItalic=bItalic;
csp.m_bUnderline=bUnderline;
cps.AddPage(&ctp);//添加属性页
cps.AddPage(&csp);
if(cps.DoModal()==IDCANCEL) return;
cText=ctp.m_cText;
bBold=csp.m_bBold;
bItalic=csp.m_bItalic;
bUnderline=csp.m_bUnderline;
Invalidate();//重新绘制窗口
}
(5)为了充分演示标签控制与各属性页之间的数据交换功能,应该实现标签控制各属性页与用户之间数据交换结束后的窗口显示功能,笔者实现的功能函数显示了由属性页中输入的字体及背景网格功能,TabView.cpp中的对应函数代码如下:
void CTabView::OnDraw(CDC* pDC)
{ CTabDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
RECT rc;
GetClientRect(&rc);
int i,j,k;
CPen pen,*pOldPen;
COLORREF color;
switch (nColor){
case 0:color=RGB(0,0,0); //设置黑色
break;
case 1:color=RGB(0xff,0,0);//设置红色
break;
case 2:color=RGB(0,0,0xff);//设置蓝色
break;
}
pen.CreatePen(PS_SOLID,1,color);
pOldPen=pDC->SelectObject(&pen);//绘制背景网格
j=rc.right/nDist+1;
k=rc.bottom/nDist+1;
for(i=0;i
pDC->MoveTo(i*nDist,0);
pDC->LineTo(0,i*nDist);
if(i
pDC->MoveTo(i*nDist,0);
pDC->LineTo(rc.right,(j-i)*nDist);
} else {
pDC->MoveTo(0,(i-j)*nDist);
pDC->LineTo(rc.right,i*nDist);
}
}
pDC->SelectObject(&pOldPen);
CFont font,*pOldFont;
font.CreateFont(50,0,0,0,bBold?1000:200,
bItalic,bUnderline,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH,NULL);
pOldFont=pDC->SelectObject(&font);
pDC->TextOut(20,20,cText);
pDC->SelectObject(pOldFont);
}
标签控制的整个实现过程虽然比较繁锁,但只要掌握其实现的本质,设计一个优秀的标签控制界面也并非很困难的事情。
笔者实现的标签控制的演练示例结果如下:
标签控制演练示例结果
第6章 演练CToolBar
6.1 工具条控制的主要功能
所谓工具条就是具有位图和分隔符组成的一组命令按钮,位图按钮部分可以是下推按钮、检查盒按钮、无线按钮等。工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CToolBar::GetToolBarCtrl是MFC类库中封装的一个成员函数,允许使用类库中提供的一般控制和附加功能,CtoolBar类控制成员控制提供了Windows一般控制的所有功能,然而,通过调用GetToolBarCtrl成员函数取得引用后,可以使工具条具有更强的特性。
工具条的创建具有四个步聚:首先是建立工具条资源;然后建立工具条对象结构;其次通过调用建立函数建立工具条对象并绑定;最后调用LoadToolBar调入工具条资源。
另外,还可以通过直接加载位图的方法来建立,步骤如下:首先建立工具条对象;然后通过调用建立函数建立工具条并绑定对象;其次调入包含按钮的位图;最后利用SetButtons 函数设置按钮的风格并与位图建立联系。
其中,所有按钮位图均存放在一个位图文件中,按钮位图的大小相同,默认为16点宽、15点高,位图必须从左至右存放。设置按钮函数具有指向一组控制标识符ID的指针和索引值,用来确定每个按钮的位置,如果存在分隔符ID_SEPARATOR,那么该图像就不存在索引值。正常情况下工具条中的按钮都是单排从左至右排列的,可以通过SetButtonInfo函数改变排序规则。工具条中最终形成的按钮大小相同,均为24 x 22象素,每个按钮只对象一幅图像。工具条中的按钮默认为下推按钮,通过设置TBBS_CHECKBOX风格可以实现检查盒按钮,通过调用SetRadio成员函数可以实现无线按钮。
6.2 工具条控制的对象结构
6.2.1 工具条的对象结构
6.2.1.1 工具条的建立方法
CToolBar &ToolBar 建立工具条对象结构
Create 建立工具条对象并绑定
工具条类CToolBar::Create 的调用格式如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
UINT nID = AFX_IDW_TOOLBAR );
其中参数pParentWnd用来确定指向工具条父窗口的指针;参数dwStyle用来确定工具条的风格,其取值如下;参数nID用来确定工具条子窗口的标识符。
CBRS_TOP 表示工具条在框架窗口的顶部
CBRS_BOTTOM 表示工具条在框架窗口的底部
CBRS_NOALIGN 表示工具条在父窗口改变大小时不响应
CBRS_TOOLTIPS 表示工具条具有动态提示功能
CBRS_SIZE_DYNAMIC 表示工具条是静态的不能改变
CBRS_SIZE_FIXED 表示工具条是动态的可以改变
CBRS_FLOATING 表示工具条是浮动的
CBRS_FLYBY 表示状态条上显示工具条中按钮的信息
CBRS_HIDE_INPLACE 表示工具条隐藏
除以上函数外,还包括设置按钮和位图的大小SetSizes、设置工具条的高度SetHeight、调入工具条资源LoadToolBar、调入工具条按钮位图LoadBitmap、设置工具条按钮位图SetBitmap、设置工具条中位图按钮的风格和索引值SetButtons等控制函数。
6.2.1.2 工具条的类属性
工具条控制类的属性包括取得标识符ID对象按钮索引CommandToIndex、取得索引对应的命令标识符ID或分隔符GetItemID、取得索引对应的矩形区域GetItemRect、取得按钮风格GetButtonStyle、设置按钮风格SetButtonStyle、取得按钮的ID标识-风格-图象数GetButtonInfo、设置按钮ID标识-风格-图象数SetButtonInfo、取得按钮提示文本GetButtonText、设置按钮提示文本SetButtonText和取得工具条直接存取控制GetToolBarCtrl等。
6.2.2 工具条控制的对象结构
6.2.2.1 工具条控制的建立方法
CToolBarCtrl &ToolBarCtrl 建立工具条控制对象结构
Create 建立工具条控制对象并绑定
工具条控制类CToolBarCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定工具条控制的风格,必须存在WS_CHILD风格;参数rect用来确定工具条控制的大小和位置;参数pParentWnd用来确定工具条控制的父窗口指针,不能为NULL;参数nID用来确定工具条控制的标识符。
可以利用WS_CHILD、WS_VISIBLE和WS_DISABLED来设置工具条窗口的风格,但必须合理设置如下控制风格:
CCS_ADJUSTABLE 允许用户处理工具条窗口大小,如果存在工具条窗口必须处理相应信
CCS_BOTTOM 使控制处于父窗口客户区域底部并与窗口同样宽
CCS_NODIVIDER 禁止在控制的顶部绘制2个象素的高亮条
CCS_NOHILITE 禁止在控制的顶部绘制1个象素的高亮条
CCS_NOMOVEY 使控制改变大小和移动时自动水平对齐,垂直对齐必须处理WM_SIZE消息
如果CCS_NORESIZE风格有效,则该风格无效
CCS_NOPARENTALIGN禁止控制自动移到父窗口顶部或底部,如果CCS_TOP或 CCS_BOTTOM风格
有效,则高度调整为默认而宽度可以改变
CCS_NORESIZE 禁止设置新的大小或无效值时使用默认宽度和高度值,而使用建立值
CCS_TOP 使控制自动停靠在父窗口客户区域顶部并与父窗口同样宽度
最后,还必须利用下面的风格来控制工具条
TBSTYLE_TOOLTIPS 使工具条建立并管理动态提示控制
TBSTYLE_WRAPABLE 使工具条控制按钮具有多行排列格式
6.2.2.2 工具条控制中的数据结构
工具条控制中最常用的数据结构为TBBUTTON,其具体结构如下:
typedef struct _TBBUTTON {
int iBitmap; // 基于0的位图索引值
int idCommand; // 按钮按下时发送的命令值
BYTE fsState; // 按钮的状态
BYTE fsStyle; // 按钮的风格
DWORD dwData; // 应用程序定义的数据
int iString; // 基于0的按钮标签字符串索引值
} TBBUTTON;
其中按钮状态fsState的值如下:
TBSTATE_CHECKED 表示按钮具有TBSTYLE_CHECKED风格并且被按下
TBSTATE_ENABLED 表示按钮允许接受输入,否则变灰不接受任何输入
TBSTATE_HIDDEN 表示按钮不可见并且不接受任何输入
TBSTATE_INDETERMINATE 表示按钮是变灰的
TBSTATE_PRESSED 表示按钮正被按下
TBSTATE_WRAP 表示按钮具有换行特性,该按钮必须具有TBSTATE_ENABLED状态
按钮风格style可以是下列值的组合:
TBSTYLE_BUTTON 表示建立标准下推按钮
TBSTYLE_CHECK 表示建立检查状态按钮
TBSTYLE_CHECKGROUP表示建立检查按钮群
TBSTYLE_GROUP 表示建立按下状态按钮群
TBSTYLE_SEP 表示建立按钮分隔符
6.2.2.3 工具条控制的类属性
工具条控制的类属性必然的联系判断按钮使能状态IsButtonEnabled、判断按钮检查状态IsButtonChecked、判断按钮按下状态IsButtonPressed、判断按钮是否隐藏IsButtonHidden、判断按钮变灰状态IsButtonIndeterminate、设置按钮状态SetState、取得按钮状态GetState、取得按钮有关信息GetButton、取得按钮总数GetButtonCount、取得按钮矩形区域GetItemRect、设置按钮结构大小SetButtonStructSize、设置按钮大小SetButtonSize、设置按钮位图大小SetBitmapSize、取得按钮提示控制GetToolTips、设置按钮提示控制SetToolTips等。
6.2.2.4 工具条控制类的操作方法
工具条控制类的操作方法包括使能按钮EnableButton、检查按钮CheckButton、按下按钮PressButton、隐藏按钮HideButton、变灰按钮Indeterminate、增加按钮AddButtons、插入按钮InsertButton、删除按钮DeleteButton、取得控制符ID对应的索引CommandToIndex、恢复工具条状态RestoreState、保存工具条状态SaveState和重新确定工具条大小AutoSize等。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询