1. 程式人生 > >MFC拆分視窗及它們之間的資料交換

MFC拆分視窗及它們之間的資料交換

CSplitterWnd

CSplitterWnd類提供一個分隔器視窗的功能,分隔器視窗是一個包含有多個窗格的視窗。窗格通常是應用程式特定的由CView派生的物件,但它也可以是具有適當子視窗ID的任何CWnd物件。

一個CSplitterWnd物件通常被嵌入CFrameWndCMDIChildWnd父物件。你應按如下步驟建立一個CSplitterWnd物件:

1.

父框架中嵌入一個CSplitterWnd成員變數。

2.

過載父框架的CFrameWnd::OnCreateClient成員函式。

3.

從過載的OnCreateClient函式中呼叫類CSplitterWnd

CreateCreateStatic成員函式。

3.1呼叫Create成員函式可以建立一個動態的分隔器視窗。

3.2 使用CreateStatic成員函式可以建立一個靜態分隔器視窗。

4. 從過載的OnCreateClient函式中呼叫類CSplitterWndCreateView成員函式;

重要的函式講解:

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

指定用來放置新視的分隔器視窗列。

sizeInit

指定新視的初始尺寸。

pContext

指向用來建立此視的建立環境的指標(通常,該pContext被傳遞給在其中建立此分隔器視窗的父框架的過載的OnCreateClient成員函式)。

注意: 第三個引數CruntimeClassRUNTIME_CLASS(類名);如果該類是資源類,那麼該類的父類必須是CformView,

應用舉例:

1.       新建一個單文件的應用程式,命名為SplitterWndDemo;

2.       插入一個對話方塊的資源,作為其中一個分割視窗;為對話方塊新增相應的控制元件;

2.1設定對話方塊的屬性:將‘樣式’設定為‘下層’;禁止使用標題欄;邊框選擇‘調整大小’;其他格式暫時都不設定;

2.2為對話方塊建立一個類,類名CLeftView;父類選擇為CFormView;

3.       CMainFrame嵌入一個CSplitterWnd成員變數。

CSplitterWnd m_splitterWnd;

4.       過載父框架CMainFrameCFrameWnd::OnCreateClient成員函式,編輯程式碼如下:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

{

// TODO: Add your specialized code here and/or call the base class

//獲得主視窗的大小

CRect rect;

GetClientRect(&rect);

//產生第一次靜態切分

m_splitterWnd.CreateStatic(this, //父視窗指標

                                                                   1,    //行數

                                                                   2);   //列數

//為第1個窗格產生檢視

m_splitterWnd.CreateView(0,0,

           RUNTIME_CLASS(CLeftView),

           CSize(rect.Width()/4,rect.Height()),

           pContext); 


//為第2個窗格產生檢視

m_splitterWnd.CreateView(0,1,  //窗格的行、列序數

           RUNTIME_CLASS(CSplitterWndDemoView),//檢視類

           CSize(rect.Width()-rect.Width()/5,rect.Height()),//初始化大小 

           pContext);//父視窗的建立引數

return TRUE;//不再呼叫基類的OnCreateClient函式

//return CFrameWnd::OnCreateClient(lpcs, pContext);

}


注意:要新增標頭檔案#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的指標,獲得CMainFrameCsplitterWnd型別的成員變數m_splitterWnd;然後呼叫m_splitterWndGetPane函式;即可獲得;

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

三.自定義的訊息;

相關推薦

MFC拆分視窗它們之間資料交換

CSplitterWnd類 CSplitterWnd類提供一個分隔器視窗的功能,分隔器視窗是一個包含有多個窗格的視窗。窗格通常是應用程式特定的由CView派生的物件,但它也可以是具有適當子視窗ID的

Android:Activity+Fragment它們之間資料交換

簡介: 為什麼要用Fragment?使用Fragment可以在一個Activity中實現不同的介面。Fragment與Fragment之間的動畫切換,遠比Activity與Activity之間的動畫切換變化方式多。很多時候,我們通過使用一個Activity,切換

java 介面、抽象類、具體類、內部類、匿名內部類的區別它們之間的關係

其實java內部類也是一個類,與其他類不同的是內部類是類中類,它的作用範圍只能在這個類中。 java 匿名內部類: 匿名內部類的定義語法如下: new 父類構造器(引數列表)|實現介面() { //匿名內部類的類體部分 } 雖然看上去很簡單,但是還有一

MFC建立視窗圖片動態顯示C++

#include <afxwin.h> class CMyWnd :public CFrameWnd { private: CDC * cdc; CBitmap *bmp; CBitmap *bmpBack; int order = 0; int pos = 50

幾種常見的排序演算法它們之間的比較

1.穩定性比較 插入排序、氣泡排序、二叉樹排序、二路歸併排序及其他線形排序是穩定的 選擇排序、希爾排序、快速排序、堆排序是不穩定的 2.時間複雜性比較 插入排序、氣泡排序、選擇排序的時間複雜性為O(n2) 其它非線形排序的時間複雜性為O(nlog2n) 線形排序的

dm81xx link記憶體分配link之間資料傳遞

======================================== 轉載:http://www.aiuxian.com/article/p-2695138.html ======================================

List、Set、Map集合最常用六個子類它們之間的區別詳解(含經典面試題)

集合: 在程式設計中,我們需要管理很多物件集,比如某班全部的同學資訊,某個公司的人員資料等等。JAVA集合就是提供某種資料結構的支援,即存放物件,並讓這些物件按照某種資料結構存放。 集合與陣列的區別: 1. 陣列存放的元素個數是在定義陣列時固定的。

oracle 同一個資料庫,不同使用者之間資料交換

現有同一oracle下的兩使用者user1和user2,現在想把user1的表tb的結構複製到user2下   一、建立dblink交換資料 create database link createDbLinkNameUser1 connect to  user1LinkDa

GTK多視窗的建立視窗之間資料的互動

在用gtk寫圖形介面時,往往會遇到需要用的構件比較多,一個視窗放不下的情況,此時可以考慮使用多個視窗。 gtk建立視窗很方便,呼叫gtk_window_new()就可以,需要多視窗時順手新建一個即可。很奇怪關於gtk多視窗的資料並不多,也許是因為方法太顯而易見了吧 本文程式

(1)MFC簡介MFC Object與Windows Object之間的比較

libraries 並且 bsp 應用 ets 銷毀 靈活 eight 公司 MFC(微軟基礎類庫)   微軟基礎類庫(Microsoft Foundation Classes,簡稱MFC)是微軟公司提供的一個類庫(class libraries),以C++類的形式封裝了W

[Visual Studio C++] [MFC] DDX(動態資料交換)和DDV(動態資料驗證)

DDX(動態資料交換)和DDV(動態資料驗證)是MFC中用於變數和控制元件間關聯資料和控制資料的巨集。 比如: DDX_Text(pDX,IDC_EDIT1,text); 就可以把變數text和控制元件IDC_EDIT1關聯起來,只要呼叫UpdateData(FALSE); 一旦text

Java大資料培訓學校全套教程-視窗frame(24)-馬克-專題視訊課程

Java大資料培訓學校全套教程-視窗及frame(24)—3人已學習 課程介紹         Java大資料培訓學校視訊課程:"java大資料培訓學校全套教材"系列課程由750集視訊構成,基本就 是1

MFC-單文件-拆分視窗

自定義兩個類CUserTreeView(繼承於CTreeView,顯示使用者資訊)、CMedicListView(繼承於CListView,顯示藥品資訊): 類檢視中,選中頂層資料夾 -> 右擊 -> 新增類 -> MFC -> ……

Vue基礎知識之元件元件之間資料傳遞(五)

vue中的元件是自定的標籤,可以擴充套件的原生html元素,封裝可複用的程式碼 note: 1、在標籤命中不要使用大寫,標籤名字必須用短橫線隔開 2、模板中只能有一個根元素,不能使用並列標籤。 定義元件 全域性定義,在所有例項中都可以使用這個元件 <t

差勁的程式設計師操心程式碼,優秀的程式設計師操心資料結構和它們之間的關係! ------ Linus Torvalds, Linux創始人.

Kafka log的儲存解析: Partition中的每條Message由offset來表示它在這個partition中的偏移量,這個offset不是該Message在partition資料檔案中的實際儲存位置,而是邏輯上一個值,它唯一確定了partition中的一條Mes

javafx顯示多個視窗以及javafx多視窗之間資料互動傳輸

javafx在我們國內資料還是很少,國外的文件想我這種英語不精的實在沒有辦法看; 有這篇文章的原因是因為我在開發一款Mybatis幫助工具,需要實現多視窗以及資料互動,我給這款工具起名叫MyBatis-CMEU,是一款可以讓人忘記怎麼寫mapper的工具,與該工具配套的As

iframe與父視窗之間資料互相獲取

iframe與父視窗之間資料互相獲取 Js/Jquery獲取iframe中的元素   在web開發中,經常會用到iframe,難免會碰到需要在父視窗中使用iframe中的元素、或者在iframe框架中使用父視窗的元素。 js 在父視窗中獲取iframe中的元素 1.

Android業務元件化之子模組SubModule的拆分以及它們之間的路由Router實現

前言:      前面分析了APP的現狀以及業務元件化的一些探討(Android業務元件化之現狀分析與探討),以及通訊的橋樑Scheme的使用(Android業務元件化之URL Scheme使用),今天重點來聊下子模組SubModule的拆分以及它們之間的路由Router實現。本篇涉及的相關知識比較多,閱讀

MFC中兩個對話方塊之間資料傳遞

這裡有兩種情況, 第一種情況是: (在一個基於單文件的應用程式中,新建了兩個對話方塊A和B,並且用兩個獨立的類和他們關聯) 對話方塊A中有一個編輯框, 按下A中的一個按鈕a後彈出對話方塊B, B中也有一個編輯框b, 在B中輸入資料 點選確定(ID0K)後 ,b中的資料能