在编程的时候我们经常要用到TAB控件,然而在很多情况我们并不确定究竟要添加几个TAB页面,而是在程序运行中动态添加页面,而且每个页面里面可能都包含其它控件,比如页面包含有一个LISTBOX的控件,当用户选择不同的TAB标签时将显示对应的页面,并且用户可以根据自己的意愿任意添加和删除TAB页面.
实现思路:利用单链表的数据结构实现TAB页面与LISTBOX的一一对应.首先新建立一个FORMVIEW的对话框资源,类名为CExAnsyTabFV(因为在下是在做一个小东西的时候用到了这个,所以就直接拿了那里的代码,懒得去改,命名有点麻烦,请谅解^_^).
然后添加3个成员变量int m_TabNumber;//记录TAB页面编号
CExAnsyTabFV *m_pNext;//指向下一个FORMVIEW的指针
CListBox m_ExAnsyTabList//ListBox控件显示对应TAB页面的内容
再新建一个对话框资源,添加一个TAB控件,一个添加页面和一个删除页面的按钮,命名为ExDataAnsyDlg.初始化时建立一个CExAnsyTabFV类的表头,令m_TabNumber=-1;m_pNext=NULL,当用户单击添加页面时,新建一个CExAnsyTabFV的节点,并设置其编号与TAB页面的编号相同,再链到表尾即可.当用户删除页面时只要删除TAB页面对应的节点即可.
具体实现:
下面代码实现的主要功能是,通过选择TREE控件内的项目,可以把相应的内容添加到对应的TAB页面中去,并显示在LISTBOX列表框内,并在编辑框中显示标题,通过改变编辑框的标题从而改变TAB页面的标题.此外,用户可以自由添加和删除TAB页面.
注:为简单起见,下面写出的代码只是提供了具体的实现方法.大家可以根据自己的实际情况进行改写.
(嘿嘿,大深夜了写下这个错误可能在所难免,或者注释有很多地方不详细,望各位网友包涵,敬请批评,在下一定改正@_@~)
//CExAnsyTabFV类的定义
class CExAnsyTabFV : public CDialog
{
// Construction
public:
int m_TabNumber;
CExAnsyTabFV *m_pNext;
CExAnsyTabFV(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CExAnsyTabFV)
enum { IDD = IDD_EXANSY_FORMVIEW };
CListBox m_ExAnsyTabList;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CExAnsyTabFV)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CExAnsyTabFV)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//CExDataAnsyDlg的定义.
//包括TAB控件,TREE控件(向LISTBOX里添加内容),2个BUTTON,一个EDIT控件(显示和改变TAB页面标题)
class CExDataAnsyDlg : public CDialog
{
// Construction
public:
void AutoExAnsyTabTilte(CExAnsyTabFV *pActiveFV);
CString GetExAnsyTabTitle(int nPos);
void ChangeExAnsyTabTitle(int nPos,CString sTitle);
void DoTabShow(int nSel);
int m_MaxShtNum;
CImageList *m_pImageListTab;
CExAnsyTabFV *m_pHeadFV;//CExAnsyTabFV链表头指针
CExAnsyTabFV *m_pTailFV;//CExAnsyTabFV链表尾指针
CExAnsyTabFV *m_pCurFV;//CExAnsyTabFV链表当前指针
CImageList m_ImageList;
HTREEITEM m_TreeRoot;//TREE根节点
CExDataAnsyDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CExDataAnsyDlg)
enum { IDD = IDD_EXDATAANSY_DIALOG };
CTabCtrl m_ExAnsyTab;//TAB控件
CTreeCtrl m_ExAnsyTree;//TREE控件
CString m_m_ExAnsySheetTitleEdit;//CEDIT的变量
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CExDataAnsyDlg)
protected:
virtual void DoDataExchange