您的位置:首页 > 其它

MFC总结(3)---MFC中TabControl控件的使用(使用封装)

2015-10-23 14:09 633 查看
1、创建一个mfc项目,在自动生成的对话框模板中,删除“TODO: Place dialog controls here.”静态文本框、“OK”按钮和“Cancel”按钮。

2、添加一个Tab Control控件,创建一个CTabCtrl的子类CMyTablCtrl,并为其关联一个CMyTabCtrl类型的控件变量m_tab。





3、创建两个对话框,ID分别设为IDD_PROGRAM_DIALOG、IDD_PROCESS_DIALOG,两者都将Border属性设为None,Style属性设为Child。在对话框模板IDD_PROGRAM_DIALOG中加入一个List Control控件,ID设置为IDC_PROGRAM_LIST ,View属性设为Report,即为报表风格,Single Selection属性设为True,并为其生成对话框类CProgramDlg;在对话框模板IDD_PROCESS_DIALOG中也加入一个List
Control控件,ID设置为IDC_PROCESS_LIST ,View属性设为Report,即为报表风格,Single Selection属性设为True,并为其生成对话框类CProcessDlg。

4、在MyTablCtrl.h中,添加三个方法一个变量。代码如下

#pragma once
#include <vector>

using std::vector;

// CMyTabCtrl

class CMyTabCtrl : public CTabCtrl
{
DECLARE_DYNAMIC(CMyTabCtrl)

public:
<span style="white-space:pre">	</span>CMyTabCtrl();
<span style="white-space:pre">	</span>virtual ~CMyTabCtrl();

<span style="white-space:pre">	</span>//添加Tab的方法
<span style="white-space:pre">	</span>void  AddTab(DWORD dwCount, ...);

<span style="white-space:pre">	</span>//添加Dlg方法
<span style="white-space:pre">	</span>void AddDlg(DWORD dwCount, ...);

<span style="white-space:pre">	</span>//显示当前tab的方法
<span style="white-space:pre">	</span>void SetSelAndShow(int nSel);

<span style="white-space:pre">	</span>//存放Dlg
<span style="white-space:pre">	</span>vector<CDialogEx *> m_vt;

protected:
<span style="white-space:pre">	</span>DECLARE_MESSAGE_MAP()
};


5、在MyTabCtrl.cpp中对上述方法进行实现。

//添加tab的方法
void   CMyTabCtrl::AddTab(DWORD dwCount, ...)
{
va_list ap;
va_start(ap, dwCount);

//遍历添加
for (DWORD i = 0; i < dwCount; i++)
{
TCHAR * tName = va_arg(ap, TCHAR*);
InsertItem(i, tName);
}
va_end(ap);

}

//添加Dlg方法
void  CMyTabCtrl::AddDlg(DWORD dwCount, ...)
{
va_list ap;
va_start(ap, dwCount);

for (DWORD i = 0; i < dwCount; i++)
{
CDialogEx *pName = va_arg(ap, CDialogEx*);
int id = va_arg(ap, int);
pName->Create(id, this);
m_vt.push_back(pName);
}
va_end(ap);
}

//显示当前tab的方法
void  CMyTabCtrl::SetSelAndShow(int nSel)
{
CRect  rect;
GetClientRect(&rect);
rect.DeflateRect(1, 26, 3, 2);
m_vt[nSel]->MoveWindow(rect);
m_vt[nSel]->ShowWindow(SW_SHOW);
SetCurSel(nSel);
}
6、在 BOOL C任务管理器Dlg::OnInitDialog()中使用上面定义好的方法。

BOOL C任务管理器Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

。。。。。。
SetIcon(m_hIcon, TRUE);			// 设置大图标
SetIcon(m_hIcon, FALSE);		// 设置小图标

// TODO:  在此添加额外的初始化代码

//添加Tab标题
m_tab.AddTab(2, _T("应用程序"), _T("进程"));

//添加Dlg
m_tab.AddDlg(2, new CProgramDlg, IDD_PROGRAM_DIALOG, new CProcessDlg, IDD_PROCESS_DIALOG );

//显示第一个Dlg
m_tab.SetSelAndShow(0);

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


7. 我们要实现的是标签页的切换效果,所以还要为m_tab标签控件的通知消息TCN_SELCHANGE添加处理函数,并修改如下:



void CMyTabCtrl::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO:  在此添加控件通知处理程序代码
*pResult = 0;

int n = GetCurSel();

CRect rt;
GetClientRect(&rt);
rt.DeflateRect(1, 26, 3, 2);

for (int i = 0; i < m_vt.size(); i++)
{
if (i == n)
{
m_vt[i]->MoveWindow(rt);
m_vt[i]->ShowWindow(SW_SHOW);
}
else
{
m_vt[i]->ShowWindow(SW_HIDE);
}
}
}


案例完整代码:
http://download.csdn.net/detail/obuyiseng/9208389
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: