MFC拆分視窗及它們之間的資料交換
CSplitterWnd類
CSplitterWnd類提供一個分隔器視窗的功能,分隔器視窗是一個包含有多個窗格的視窗。窗格通常是應用程式特定的由CView派生的物件,但它也可以是具有適當子視窗ID的任何CWnd物件。
一個CSplitterWnd物件通常被嵌入CFrameWnd或CMDIChildWnd父物件。你應按如下步驟建立一個CSplitterWnd物件:
1. |
在父框架中嵌入一個CSplitterWnd成員變數。 |
2. |
過載父框架的CFrameWnd::OnCreateClient成員函式。 |
3. |
從過載的OnCreateClient函式中呼叫類CSplitterWnd |
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
);
引數:
pParentWnd |
分隔器視窗的父框架視窗。 |
nMaxRows |
分隔器視窗中的最大行數。這個值不能超過2。 |
nMaxCols |
分隔器視窗中的最大列數。這個值不能超過2。 |
sizeMin |
指出顯示一個窗格所需的最小尺寸。 |
pContext |
指向一個CCreateContext結構的指標。多數情況下,這個值可以是傳遞給父框架視窗的pContext。 |
dwStyle |
指定視窗的風格。 |
nID |
此視窗的子視窗ID。如果這個分隔器視窗不是巢狀在另一個分隔器視窗中的,則這個ID |
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成員函式)。 |
注意: 第三個引數CruntimeClass為RUNTIME_CLASS(類名);如果該類是資源類,那麼該類的父類必須是CformView,
應用舉例:
1. 新建一個單文件的應用程式,命名為SplitterWndDemo;
2. 插入一個對話方塊的資源,作為其中一個分割視窗;為對話方塊新增相應的控制元件;
2.1設定對話方塊的屬性:將‘樣式’設定為‘下層’;禁止使用標題欄;邊框選擇‘調整大小’;其他格式暫時都不設定;
2.2為對話方塊建立一個類,類名CLeftView;父類選擇為CFormView;
3. 在CMainFrame嵌入一個CSplitterWnd成員變數。
CSplitterWnd m_splitterWnd;
4. 過載父框架CMainFrame的CFrameWnd::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的指標,獲得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);
三.自定義的訊息;
相關推薦
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
【差勁的程式設計師操心程式碼,優秀的程式設計師操心資料結構和它們之間的關係! ------ Linus Torvalds, Linux創始人.】努力奮鬥
專欄達人 授予成功建立個人部落格專欄
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中的資料能