MFC实现多界面切换

MFC有模态对话框和非模态对话框之区别。但是仅仅这些根本满足不了多功能、具有美观的程序开发。我们在开发中往往会遇到类似Android那样的界面(点击一个按钮切换到另一个界面)。在网上查一下,只有这篇文章点击本文字查看
虽然使用MFC的标签对话框也可以实现这样的功能,个人认为创建出来的界面有点丑,还不能随心所欲的创建切换按钮。

我也是根据这篇文章实现了一个三个界面之间切换的小程序
首先要创建四个对话框,
一个对话框要作为基类,一些属性设置:
Appearance :
Border:None(也可以为Dialog Frame)
Style : Popup

其他三个对话框,其中有一个设置为:
Appearance :
Border : None
Style : Popup(这样设置此对话框可以在显示屏任意位置显示)
其他两个对话框:
Appearance :
Border : None
Style : Child(必须是这样否则会显示出错,这样设置对话框只能显示在Base对话框上)

base对话框

CBaseDlg.h

/*
// 加载多界面
*/
//#define MULTI_DLG
class CBaseDlg : public CDialog
{
    ......      
public:
    CShowPictureDlg *m_ShowPic;
    CAutoAddDlg       *m_AutoAdd;
    CMyProgressCtrl  *m_MyProgress;
    enum
    {
        DLG_SHOWPICTURE = 0,
        DLG_AUTOADD,
        DLG_MYPROGRESS
    };

    ///加载界面
    BOOL AddPage(CDialog * pDlg, UINT ID);
    ///切换界面
    void ShowPage(int CurrentPage);

    //////添加多界面
    CDialog *m_pDlgPages[2];///自定义需要显示的界面个数
    UINT        m_DlgIDD[2];      ///每个对话框对应的ID
};

实现文件 .cpp

BOOL CBaseDlg::AddPage(CDialog * pDlg, UINT ID)
{
#ifdef MULTI_DLG
    m_pDlgPages[m_nDlgPageIdx]=pDlg;
    m_DlgIDD[m_nDlgPageIdx]=ID;
    m_pDlgPages[m_nDlgPageIdx]->Create(ID, this);
    m_pDlgPages[m_nDlgPageIdx]->MoveWindow(&m_ShowRect);
    m_nDlgPageIdx++;
#else
    ///初始化两个界面
    m_ShowPic = new CShowPictureDlg;
    m_ShowPic->Create(IDD_DIALOG_SHOWPICTURE, this);
    GetWindowRect(m_ShowRect);
    m_ShowRect=CRect(0, 0, m_ShowRect.Width(), m_ShowRect.Height());///
    m_ShowPic->MoveWindow(m_ShowRect);
    m_ShowPic->ShowWindow(SW_HIDE);

    m_MyProgress = new CMyProgressCtrl;
    m_MyProgress->Create(IDD_DIALOG_PROGRESS, this);
    GetWindowRect(m_ShowRect);
    m_ShowRect=CRect(560, 10, 1360, 220);///
    m_MyProgress->MoveWindow(m_ShowRect);
    m_MyProgress->ShowWindow(SW_HIDE);

    m_AutoAdd= new CAutoAddDlg;
    m_AutoAdd->Create(IDD_AUTOADD_DIALOG, this);
    m_AutoAdd->ShowWindow(SW_SHOW);

    GetWindowRect(m_ShowRect);
    m_ShowRect=CRect(20, 60, m_ShowRect.Width()-50, m_ShowRect.Height()-50);///
    m_AutoAdd->MoveWindow(m_ShowRect);
#endif

    return TRUE;
}

void CBaseDlg::ShowPage(int CurrentPage)
{
    switch (CurrentPage)
    {
    case DLG_SHOWPICTURE:
        {
            m_AutoAdd->ShowWindow(SW_SHOW);
            m_ShowPic->ShowWindow(SW_HIDE);
            m_MyProgress->ShowWindow(SW_HIDE);
            SetTimer(1, 1000, NULL);
        }
        break;
    case DLG_AUTOADD:
        {
            m_AutoAdd->ShowWindow(SW_HIDE);
            m_MyProgress->ShowWindow(SW_HIDE);
            m_ShowPic->ShowWindow(SW_SHOW);
            KillTimer(1);
        }
        break;
    case DLG_MYPROGRESS:        
        {
            m_AutoAdd->ShowWindow(SW_HIDE);
            m_ShowPic->ShowWindow(SW_HIDE);
            m_MyProgress->ShowWindow(SW_SHOW);
            m_MyProgress->SetBackground();
            KillTimer(1);
        }
        break;
    }
}

其他对话框页面切换,包含以下base类头文件,创建一个按钮或者其他控件然后添加下面代码即可

CBaseDlg *pMMD = (CBaseDlg*)AfxGetMainWnd();   
pMMD->ShowPage(0);//跳到setup对话框

在这里我创建的m_MyProgress 就是Style 是非Child的对话框,我在设置对话框位置时,使用的坐标是屏幕坐标,而其他子页面坐标都是以base界面为基础。

你可能感兴趣的:(MFC)