用Visual C++在單文檔界面中創建視圖

一個單文檔界面中存在多個視圖,並且可以根據需要進行視圖的動態切換,這是當前比較流行的界面風格,它可以滿足許多用戶在操作和顯示方面的需要。這種界面風格的主要代表軟件是Outlook EXPress。而用VC++實現這種風格的界面有一定難度,筆者就這個問題進行了研究,並歸納總結出兩種實現方法(這些代碼都在VC++ 6.0下調試通過),使用時要害注重步驟和實現思路,不必拘泥于代碼的形式。

方法一:靜態創建切換法

步驟描述:

1.在窗口顯示之前先將需要切換的所有的視圖對象創建好,除首先顯示的視圖以外,其他在創建時都設置爲不可見屬性。

CMyWinApp::InitInstance()

{ ......

m_pViews[0] = pView1;

m_pViews[1] = (CView*) new CView2;

CDocument* pCurrentDoc = ((CFrameWnd*) m_pMainWnd)->GetActiveDocument();

// 初始化創建上下文相關指針

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,

//對新創建的視圖增加這個值,注重對CSplitterWnd不能這樣使用

UINT viewID[2];

viewID[1] = AFX_IDW_PANE_FIRST + 1;

CRect rect(0, 0, 0, 0);

for ( int nView=1; nView<NUMVIEWS; nView++ ){

// 創建新的視圖,創建的視圖在應用中永久存在,直到應用程序退出,

//應用程序會自動刪除新創建的視圖

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);

}

// 當文檔模板創建視圖的時候,會自動發送WM_INITIALUPDATE消息,

//因此對于我們自己創建的視圖,需要人工發送這條消息

((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 ) // 當前沒有激活的視圖

return NULL;

if ( pNewView == pActiveView ) // 當前視圖和需要切換的視圖相同

return pActiveView;

// 交換視圖的窗口ID,使RecalcLayout()可以工作

UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);

::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));

::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);

// 顯示新的視圖,隱藏前一個視圖

pActiveView->ShowWindow(SW_HIDE);

pNewView->ShowWindow(SW_SHOW);

((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);

((CFrameWnd*) m_pMainWnd)->RecalcLayout();

pNewView->Invalidate();

return pActiveView;

}方法二:動態創建切換法

步驟描述:

1.刪除當前的視圖

首先需要獲得當前視圖的指針,不能使用GetActiveView()和GetActiveDocument()這兩個函數,當前視圖有可能處在未激活狀態,

所以應該使用EnumChildWindows這個Win32API函數,函數定義如下:

Visual C++ 的中文界面支持
太原市200信箱11號 潘彤 李世展(030027) 在Microsoft 發行的Visual Studio 系列軟件中Visual Basic和Visual Foxpro都有中文版,可以方便地設計具有中文界面的應用程序。然而Visual C++卻沒有中文版,因而不便于編寫...查看完整版>>Visual C++ 的中文界面支持
 
在Visual Basic 6.0 中創建Word文檔
摘要:分析了Word對象模型的結構,特別是Document對象及其使用方法,提出了在Visual Basic中創建Word格式文檔的方法,並給出了該方法的應用實例。   關鍵詞:Visual Basic,Word對象模型,文檔   引言  Word文...查看完整版>>在Visual Basic 6.0 中創建Word文檔
 
Visual C++ 6.0的文檔/視結構
Visual C++ 6.0 以其功能強大、用戶界面友好而倍受程序員們的青睐。但是,在當前的Microsoft 基本類庫4.2 版本中,大約有將近200 個類,數千個函數,加之Microsoft 公司隱藏了一些技術細節,使得人們深入學習MFC變得...查看完整版>>Visual C++ 6.0的文檔/視結構
 
如何從一個對話框彈出單文檔視圖
相信不少人進行數據庫編程都有這樣的問題,如何設置一個登陸框,通過登陸框來進入單文檔視圖。我看到很多數據庫編程方面的書,都是對話框之間的相互切換。而在對話框中添加菜單不少人都不太熟悉(當然這是可以辦到的...查看完整版>>如何從一個對話框彈出單文檔視圖
 
Windows資源管理器Web視圖界面
Windows資源管理器Web視圖界面 作者/ 當我們使用Windows資源管理器(Exporlor)時,看到左邊的視圖能夠顯示所選目標的相關信息,比較好用。 本例...查看完整版>>Windows資源管理器Web視圖界面
 
C++實現三維視圖繪制與消隱技術
1. 問題的提出   在一些數據庫治理系統或辦公自動化和統計類軟件中,一般具有繪制三維視圖的功能。使用時通常要求在給出的表格中輸入繪圖的數據及視角、比例尺等參數。這只適用于小批量的統計數據繪制統計三維視圖...查看完整版>>C++實現三維視圖繪制與消隱技術
 
文檔與視圖的建立和關聯
作者:王家文 湖南大學計算機通信系  本文討論一下單文檔與多視的問題,主要介紹一下筆者在學習VC++6.0過程中探索出的一些個人經驗,並給出了實現它們的的主要程序框架。一.建立文檔與視圖:在Projects選MFC Appwi...查看完整版>>文檔與視圖的建立和關聯
 
MFC單文檔視圖窮追猛打
MFC單文檔/視圖結構窮追猛打目錄第一章找回WinMain函數 2第二章InitApplication()函數 2第三章InitInstance ()函數 3第一節:new CSingleDocTemplate 3第二節:AddDocTemplate(pDocTemplate); 5第三節:ProcessShell...查看完整版>>MFC單文檔視圖窮追猛打
 
爲給定表或視圖創建索引
只有表或視圖的所有者中是否有數據。可以通過指 才能爲表創建索引。表或視圖的定限定的數據庫名稱,爲另一個 所有者可以隨時創建索引,無論表數據庫中的表或視圖創建索引。   語法 ...查看完整版>>爲給定表或視圖創建索引
 
 
回到王朝網路移動版首頁