第一步:
建立对话框工程,在对话框加入Tab Control控件,并为这个控制创建控件变量,如:CTabCtrl m_tab_mode;
第二步:
在资源视图中加入对话框资源做为Tab Control的子页面,修改style属性为Child,border属性为None.完成这些后为这个子页面添加相对应的类.这样就可以加入去Tab Control中去了.如这里的类名分别为:CWarnPage,CRemoteCtrlPage,CRemoteDiagPage,CAVPage.
第三步:
在主对话框的头文件中包含子页面的头文件,并建立子页面的成员变量.
CWarnPage m_warn_page; //警告页面
CRemoteCtrlPage m_remote_control_page; //远程控制页面
CRemoteDiagPage m_remote_diag_page; //远程诊断页面
CAVPage m_av_page; //数据流页面
建立一页面数组用来维护Tab Control的切换:
CDialog *m_pPage[4];
建立一成员变量用来保存当前Tab Control的当前选择状态:
int m_cur_mode_sel;
第四步:
在主对话框的初始化函数为Tab Control加载子页面:
//为TAB添加page
m_tab_mode.InsertItem(0,"报警");
m_tab_mode.InsertItem(1,"远程控制");
m_tab_mode.InsertItem(2,"远程诊断");
m_tab_mode.InsertItem(3,"数据流");
//默认TAB MODE显示警告页面
m_cur_mode_sel =TAB_MODE_WARN;
m_tab_mode.SetCurSel(m_cur_mode_sel);
//创建报警页面
m_warn_page.Create(IDD_DLG_WARN,&m_tab_mode);
m_pPage[0] =&m_warn_page;
//创建远程控制页面
m_remote_control_page.Create(IDD_DLG_REMOTE_CTRL,&m_tab_mode);
m_pPage[1] =&m_remote_control_page;
//创建远程诊断页面
m_remote_diag_page.Create (IDD_DLG_REMOTE_DIAG,&m_tab_mode);
m_pPage[2] =&m_remote_diag_page;
//创建数据流页面
m_av_page.Create (IDD_DLG_AV,&m_tab_mode);
m_pPage[3] =&m_av_page;
//设定显示在Tab范围内
CRect rc;
m_tab_mode.GetClientRect(rc); //获取当前tab控件和客户区域
//调整rc的区域以匹配报警页面
rc.top +=21;
rc.bottom -=2;
rc.left +=2;
rc.right -=1;
m_warn_page.MoveWindow(&rc); //移到报警页面到rc区域
m_warn_page.ShowWindow(SW_SHOW); //显示报警页面
//m_warn_page.ShowWindow(SW_HIDE); //隐藏报警页面
m_remote_control_page.MoveWindow(&rc); //移到远程控制页面到rc区域
//m_remote_control_page.ShowWindow(SW_SHOW); //显示远程控制页面
m_remote_control_page.ShowWindow(SW_HIDE); //隐藏远程控制页面
m_remote_diag_page.MoveWindow(&rc); //移到远程诊断页面到rc区域
//m_remote_diag_page.ShowWindow(SW_SHOW); //显示远程诊断页面
m_remote_diag_page.ShowWindow(SW_HIDE); //隐藏远程诊断页面
m_av_page.MoveWindow(&rc); //移到数据流页面到rc区域
//m_av_page.ShowWindow(SW_SHOW); //显示数据流页面
m_av_page.ShowWindow(SW_HIDE); //隐藏数据流页面
UpdateData(false);
第五步:
添加Tab Control添加SelChange响应事件处理函数:
void Ctbox_CarSimulatorDlg::OnTcnSelchangeTbMode(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
int cur_sel =m_tab_mode.GetCurSel();
if(m_cur_mode_sel !=cur_sel){
m_pPage[m_cur_mode_sel]->ShowWindow(SW_HIDE);
m_pPage[cur_sel]->ShowWindow(SW_SHOW);
m_cur_mode_sel =cur_sel;
}
*pResult = 0;
}
如此即可在Tab Control中添加Dialog的页面了.
参考源码:
tbox_CarSimulatorDlg.h:
// tbox_CarSimulatorDlg.h : header file
//
#pragma once
#include "afxcmn.h"
#include "WarnPage.h"
#include "RemoteCtrlPage.h"
#include "RemoteDiagPage.h"
#include "AVPage.h"
#define TAB_MODE_WARN 0
#define TAB_MODE_REMOTE_CONTRL 1
#define TAB_MODE_REMOTE_DIAG 2
#define TAB_MODE_AV 3
// Ctbox_CarSimulatorDlg dialog
class Ctbox_CarSimulatorDlg : public CDialogEx
{
// Construction
public:
Ctbox_CarSimulatorDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
enum { IDD = IDD_TBOX_CARSIMULATOR_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
int m_channel_sel;
CTabCtrl m_tab_mode;
CWarnPage m_warn_page; //警告页面
CRemoteCtrlPage m_remote_control_page; //远程控制页面
CRemoteDiagPage m_remote_diag_page; //远程诊断页面
CAVPage m_av_page; //数据流页面
int m_cur_mode_sel;
CDialog *m_pPage[4];
afx_msg void OnBnClickedBtReset();
afx_msg void OnTcnSelchangeTbMode(NMHDR *pNMHDR, LRESULT *pResult);
};
tbox_CarSimulatorDlg.cpp:
// tbox_CarSimulatorDlg.cpp : implementation file
//
#include "stdafx.h"
#include "tbox_CarSimulator.h"
#include "tbox_CarSimulatorDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// Ctbox_CarSimulatorDlg dialog
Ctbox_CarSimulatorDlg::Ctbox_CarSimulatorDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(Ctbox_CarSimulatorDlg::IDD, pParent)
, m_channel_sel(0)
, m_cur_mode_sel(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_TBOX);
}
void Ctbox_CarSimulatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_CBIndex(pDX, IDC_CB_CHANNEL, m_channel_sel);
DDX_Control(pDX, IDC_TB_MODE, m_tab_mode);
}
BEGIN_MESSAGE_MAP(Ctbox_CarSimulatorDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BT_RESET, &Ctbox_CarSimulatorDlg::OnBnClickedBtReset)
ON_NOTIFY(TCN_SELCHANGE, IDC_TB_MODE, &Ctbox_CarSimulatorDlg::OnTcnSelchangeTbMode)
END_MESSAGE_MAP()
// Ctbox_CarSimulatorDlg message handlers
BOOL Ctbox_CarSimulatorDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//默认选择第1路CAN
m_channel_sel =0;
//为TAB添加page
m_tab_mode.InsertItem(0,"报警");
m_tab_mode.InsertItem(1,"远程控制");
m_tab_mode.InsertItem(2,"远程诊断");
m_tab_mode.InsertItem(3,"数据流");
//默认TAB MODE显示警告页面
m_cur_mode_sel =TAB_MODE_WARN;
m_tab_mode.SetCurSel(m_cur_mode_sel);
//创建报警页面
m_warn_page.Create(IDD_DLG_WARN,&m_tab_mode);
m_pPage[0] =&m_warn_page;
//创建远程控制页面
m_remote_control_page.Create(IDD_DLG_REMOTE_CTRL,&m_tab_mode);
m_pPage[1] =&m_remote_control_page;
//创建远程诊断页面
m_remote_diag_page.Create (IDD_DLG_REMOTE_DIAG,&m_tab_mode);
m_pPage[2] =&m_remote_diag_page;
//创建数据流页面
m_av_page.Create (IDD_DLG_AV,&m_tab_mode);
m_pPage[3] =&m_av_page;
//设定显示在Tab范围内
CRect rc;
m_tab_mode.GetClientRect(rc); //获取当前tab控件和客户区域
//调整rc的区域以匹配报警页面
rc.top +=21;
rc.bottom -=2;
rc.left +=2;
rc.right -=1;
m_warn_page.MoveWindow(&rc); //移到报警页面到rc区域
m_warn_page.ShowWindow(SW_SHOW); //显示报警页面
//m_warn_page.ShowWindow(SW_HIDE); //隐藏报警页面
m_remote_control_page.MoveWindow(&rc); //移到远程控制页面到rc区域
//m_remote_control_page.ShowWindow(SW_SHOW); //显示远程控制页面
m_remote_control_page.ShowWindow(SW_HIDE); //隐藏远程控制页面
m_remote_diag_page.MoveWindow(&rc); //移到远程诊断页面到rc区域
//m_remote_diag_page.ShowWindow(SW_SHOW); //显示远程诊断页面
m_remote_diag_page.ShowWindow(SW_HIDE); //隐藏远程诊断页面
m_av_page.MoveWindow(&rc); //移到数据流页面到rc区域
//m_av_page.ShowWindow(SW_SHOW); //显示数据流页面
m_av_page.ShowWindow(SW_HIDE); //隐藏数据流页面
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
}
void Ctbox_CarSimulatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void Ctbox_CarSimulatorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR Ctbox_CarSimulatorDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void Ctbox_CarSimulatorDlg::OnBnClickedBtReset()
{
// TODO: Add your control notification handler code here
}
void Ctbox_CarSimulatorDlg::OnTcnSelchangeTbMode(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
int cur_sel =m_tab_mode.GetCurSel();
if(m_cur_mode_sel !=cur_sel){
m_pPage[m_cur_mode_sel]->ShowWindow(SW_HIDE);
m_pPage[cur_sel]->ShowWindow(SW_SHOW);
m_cur_mode_sel =cur_sel;
}
*pResult = 0;
}