1. 程式人生 > >MFC實現多介面切換

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介面為基礎。