MFC實現多介面切換
阿新 • • 發佈:2019-02-04
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介面為基礎。