`
fpwjp
  • 浏览: 45128 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

对话框高级编程---公共控件之二(标签控件和属性表)

    博客分类:
  • C++
阅读更多

      1.标签控件

       标签(tab)控件也称选项卡控件,在功能上类似一个文件柜上的标签。标签控件由多个页面组成。每个页面都配有一个带有标题的标签,当用户单击一个标签就显示对应的页面。Windows应用程序大量使用标签控件,如利用Visual C++进行对话框编程时经常用到的Properties对话框就使用了标签控件。

      标签控件作为一个控件一般需要放在一个对话框上,同时一个标签控件由多个标签页组成,每个标签页一般又与一个对话框对应。编程时使用标签控件,就可以在一个窗口的相同区域定义多个标签页,其中每个标签页的对话框上可以使用不同的控件,分别实现不同的对话功能。

      但要注意一点,标签是作为一个控件而使用,由于它不是对话框,因此编程时不能直接在各个标签页上添加控件,只能 在选中不同标签时在相同位置显示含有不同控件的对话框。如同一般MFC编程那样,这些对话框可以作为资源滔天大罪中到项目中,标签控件实现的是在不同标签页对话框窗口之间的切换,而不只是标签页的显示切换。

      标签控件可以设置的属性有很多,主要属性有:Alignment下拉框用于设置每个标签的宽度为Right Justify(自动随标题长度调节,默认值)或Fixed Width(固定宽度);Buttons表示标签采用按钮形状;Multiline表示标签可以多行的形式显示;Hottrack表示当光标通过一个标签时标签的标题呈蓝色;Button表示标签位于控件的底端;Vertical表示标签以垂直的方式出现。

      要实现标签的切换功能,必须对标签控件的有关消息进行处理。当用户鼠标单击某个标签时,标签向父窗口发送通知消息NM_CLICK。当用户选择不同的标签时,分别发送消息TCN_SELCHANGEING(标签切换之前)和TCN_SELCHANGE(标签切换后)。在消息处理函数可以调用MFC标签控件类的成员函数返回当前所选择的标签。

     MFC类CTabCtrl提供了标签控件的各项服务功能,通过其成员函数实现了对控件及其数据结构的操作。编程时常用的成员函数有:函数InsertItem()或DeleteItem()用于插入或删除一个标签,函数GetCurlSel()或SetCurlSel()用于获取所选择标签的索引号或设置当前标签。在CTabCtrl类的很多成员函数中都用到一个TCIITEM结构(取代了IC_ITEM结构)的参数,该结构用于设置每一个标签的属性,其组成如下:

typedef struct tagTCITEM
{
	UINT mask;			//TCIF_掩码,用于指明结构中哪些成员有效
	DWORD dwState;		//标签页的当前状态
	DWORD dwStateMask;	//dwState掩码,指明成员dwState中哪些有效
	LPTSTR pszText;		//标签标题
	int cchTextMax;		//标签标题字符的最长度
	int iImage;			//与标签关联的图像列表的索引,若没有则为-1
	LPARAM  lParam;		//应用程序自定义的与标签页相关的数据
}TCITEM;

     例如,下面的代码向标签控件添加一个标题为My TabPage的标签页

CTabCtrl m_TabCtl;		//创建一个标签控件
TCITEM tci;				//声明一个TCITEM结构
tci.mask=TCIF_TEXT;		//指明结构体成pszText有效
tci.pszText="My TabPage";//标签名为My TabPage
m_TabCtl.InsertItem(0,&tcl);//将这个标签页作为标签控件的第1个标签  

     2.属性表

    属性表(property sheet)又称属性对话框其形式和功能类似于前介绍的标签对话框。MFC提供了实现属性表的两个类;CPropertySheet和CPropertyPage。一个属性表由一个CPopertySheet类的对象和多个CPropertyPage类的对象构成,其中,CPropertySheet类或其派生类对象代表一个属性表,CPropertyPage派生类对象代表每个不同的属性页。

  虽然CPropertySheet类是派生于CWnd类而不是CDialog类,但属性表的使用方法与对话框类似,即先调用成员函数DoModal()创建一个模态属性表,或调用成员函数Create()创建一个非模态属性表。

  一个属性页对应一个对话框,实际上一个属性页就是一个对话框,CPropertyPage类是派生类于CDialog类。因此可以对话框编辑器为每个属性页添加控件,并可以利用类向导ClassWizard创建派生类,添加与控件关联的成员变量和消息处理函数。

  属性表编程的主要步骤总结如下:

  (1)为每个属性页创建属性对话框资源。

  (2)为每个属性对话框添加控件。

  (3)为每个属性对话框创建CPopertyPage类的派生类,并添加成员变量和消息处理函数。

  (4)如果需要可以创建一个自已的属性表,它是CPropertySheet类的派生类。

  (5)在程序需要的地方(如菜单命令处理函数中)定义一个CPropertySheet类或其派生类对象(即属性表),并定义所有的CPropertyPage派生类对象(即属性页),通过调用AddPage()函数将属性页加入到属性表,最后显示该属性表。

     例 编写一个SDI应用程序PropSt,利用属性表实现选项卡功能。

  [编程说明与实现]

  (1)利用MFC AppWizard向导创建一个SDI应用程序PropSt,为了减少重复工作,利用Copy和Paste命令将项ExmpTabCtrl中的两个标签页对话框资源复制到本项目。两个对话框将作为属性页使用,因此必须重新设置两个对话框的一些属性。设置对话框的Child属性、Border边界的Thin属性和Title bar属性,恢复原来标题“使用组合框”和“使用公共控件”。然后利用ClassWizard分别创建对话框类CComboDlg和CComctlDlg。也可以通过Insert|Resource|Dialog|IDD_PROPAGE命令为项目添加一个新属性页资源。

  (2)利用“复制”和“粘贴”命令将项目ExmpTabCtrl中两个对话框类定义的头文件ComboDlg.h、ComctlDlg.h和实现文件ComboDlg.cpp、ComctlDlg.cpp复制到本项目,并将实现文件中开头位置所包含的应用程序类头文件改PropSt.h。利用Edit|Replace命令将两个对话框类的头文件和实现文件中的基类CDialog替换为CPropertyPage。派生的属性表类CComboDlg和ComctlDlg的构造函数调用了基类CPropertyPage()的构造函数,但通过Replace命令得到的构造函数的参数不匹配,必须去掉CPropertyPage()构造函数中的参数pParent。

  (3)添加菜单项"测试|属性表",其ID为ID_TEST_PROPSHEET。利用类向导ClassWizard为视图类CPropStView添加该菜单项的命令处理函数,在函数中生成一个属性表和两个属性页,并通过调用AddPage()函数将属性页加入到属性表,最后显示该属性表。当用户单击“确定”按钮时根据输入的数据绘制一个圆。

void CExmpTabCtrlView::OnTestPropsheet() 
{
	// TODO: Add your command handler code here
	CPropertySheet MySheet("使用属性表");	//生成一个属性表
	CComboDlg page1;						//生成第一个属性页
	MySheet.AddPage(&page1);				//将第一个属性页加入到属性表
	CComctlDlg page2;						//生成第二个属性页
	MySheet.AddPage(&page2);				//将第二个属性加入到属性表
	if(MySheet.DoModal()!=IDOK)
		return;
	Invalidate();
	UpdateWindow();
	CClientDC dc(this);
	CPen penNew,*ppenOld;
	penNew.CreatePen(PS_SOLID,page2.m_nLineWt,RGB(0,0,0));
	ppenOld=dc.SelectObject(&penNew);
	dc.Ellipse(0,0,2*page2.m_nRadius,2*page2.m_nRadius);
	dc.SelectObject(ppenOld);
}

  在文件PropStView.cpp的开头位置加入包含属性页类头文件的语句

#include "ComboDlg.h"
#include "ComctlDlg.h"

 

  • PropSt.rar (1.9 MB)
  • 描述: 属性页实现选项卡的实例
  • 下载次数: 27
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics