標籤:style blog http color 使用 strong 檔案 資料
原始碼:http://download.csdn.net/detail/nuptboyzhb/4221531
CSplitterWnd類
CSplitterWnd類提供一個分隔器視窗的功能,分隔器視窗是一個包含有多個窗格的視窗。窗格通常是應用程式特定的由CView派生的對象,但它也可以是具有適當子視窗ID的任何CWnd對象。
一個CSplitterWnd對象通常被嵌入CFrameWnd或CMDIChildWnd父物件。你應按如下步驟建立一個CSplitterWnd對象
1.在父架構中嵌入一個CSplitterWnd成員變數。
2.重載父架構的CFrameWnd::OnCreateClient成員函數。
3.從重載的OnCreateClient函數中調用類CSplitterWnd的Create或CreateStatic成員函數。
3.1調用Create成員函數可以建立一個動態的分隔器視窗。
3.2 使用CreateStatic成員函數可以建立一個靜態分隔器視窗。
4. 從重載的OnCreateClient函數中調用類CSplitterWnd的CreateView成員函數;
重要的函數講解:
BOOL Create( CWnd* pParentWnd,
int nMaxRows,
int nMaxCols,
SIZE sizeMin,
CCreateContext* pContext,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
UINT nID = AFX_IDW_PANE_FIRST
);
傳回值:如果成功則返回非零值;否則返回0。
參數:
pParentWnd |
分隔器視窗的父架構視窗。 |
nMaxRows |
分隔器視窗中的最大行數。這個值不能超過2。 |
nMaxCols |
分隔器視窗中的最大列數。這個值不能超過2。 |
sizeMin |
指出顯示一個窗格所需的最小尺寸。 |
pContext |
指向一個CCreateContext結構的指標。多數情況下,這個值可以是傳遞給父架構視窗的pContext。 |
dwStyle |
指定視窗的風格。 |
nID |
此視窗的子視窗ID。如果這個分隔器視窗不是嵌套在另一個分隔器視窗中的,則這個ID可以是AFX_IDW_PANE_FIRST。 |
BOOL CreateStatic( CWnd* pParentWnd,
int nRows,
int nCols,
DWORD dwStyle = WS_CHILD | WS_VISIBLE,
UINT nID = AFX_IDW_PANE_FIRST
);
傳回值:如果成功則返回非零值;否則返回0。
參數:
pParentWnd |
分隔器視窗的父架構視窗。 |
nRows |
行數。這個值必須不超過16。 |
nCols |
列數。這個值必須不超過16。 |
dwStyle |
指定視窗的風格。 |
nID |
此視窗的子視窗ID。如果這個分隔器視窗不是嵌套在另一個分隔器視窗中的,則這個ID可以是AFX_IDW_PANE_FIRSH。 |
virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
傳回值:如果成功則返回非零值;否則返回0。
參數:
row |
指定用來放置新視的分隔器視窗行。 |
col |
指定用來放置新視的分隔器視窗列。 |
pViewClass |
指定新視的CRuntimeClass。 |
sizeInit |
指定新視的初始尺寸。 |
pContext |
指向用來建立此視的建立環境的指標(通常,該pContext被傳遞給在其中建立此分隔器視窗的父架構的重載的OnCreateClient成員函數)。 |
注意: 第三個參數CruntimeClass為RUNTIME_CLASS(類名);如果該類是資源類,那麼該類的父類必須是CformView,
應用舉例:
1. 建立一個單文檔的應用程式,命名為SplitterWndDemo;
2. 插入一個對話方塊的資源,作為其中一個分割視窗;為對話方塊添加相應的控制項;
2.1設定對話方塊的屬性:將‘樣式’設定為‘下層’;禁止使用標題列;邊框選擇‘調整大小’;其他格式暫時都不設定;
2.2為對話方塊建立一個類,類名CLeftView;父類選擇為CFormView;
3. 在CMainFrame嵌入一個CSplitterWnd成員變數。
CSplitterWnd m_splitterWnd;
4. 重載父架構CMainFrame的CFrameWnd::OnCreateClient成員函數,編輯代碼如下:
1 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 2 3 { 4 5 // TODO: Add your specialized code here and/or call the base class 6 7 //獲得主視窗的大小 8 9 CRect rect;10 11 GetClientRect(&rect);12 13 //產生第一次靜態切分14 15 m_splitterWnd.CreateStatic(this, //父視窗指標16 17 1, //行數18 19 2); //列數20 21 //為第1個窗格產生視圖22 23 m_splitterWnd.CreateView(0,0,24 25 RUNTIME_CLASS(CLeftView),26 27 CSize(rect.Width()/4,rect.Height()),28 29 pContext); 30 31 32 //為第2個窗格產生視圖33 34 m_splitterWnd.CreateView(0,1, //窗格的行、列序數35 36 RUNTIME_CLASS(CSplitterWndDemoView),//視圖類37 38 CSize(rect.Width()-rect.Width()/5,rect.Height()),//初始化大小 39 40 pContext);//父視窗的建立參數41 42 return TRUE;//不再調用基類的OnCreateClient函數43 44 //return CFrameWnd::OnCreateClient(lpcs, pContext);45 46 }
注意:要添加標頭檔
#include "SplitterWndDemoView.h"
#include "LeftView.h"
由於CSplitterWndDemoView是應用程式的視圖類,在其標頭檔中添加文檔類的標頭檔#include"SplitterWndDemoDoc.h",否則會報錯:‘CSplitterWndDemoDoc‘ : missing storage-class or type specifiers
至此,介面已經完成
================================================================================
拆分視窗之間的資料傳遞:
一.應用文檔類進行資料傳遞
每一個由View類派生出來的類,都可以調用CView::GetDocument,獲得當前應用程式文檔類的指標;然後進行類型轉換;注意,要將文檔類的標頭檔包含進去;
舉例:(繼續上述應用程式的編程)
1. 為文檔類添加一個CString類型的成員變數m_str;
2. 為CLeftView添加一個按鈕控制項和一個編輯框控制項;為編輯框控制項關聯一個CString類型的成員變數;對按鈕控制項添加訊息響應函數,並編輯代碼如下:
UpdateData();
CSplitterWndDemoDoc *pDoc =(CSplitterWndDemoDoc*)GetDocument();//擷取文檔
pDoc->m_str=m_edit_data;//傳遞資料
pDoc->UpdateAllViews(NULL);//更新所有視圖
3. 在CSplitterWndDemoView::OnDraw(CDC* pDC)編輯代碼如下:
CSplitterWndDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(200,200,pDoc->m_str);
二.通過獲得對方視圖的指標,進行操作的互動
通過AfxGetApp()獲得應用程式的指標,然後再通應用程式的指標獲得主架構CMainFrame的指標,然後有CMainFrame的指標,獲得CMainFrame的CsplitterWnd類型的成員變數m_splitterWnd;然後調用m_splitterWnd的GetPane函數;即可獲得;
1. 為視圖類添加一個CString類型的成員變數m_str_view;
2. 為CleftView再添加一個按鈕控制項;編輯代碼如下:
CSplitterWndDemoApp *pApp = (CSplitterWndDemoApp *)AfxGetApp();//獲得應用程式的指標
CMainFrame *pFrame = (CMainFrame *)pApp->m_pMainWnd;//獲得主架構的指標
CSplitterWndDemoView *pView = (CSplitterWndDemoView *)pFrame->m_splitterWnd.GetPane(0,1);//獲得視圖類的指標
pView->m_str_view=m_edit_data;//資料傳遞
pView->Invalidate();//重繪視圖
注意:添加相應類的標頭檔:
#include "MainFrm.h"
#include "SplitterWndDemoView.h"
3. 修改CsplitterWndDemoView類的OnDraw(CDC* pDC)函數
pDC->TextOut(200,300,m_str_view);
三.自訂的訊息;
轉自:http://blog.csdn.net/nupt123456789/article/details/7455471