MFC实现多界面切换

来源:互联网 发布:linux内核的系统 编辑:程序博客网 时间:2024/06/05 19:20

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_DLGclass 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界面为基础。

0 0
原创粉丝点击