前言
WinCE for PocketPC 2002通常只支持SDI MFC程序。我們可以使用一點欺騙技術來將它轉變為MDI應用。在任一時刻,你仍然只能有一個視圖。但是你可以隱藏、銷毀當前視圖或者其他視圖。新視圖將被動態創建並且只局限於內存的大小。
在這裡可以定義各種不同的視圖類,但是每個視圖只會有一個實例。原因是OnSelectNextView()和OnSelectPrevView()函數在當前視圖鏈中查找視圖是否已經存在。如果存在,它就被設置為活動的。否則,該視圖就將被創建並且加入視圖鏈中。
代碼
類具體實現步驟如下:
1、建立一個新的MFC 文檔/視圖結構項目,或者使用已有項目。
2、將文件SVMainFrame.cpp 和 SVMainFrame.h拷貝到項目所在目錄下,並將它們加入到項目中。
3、打開文件CmainFrm.h,用類名CSFMainFrame 取代CFrameWnd。
class CMainFrame : public CSVMainFrame
{
// 類定義
}
4、在CMainFrm.h刪除行CCeCommandBar m_wndCommandBar,因為它已經在CSVMainFrame.h中聲明了。
5、在CMainFrm.cpp中,用CSVMainFrame取代CMainWnd。
6、根據需要建立多個視圖,用戶可以根據向導按鈕或菜單條來前移或後移視圖。創建CFormView類時,必須設置樣式為Child,同時Border設置為None。
7、在視圖鏈中,使用方法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);
}
8、在視圖鏈中,使用方法OnSelectPrevView()前移視圖。在例子中,m_selection作用和前面所述一樣。如果視圖鏈沒有前置視圖,則當前視圖不變。
void CMySecondView::OnPreviousView()
{
UpdateData();
CMainFrame* pMFrame = (CMainFrame*)GetParentFrame();
pMFrame->OnSelectPrevView(m_selection == 0 ? AIT_HIDE_WINDOW : AIT_DESTROY_WINDOW);
}
本文配套源碼