MFC中CPropertySheet与CTabCtrl的使用

一、控件的介绍

MFC中封装了许多有用的类,CTabCtrl和CPropertySheet是其中两个比较常用的类型。CTabCtrl即Tab控件对应的类,Windows应用程序中大量使用了Tab控件。属性页对应的是CPropertySheet,你在桌面上右键鼠标弹出的显示对话框就是一个CPropertySheet类型的对象。事实上这类弹出的、类似“属性页”的窗口大部分都是CPropertySheet。

其实,这两个类之间也有着很密切的联系。使用Spy++观察一个属性页窗口可以发现,它也包含了一个Tab控件


二、属性页的使用

属性页的使用比较简单,过程也很清晰。先说一下,CPropertySheet和CDialog对话框类同样都派生于CWnd类,所以他俩在使用上有很多相似的地方。我不知道是不是这哥俩太相似了,以至于Spy++把我自建的一个CPropertySheet窗口认作是CDialog。

既然属性页和对话框相似,我们只要有了一个属性页的类,就可以使用DoModal()方法来产生一个模态的窗口,或者用Create()产生一个非模态的窗口。注意如果显示非模式的窗口,要考虑变量生存期的问题,这点和非模态对话框是一样的。

属性页窗口里面那么多的选项卡是怎么弄出来的?这就需要CPropertyPage。这是一个对话框类的子类,对应着一个选项卡。对一个属性页,我们使用AddPage()方法来添加选项卡

选项卡既然是对话框,我们就可以在资源窗口中建立对话框,然后利用类向导为他建立类,注意要选择派生自CPropertyPage。MSDN上面说,建立这类对话框资源模板时有几点要注意

1.保留TitleBar属性。对话框标题就是将来显示在选项卡上的标签

2.对话框风格设为Child,边框设为Thin

3.将对话框设为Disabled

好了,总结一下属性页的使用步骤就是

1.建立模板资源,构造你需要的每一个CPropertyPage。

2.使用CPropertySheet类,用AddPage()方法为其添加至少一个选项卡。或者,你可以派生一个自己的CMyPropertySheet类,在内部添加上各个CPropertyPage作为成员变量,并在构造函数中用AddPage

3.在需要使用属性页的地方声明变量,使用DoModal()或者Create()方法显示属性页


三、Tab控件的使用

Tab控件一般用在对话框中。在我看来Tab控件本身并不复杂,其实也就是一组简单的按钮而已,因为它并不能直接对各个选项卡进行操纵。我们需要对用户选择选项卡的行为进行手工地响应

比如你希望对每一个选项卡显示不同的内容,你必须通过显示/隐藏不需要的内容。当每一个选项卡上的内容较多时,可以把这些内容放在一个容器里,比如一个对话框。这样,一个选项卡对应一个对话框,关系比较清晰。这些对话框应设置为没有标题栏、Child风格、无边框的、非模式的。以此为例,对话框中使用Tab控件的步骤是

1.在对话框中添加Tab控件

2.为各选项卡建立对话框模板资源

3.响应Tab控件的TCN_SELCHANGE消息,在OnSelChange()函数中,用ShowWindow()函数显示欲显示的选项卡,隐藏其他。非模式对话框的生存期问题这里仍然存在,不可忽视

4.初始化Tab控件。可在对话框初始化时手工调用OnSelChange()函数的方法来实现.


下面使用使用CTabCtrl或CPropertySheet实现标签页:

CTabCtrl

1.先建立一个MFC应用程序,然后在资源管理器中新建一对话框,并为它建立对应的类,然后从工具箱里面把Tab Control控件放入该对话框中。

再在对话框类中,声明一个CTabCtrl变量:

CTabCtrl m_tab;

变量m_tab用来与对话框中的Tab Control控件交互,为此要在DoDataExchange函数中加入DDX_Control语句:

DDX_Control(pDX, IDC_TAB_NEW, m_tab);

IDC_TAB_NEW是Tab Control控件的ID。

2.建立两个新对话框,用来当做Tab Control控件的两个页。别忘了把Style改为Child,Border改为None。然后就可以在上面加其他控件了。

接着分别为这两个对话框建立两个类,比如CPage1和CPage2。

然后在对话框类头文件中,加入这两个对话框对象。同时增加一个变量int m_CurSelTab,用了表明是哪个Page即将被切换。

int m_CurSelTab; 
CPage1 m_page1; 
CPage2 m_page2; 
CDialog* pDialog[2];  //用来保存对话框对象指针

在对话框类的初始化函数中需要把CPage1、CPage2和Tab Control关联起来,并保存页面地址,设置初始页面。

//为Tab Control增加两个页面  
m_tab.InsertItem(0, _T("Farm"));  
m_tab.InsertItem(1, _T("Note"));  
  
//创建两个对话框  
m_page1.Create(IDD_DIALOG1, &m_tab);  
m_page2.Create(IDD_DIALOG2, &m_tab);  
  
//设定在Tab内显示的范围  
CRect rc;  
m_tab.GetClientRect(rc);  
rc.top += 20;  
  
m_page1.MoveWindow(&rc);  
m_page2.MoveWindow(&rc);  
  
//把对话框对象指针保存起来  
pDialog[0] = &m_page1;  
pDialog[1] = &m_page2;  
  
//显示初始页面  
pDialog[0]->ShowWindow(SW_SHOW);  
pDialog[1]->ShowWindow(SW_HIDE);  
  
//保存当前选择  
m_CurSelTab = 0;

这里我们用了一个CDialog指针数组来进行保存Tab Control的每个页,数组的大小是Tab Control页面的个数,数组下标对应着每个页面的索引(这样方便快速存取)。接下来,为Tab Control添加消息处理程序:

ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_NEW, &CTabDlg::OnTcnSelchangeTabNew)

void CTabDlg::OnTcnSelchangeTabNew(NMHDR *pNMHDR, LRESULT *pResult)  
  
{  
    //把当前的页面隐藏起来   
    pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);  
  
    //得到新的页面索引   
    m_CurSelTab = m_tab.GetCurSel();  
  
    //把新的页面显示出来   
    pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);  
    *pResult = 0;  
}

3.如果要在Tab Control控件外面获取其内部对话框中控件的数据,就需要使用DDX/DDV机制,还要调用相应的UpdateData函数。

m_page1.UpdateData(); 

m_page2.UpdateData();


CPropertySheet

1.先建立MFC应用程序然后在资源管理器中新建一对话框,并为它建立对应的类,在编辑该对话框,可以自由加一些所需的控件,但得留出一定的空间用于放至

标签页。在主对话框类里加入一个CPropertySheet类的一个成员变量m_sheet代表整个标签页。

2.接着分别为创建两个对话框,建立两个与之对应的类时,注意选择基类为CPropertyPage。假设新生成两个类为CPage1,CPage2。

3.在刚才加入m_sheet成员的位置,加入上述类型成员变量m_page1,m_page2。

CPropertySheet m_sheet;

CPage1        m_page1;

Cpage2         m_page2;

在主对话框类的OnInitDialog()函数中加入:

//加入标签,标签名由各个子对话框的标题栏决定   
m_sheet.AddPage(&m_page1);  
m_sheet.AddPage(&m_page2);  
  
//对修改标签页title   
m_page1.m_psp.dwFlags|=PSP_USETITLE;   
m_page1.m_psp.pszTitle= "标签页A";   
  
m_page2.m_psp.dwFlags|=PSP_USETITLE;   
m_page2.m_psp.pszTitle= "标签页B";   
  
//用Create来创建一个属性页   
m_sheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);  
  
//调整m_sheet位置   
RECT rect;  
GetWindowRect(&rect);  
m_sheet.MoveWindow(&rect);



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC类目录及头文件 类 描述 头文件 CAnimateCtrl 自动化通用控件 afxcmn.h CArchive afx.h CArchiveException afx.h CArray afxtempl.h CAsyncMonikerFile 在ActiveX控件提供对异步标记的支持 afxole.h CAsyncScoket 封装Windows Sockets API,参看CSocket afxsock.h CBitmap afxwin.h CBitmapButton afxext.h CBrush afxwin.h CButton 按钮控件对象 afxwin.h CByteArray afxcoll.h CCachedDataPathProperty 允许一个ActiveX控件异步传输属性数据和缓冲内存的数据,参考CDataPathProperty afxctl.h CCheckListBox afxwin.h CClientDC afxwin.h CCmdTarget 所有能够接收和响应消息的对象的基类 afxwin.h CCmdUI afxwin.h CColorDialog 颜色选择的通用对话框,提供为显示系统定义的颜色列表 afxdlgs.h CComboBox 组合框对象 afxwin.h CComboBoxEx CComboBox类的派生类,用于支持在组合框控件的图像列表 afxcmn.h CCommandLineInfo afxwin.h CCommonDialog afxdlgs.h CConnectionPoint afxdisp.h CControlBar afxext.h CCreateContext afxext.h CCriticalSection afxmt.h CCtrlView afxwin.h CDaoDatabase afxdao.h CDaoException afxdao.h CDaoFieldExchange afxdao.h CDaoQueryDef afxdao.h CDaoRecordset 代表选自数据源的记录集。CDaoRecordset对象可用于三种格式:表类型记录集,动态集类型记录集和快照类型记录集 afxdao.h CDaoRecordView 提供表单视图,以在控件显示数据库记录。表单视图是CDaoRecordset对象的一部分。参考CFormView和CRecordView afxdao.h CDaoTableDef afxdao.h CDaoWorkspace afxdao.h CDatabase afxdb.h CDataExchange afxwin.h CDataPathProperty 实现一个ActiveX控件属性,它能够异步加载其数据。这个类允许ActiveX控件在后台下载属性数据时被激活 afxctl.h CDateTimeCtrl 封装新的日期/时间选取器控件 afxdtctl.h CDBException afxdb.h CDBVariant afxdb.h CDC afxwin.h CDialog 用于包含控件窗口的对话框对象 afxwin.h CDialogBar afxext.h CDocItem afxole.h CDockState afxadv.h CDocObjectServer afxdocob.h CDocObjectServerItem afxdocob.h CDocTemplate afxwin.h CDocument 用于管理程序的数据的类 afxwin.h CDragListBox Windows列表框,允许用户把其的项拖放到不同的位置 afxcmn.h CDumpContext afx.h CDWordArray afxcoll.h CEdit 用于文本输入的子窗口控件 afxwin.h CEditView 提供Windows编缉控件的功能。因为CEditView派生于Cedit,该对象可同文件和文件模板一同使用 afxext.h CEvent afxmt.h CException afx.h CFieldExchange afxdb.h CFile afx.h CFileDialog 通用文件对话框,提供Open和Save As对话框的功能 afxdlgs.h CFileException afx.h CFileFind afx.h CFindReplaceDialog afxdlgs.h CFont afxwin.h CFontDialog 通用字体对话框,用于显示当前已装入系统的字体列表 afxdlgs.h CFontHolder afxctl.h CFormView 包含对话框控件的窗口 afxext.h CFrameWnd SDI(单窗口界面)框架窗口 afxwin.h CFtpConnection afxinet.h CFtpFileFind afxinet.h CGdiObject afxwin.h CGopherConnection afxinet.h CGopherFile afxinet.h CGopherFileFind afxinet.h CGopherLocator afxinet.h CHeaderCtrl 标题通用控件 afxcmn.h CHotKeyCtrl 热键通用控件 afxcmn.h CHtmlStream afxisapi.h CHtmlView 实现Web Browser控件的视图类,能够访问当地或Web上的HTML文件。 afxhtml.h CHttpConnection afxinet.h CHttpFile afxinet.h CHttpFilter 创建并处理超文传输协议过滤器对象,该对象用于过滤用于HTTP请求的服务器通知 afxisapi.h CHttpFilterContext afxisapi.h CHttpServer Internet Server API(ISAPI)的包装类 afxisapi.h CHttpServerContext afxisapi.h CImageList afxcmn.h CInternetConnection afxinet.h CInternetException afxinet.h CInternetFile afxinet.h CInternetSession afxinet.h CIPAddressCtrl IP地址控件。类似于编缉框,该控件接收Internet 协议格式的地址 afxcmn.h CList afxtempl.h CListBox 列表框对象 afxwin.h CListCtrl 列表视通用控件 afxcmn.h ClistView 简化CListCtrl的使用,添加了对文件和视图的支持 afxcview.h CLongBinary afxdb_.h CMap afxtempl.h CMapPtrToPtr afxcoll.h CMapPtrToWord afxcoll.h CMapStringToOb afxcoll.h CMapStringToPtr afxcoll.h CMapStringToString afxcoll.h CMapWordToOb afxcoll.h CMapWordToPtr afxcoll.h CMDIChildWnd MDI(多文档界面)子框架窗口 afxwin.h CMDIFrameWnd afxwin.h CMemFile afx.h CMemoryException afx.h CMemoryState CMenu afxwin.h CMetaFileDC afxext.h CMiniFrameWnd 半高的框架窗口,主要用于浮动工具栏。一个小框架窗口没有最小化和最大化按钮,但其他都类似于正常的框架窗口 afxwin.h CMonikerFile afxole.h CMonthCalCtrl 月历控件,用于显示一个用户可选择日期的日历 afxdtctl.h CMultiDocTemplate afxwin.h CMultiLock afxmt.h CMutex afxmt.h CNotSupportedException afx.h CObArray afxcoll.h CObject afx.h CObList afxcoll.h COleBusyDialog afxodlgs.h COleChangeIconDialog afxodlgs.h COleChangeSourceDialog afxodlgs.h COleClientItem afxole.h COleCmdUI afxdocob.h COleControl afxctl.h COleControlModule afxctl.h COleConvertDialog afxodlgs.h COleCurrency afxdisp.h COleDataObject afxole.h COleDataSource afxole.h COleDateTime afxdisp.h COleDateTimeSpan afxdisp.h COleDBRecordView afxoledb.h COleDialog afxodlgs.h COleDispatchDriver afxdisp.h COleDispatchException afxdisp.h COleDocObjectItem afxole.h COleDocument 把一个文件看作为CDocItem对象的一个集合。包容器和服务器都需要这个结构,因为它们的文件必须能够包含OLE项 afxole.h COleDropSource afxole.h COleDropTarget afxole.h COleException afxdisp.h COleInsertDialog afxodlgs.h COleIPFrameWnd afxole.h COleLinkingDoc OLE包容器文件的基类,这些文件支持对它们所包含项的链接 afxole.h COleLinksDialog afxodlgs.h COleMessageFilter afxole.h COleObjectFactory afxdisp.h COlePasteSpecialDialog afxodlgs.h COlePropertiesDialog afxodlgs.h COlePropertyPage afxctl.h COleResizeBar afxole.h COleSafeArray afxdisp.h COleServerDoc OLE服务器文件的基类 afxole.h COleServerItem 为OLE项提供一个服务器界面 afxole.h COleStreamFile afxole.h COleTemplateServer afxdisp.h COleUpdateDialog afxodlgs.h COleVariant afxdisp.h CPageSetupDialog afxdlgs.h CPaintDC afxwin.h CPalette afxwin.h CPen afxwin.h CPictureHolder afxctl.h CPoint atltypes.h CPrintDialog 通用打印对话框,提供Print和Print Setup对话框的功能 afxdlgs.h CPrintInfo CProgressCtrl 通用进程指示器控件 afxcmn.h CPropertyPage 代表属性表单的一页 afxdlgs.h CPropertyPageEx CPropertySheet 属性表,也叫做多选项卡对话框。一个属性表由一个CPropertySheet对象和几个CPropertyPage对象组成 afxdlgs.h CPropertySheetEx CPropExchange afxctl.h CPtrArray afxcoll.h CPtrList afxcoll.h CReBar afxext.h CReBarCtrl afxcmn.h CRecentFileList afxadv.h CRecordset 用于访问数据库表或查询的类 afxdb.h CRecordView 包含对话框控件的窗口 afxdb.h CRect atltypes.h CRectTracker afxext.h CResourceException afxwin.h CRgn afxwin.h CRichEditCntrItem afxrich.h CRichEditCtrl 用户能够输入和编缉文本的窗口,提供字符和程序段格式,以及对嵌入OLE项的支持 afxcmn.h CRichEditDoc afxrich.h CRichEditView afxrich.h CRuntimeClass CScrollBar 滚动条对象 afxwin.h CScrollView 可滚动的窗口,派生于CView afxwin.h CSemaphore afxmt.h CSharedFile afxadv.h CSingleDocTemplate afxwin.h CSingleLock afxmt.h CSize atltypes.h CSliderCtrl 提供包含一个滑块和可选的刻度线的窗口 afxcmn.h CSocket Windows Socket API的包装类 afxsock.h CSocketFile afxsock.h CSpinButtonCtrl 提供箭头按钮,用户可单击它,以增加或减少某个控件的一个值 afxcmn.h CSplitterWnd afxext.h CStatic 用于标识另一个控件或给用户提供消息的简单文本框 afxwin.h CStatusBar afxext.h CStatusBarCtrl 提供一个层次窗口,通常放于父窗口的底部,用于显示关于应用程序的状态信息 afxcmn.h CStdioFile afx.h CString afx.h CStringArray afxcoll.h CStringList afxcoll.h CSyncObject afxmt.h CTabCtrl 允许应用程序在一个窗口或对话框的同一区域显示多个页面 afxcmn.h CTime afx.h CTimeSpan afx.h CToolBar afxext.h CToolBarCtrl 工具栏通用控件 afxcmn.h CToolTipCtrl 提供工具提示控件的功能,它以一个小弹出窗口的样子显示,包含描述某个工具用途的一行文本 afxcmn.h CTreeCtrl 显示项的分层结构列表 afxcmn.h CTreeView 简化CTreeCtrl的用法 afxcview.h CTypedPtrArray afxtempl.h CTypedPtrList afxtempl.h CTypedPtrMap afxtempl.h CUIntArray afxcoll.h CUserException afxwin.h CView 用于显示程序数据的类 afxwin.h CWaitCursor afxwin.h CWinApp afxwin.h CWindowDC afxwin.h CWinThread 代表一个应用程序的一个线程 afxwin.h CWnd afxwin.h CWordArray afxcoll.h ......

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值