设为首页 加入收藏

TOP

在VC对话框中加入属性页
2013-04-24 12:11:21 】 浏览:401
Tags:对话 加入 属性

 

但是这样也有一些缺陷:主对话框不能处理属性页上标签的消息,即点击标签时无法通知主对话框。(可能笔者水平有限,理论上应该可以,但笔者尚未解决这个问题)

方案五

方案的例子请见源代码打包文件中的Property5部分

这次我们仍然要使用Tab Control,并且从CTabCtrl控件类继承自己的类(CTabSheet)来处理。(此方法来自CodeGuru的一篇文章,本人稍做修改使其使用更简便)

首先我先介绍一下如何使用CTabSheet。

先要制作子对话框类,这次的子对话框类不要从CPropertyPage继承,而是直接从CDialog继承。并且各个子对话框资源的属性应设置为:Style为Child, Border为None。

在主对话框资源中,加入一个Tab Control,并且适当调整位置和大小。利用ClassWizard来为这个Tab Control创建一个CTabSheet的控件变量。

在主对话框的OnInitDialog()加入:

m_sheet.AddPage("tab1", &m_page1, IDD_DIALOG1);

m_sheet.AddPage("tab2", &m_page2, IDD_DIALOG2);

m_sheet.Show();

就这样就可以在对话框上制作出一个完美的属性页了。效果和上图完全一样。

下面我就来讲讲CTabSheet类的细节内容。

CTabSheet是从CTabCtrl继承来的,用于Tab Control的控件类。在类中有一个成员变量用来记录各子对话框的指针CDialog* m_pPages[MAXPAGE]; MAXPAGE是该类所能加载的标签的最大值。

类中有一个AddPage方法,用于记录子对话框的指针和所使用对话框资源的ID号。

BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)

{

if( MAXPAGE == m_nNumOfPages )

return FALSE;

//保存目前总的子对话框数

m_nNumOfPages++;

//记录子对话框的指针、资源ID、要在标签上显示的文字

m_pPages[m_nNumOfPages-1] = pDialog;

m_IDD[m_nNumOfPages-1] = ID;

m_Title[m_nNumOfPages-1] = title;

return TRUE;

}

在使用AddPage加入了若干子对话框后,必须调用CTabSheet的Show方法来真正生成标签和子对话框。

void CTabSheet::Show()

{

//利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签

for( int i=0; i < m_nNumOfPages; i++ )

{

m_pPages[i]->Create( m_IDD[i], this );

InsertItem( i, m_Title[i] );

}

//由于对话框显示时默认的是第一个标签被选中,所以应该让第一个子对话框显示,其他子对话框隐藏

m_pPages[0]->ShowWindow(SW_SHOW);

for( i=1; i < m_nNumOfPages; i++)

m_pPages[i]->ShowWindow(SW_HIDE);

SetRect();

}

生成好标签和子对话框后,调用CTabSheet::SetRect来计算并调整属性页的大小。

void CTabSheet::SetRect()

{

CRect tabRect, itemRect;

int nX, nY, nXc, nYc;

//得到Tab Control的大小

GetClientRect(&tabRect);

GetItemRect(0, &itemRect);

//计算出各子对话框的相对于Tab Control的位置和大小

nX=itemRect.left;

nY=itemRect.bottom+1;

nXc=tabRect.right-itemRect.left-2;

nYc=tabRect.bottom-nY-2;

//利用计算出的数据对各子对话框进行调整

m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);

for( int nCount=1; nCount < m_nNumOfPages; nCount++ )

m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);

}

在单击标签栏后,应该是相应的子对话框显示,正在显示的子对话框应该隐藏。因此利用ClassWizard来处理WM_LBUTTONDOWN消息。

void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point)

{

CTabCtrl::OnLButtonDown(nFlags, point);

//判断是否单击了其他标签

if(m_nCurrentPage != GetCurFocus())

{

//将原先的子对话框隐藏

m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);

m_nCurrentPage=GetCurFocus();

//显示当前标签所对应的子对话框

m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);

}

}

这样利用CTabSheet这个类就可以轻松地在对话框上放置自己的属性页了,并且控件都分散在各子对话框类中,符合对象封装的思想。而且用这个方法来制作属性页就可以利用ClassWizard来轻松地生成消息映射处理Tab Control的消息了。例如:可以处理TCN_SELCHANGE消息来对切换了标签时进行一些动作。

void CTabSheet::Show()

{

/利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签

for( int i=0; i < m_nNumOfPages; i++ )

{

m_pPages[i]->Create( m_IDD[i], this );

InsertItem( i, m_Title[i] );

}

//由于对话框显示时默认的是第一个标签被选中,所以应该让第一个子对话框显示,其他子对话框隐藏

m_pPages[0]->ShowWindow(SW_SHOW);

for( i=1; i < m_nNumOfPages; i++)

m_pPages[i]->ShowWindow(SW_HIDE);

SetRect();

}

生成好标签和子对话框后,调用CTabSheet::SetRect来计算并调整属性页的大小。

void CTabSheet::SetRect()

{

CRect tabRect, itemRect;

int nX, nY, nXc, nYc;

//得到Tab Control的大小

GetClientRect(&tabRect);

GetItemRect(0, &itemRect);

//计算出各子对话框的相对于Tab Control的位置和大小

nX=itemRect.left;

nY=itemRect.bottom+1;

nXc=tabRect.right-itemRect.left-2;

nYc=tabRect.bottom-nY-2;

//利用计算出的数据对各子对话框进行调整

m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);

for( int nCount=1; nCount < m_nNumOfPages; nCount++ )

m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);

}

在单击标签栏后,应该是相应的子对话框显示,正在显示的子对话框应该隐藏。因此利用ClassWizard来处理WM_LBUTTONDOWN消息。

void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point)

{

CTabCtrl::OnLButtonDown(nFlags, point);

//判断是否单击了其他标签

if(m_nCurrentPage != GetCurFocus())

{

//将原先的子对话框隐藏

m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);

m_nCurrentPage=GetCurFocus();

//显示当前标签所对应的子对话框

m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);

}

}

这样利用CTabSheet这个类就可以轻松地在对话框上放置自己的属性页了,并且控件都分散在各子对话框类中,符合对象封装的思想。而且用这个方法来制作属性页就可以利用ClassWizard来轻松地生成消息映射处理Tab Control的消息了。例如:可以处理TCN_SELCHANGE消息来对切换了标签时进行一些动作。

本文共使用了5种方法在对话框中加属性页,当然应该还有其他方法,当本人水平有限,如果各位读者有更好的方法,可不要忘了告诉我。

      

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC++ 编程实现开机自启动 下一篇??VC??????м????????

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目