用VC++在單文檔界面中創(chuàng)建多個視圖
(2010-05-09 19:56:07)
用VC++在單文檔界面中創(chuàng)建多個視圖
北京 周偉 電腦報2000年第46期
一個單文檔界面中存在多個視圖,并且可以根據(jù)需要進行視圖的動態(tài)切換,,這是當(dāng)前比較流行的界面風(fēng)格,它可以滿足許多用戶在操作和顯示方面的需要。這種
界面風(fēng)格的主要代表軟件是Outlook
Express,。而用VC++實現(xiàn)這種風(fēng)格的界面有一定難度,,筆者就這個問題進行了研究,并歸納總結(jié)出兩種實現(xiàn)方法(這些代碼都在VC++
6.0下調(diào)試通過),,使用時關(guān)鍵注意步驟和實現(xiàn)思路,,不必拘泥于代碼的形式,。
方法一:靜態(tài)創(chuàng)建切換法
步驟描述:
1.在窗口顯示之前先將需要切換的所有的視圖對象創(chuàng)建好,除首先顯示的視圖以外,,其他在創(chuàng)建時都設(shè)置為不可見屬性,。
CMyWinApp::InitInstance()
{
......
m_pViews[0] = pView1;
m_pViews[1] = (CView*)
new CView2;
CDocument* pCurrentDoc =
((CFrameWnd*)
m_pMainWnd)->GetActiveDocument();
//
初始化創(chuàng)建上下文相關(guān)指針
CCreateContext newContext;
newContext.m_pNewViewClass =
NULL;
newContext.m_pNewDocTemplate =
NULL;
newContext.m_pLastView =
NULL;
newContext.m_pCurrentFrame =
NULL;
newContext.m_pCurrentDoc =
pCurrentDoc;
//
最初激活視的ID為AFX_IDW_PANE_FIRST,對新創(chuàng)建的視圖增加這個值,,注意對CSplitterWnd不能這樣使用
UINT
viewID[2];
viewID[1] =
AFX_IDW_PANE_FIRST +
1;
CRect
rect(0, 0,
0, 0);
for
( int
nView=1; nView<NUMVIEWS;
nView++ ) {
//
創(chuàng)建新的視圖,,創(chuàng)建的視圖在應(yīng)用中永久存在,直到應(yīng)用程序退出,,應(yīng)用程序會自動刪除新創(chuàng)建的視圖
m_pViews[nView]->Create(NULL,
NULL,
(AFX_WS_DEFAULT_VIEW &
~WS_VISIBLE),
//
AFX_WS_DEFAULT_VIEW代表(WS_BORDER
| WS_VISIBLE
| WS_CHILD)
rect,
m_pMainWnd, viewID[nView],
&newContext);
}
//
當(dāng)文檔模板創(chuàng)建視圖的時候,,會自動發(fā)送WM_INITIALUPDATE消息,因此對于我們自己創(chuàng)建的視圖,,需要人工發(fā)送這條消息
((CForm2*)m_pViews[1])->OnInitialUpdate();
((CVswapView*)m_pViews[2])->OnInitialUpdate();
......
}
2.視圖的切換
CView*
CMyWinApp::SwitchView( UINT
nIndex )
{
ASSERT(
nIndex >=0
&& nIndex
< NUMVIEWS );
CView*
pNewView =
m_pViews[nIndex];
CView*
pActiveView =((CFrameWnd*)
m_pMainWnd)->GetActiveView();
if
( !pActiveView
) //
當(dāng)前沒有激活的視圖 |