
WinCE for PocketPC 2002 通常僅支援 SDI MFC 程式。透過一些技巧,我們可以將其轉變為 MDI 應用程式。雖然任一時刻仍只能有一個視圖,但可以隱藏、銷毀目前視圖或其他視圖,新視圖將動態建立,僅受限於記憶體大小。
此處可定義多種不同的視圖類別,但每個視圖類別僅會有一個實例。原因在於 OnSelectNextView() 和 OnSelectPrevView() 函式會在目前視圖鏈中查找視圖是否已存在。若存在,則將其設為作用中;否則,建立該視圖並加入視圖鏈中。
SVMainFrame.cpp 和 SVMainFrame.h 複製到專案目錄,並加入專案。CmainFrm.h,將 CFrameWnd 替換為 CSFMainFrame:
class CMainFrame : public CSVMainFrame
{
// 類別定義
}
CMainFrm.h 刪除 CCeCommandBar m_wndCommandBar 行,因已在 CSVMainFrame.h 中宣告。CMainFrm.cpp 中,將 CMainWnd 替換為 CSVMainFrame。CFormView 類別時,必須設定樣式為 Child,Border 設為 None。OnSelectNextView() 切換至下一個視圖。範例中,單選按鈕 m_selection 為 0 時隱藏視窗,非 0 時銷毀目前視窗:
void CSelViewDemoView::OnNextViewButton()
{
UpdateData();
CMainFrame* pMFrame = (CMainFrame*)GetParentFrame();
pMFrame->OnSelectNextView(RUNTIME_CLASS(CMySecondView),
m_selection == 0 ? AIT_HIDE_WINDOW : AIT_DESTROY_WINDOW);
}
OnSelectPrevView() 切換至上一個視圖。m_selection 作用同上。若視圖鏈無前置視圖,目前視圖保持不變:
void CMySecondView::OnPreviousView()
{
UpdateData();
CMainFrame* pMFrame = (CMainFrame*)GetParentFrame();
pMFrame->OnSelectPrevView(m_selection == 0 ? AIT_HIDE_WINDOW : AIT_DESTROY_WINDOW);
}
本文附帶完整原始碼供參考。