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框架中的文档视图模型(Document-View)来实现MFC单文档应用程序中的多界面切换。下面是一种常见的实现方法: 1. 首先,在你的MFC应用程序中创建多个对话框资源,每个对话框资源代表一个界面。 2. 在你的文档类(CMyDoc)中添加一个成员变量,用于保存当前显示的对话框的指针。 ```cpp CDialog* m_pCurrentDialog; ``` 3. 在你的文档类的构造函数中,初始化该成员变量为NULL。 ```cpp m_pCurrentDialog = NULL; ``` 4. 在你的文档类的OnNewDocument函数中,创建初始对话框并显示。 ```cpp BOOL CMyDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // 创建初始对话框 CMyDialog* pDialog = new CMyDialog; // 设置当前对话框指针 m_pCurrentDialog = pDialog; // 创建对话框窗口 pDialog->Create(IDD_MY_DIALOG, AfxGetMainWnd()); // 显示对话框 pDialog->ShowWindow(SW_SHOW); return TRUE; } ``` 5. 在你的文档类中添加一个函数,用于切换界面。在该函数中,先隐藏当前对话框,然后根据需要创建并显示新的对话框。 ```cpp void CMyDoc::SwitchDialog(int nDialogID) { // 隐藏当前对话框 m_pCurrentDialog->ShowWindow(SW_HIDE); // 销毁当前对话框 m_pCurrentDialog->DestroyWindow(); delete m_pCurrentDialog; // 根据需要创建新的对话框 if (nDialogID == IDD_DIALOG1) { m_pCurrentDialog = new CDialog1; } else if (nDialogID == IDD_DIALOG2) { m_pCurrentDialog = new CDialog2; } // 可以根据需要添加更多的对话框 // 创建对话框窗口 m_pCurrentDialog->Create(nDialogID, AfxGetMainWnd()); // 显示对话框 m_pCurrentDialog->ShowWindow(SW_SHOW); } ``` 6. 在你的视图类(CMyView)中添加一个成员变量,用于保存文档指针。 ```cpp CMyDoc* m_pDoc; ``` 7. 在你的视图类的构造函数中,将文档指针赋值给成员变量。 ```cpp CMyView::CMyView() { m_pDoc = GetDocument(); } ``` 8. 在你的视图类中添加一个消息处理函数,用于响应界面切换的消息。 ```cpp void CMyView::OnSwitchDialog() { // 调用文档类的切换界面函数 m_pDoc->SwitchDialog(IDD_NEW_DIALOG); } ``` 9. 在你的菜单资源中添加一个菜单项,并将它与界面切换的消息关联起来。 ```cpp ON_COMMAND(ID_SWITCH_DIALOG, &CMyView::OnSwitchDialog) ``` 这样,当你点击菜单项时,就会调用文档类的切换界面函数,实现界面切换效果。你可以根据需要在文档类中添加更多的界面切换函数,并在视图类中添加相应的消息处理函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值