客戶區視窗動態分割示例

2021-05-24 10:51:27 字數 1447 閱讀 6348

1.定義csplitterwnd型別變數

在mainfrm.h檔案中加入如下**:

protected:

csplitterwnd m_wndsplitter;

定義splitter變數用於分割客戶區視窗,本例中將客戶區分割為兩列一行。

2.構建分割後各分割槽的檢視

本例中構建乙個ctreeview檢視和cformview檢視

(1)insert->new class..構建base class為ctreeview檔名稱為mytreeview的樹檢視;

(2)在資源檢視中新增對話方塊資源,右擊->properties->style:child,border:none。右擊->classwizard...建立類名為:cmyformview,base class:cformview的檢視。

需要注意的是,基於ctreeview和cformview的檢視類嚮導自動新增了兩個允許檢視執行時建立的兩個巨集:declare_dyncreate(cmytreeview)和implement_dyncreate(cmytreeview, ctreeview),前者一般宣告在標頭檔案建構函式下方,後者宣告在原始檔建構函式實現**上方。如若使得繼承與cdialog類的對話方塊資源也可以執行時建立,就需要在類檔案中分別新增這兩個巨集。

3.構建分割檢視

在mainfrm.cpp檔案中的oncreateclient()函式中新增如下構建分割檢視的**:

m_wndsplitter.createstatic(this,1,2);

m_wndsplitter.createview(0,0,runtime_class(cmytreeview),csize(200,100),pcontext);

m_wndsplitter.createview(0,1,runtime_class(cmyformview),csize(100,100),pcontext);

runtime_class即執行執行時建立。

4.分別為treeviw和formview新增初始化及使用者所需**

對於formview由於對應的是對話方塊資源,其相關操作與對話方塊操作類似。下面主要分析treeview。

.cpp檔案中初始化**:

void cmytreeview::oninitialupdate()

5.兩檢視間互動操作

互動主要是資料的互動,有兩種解決方式:一種是以document為中間媒介,資料都有document進行管理,方便實現資料互動;二是通過mainfrm中定義的csplitterwnd變數在本檢視中獲取另一檢視的指標,並作強制型別轉換成其對應檢視變數後,訪問檢視中的資料。本例採用第二種方式。

void cmytreeview::onmousemove(uint nflags, cpoint point)

6.編譯執行結果

如圖:

設定視窗客戶區大小的方法

話說,windows sdk貌似並沒有提供設定乙個視窗的客戶區大小的api.setwindowpos,movewindow 它們都只能設定整個視窗的大小,如果不採取點其它的 方法,是不能直接設定客戶區的大小的.設定客戶區的大小用處不是很多,但有 時候會用到,比如在客戶區上進行文字輸出計算的時候.wi...

如何調整視窗以適應客戶區大小

以下黑色字型部分為 假設我們用createwindow 0,0,w,h,建立乙個視窗,我們將獲得乙個w x h大小的視窗,通常我們需要的是客戶區大小為w x h,如何做呢?乙個方法是呼叫api函式setwindowpos,通常我們需要提供3個引數 視窗控制代碼hwnd,視窗寬度w,視窗高度h。下面是...

MFC獲取視窗和客戶區座標分析

cwnd pwnd getdlgitem idb but recognize pwnd getclientrect rect 指該控制項自身客戶區的矩形,原點為控制項左上角,長寬為整個控制項的尺寸 clienttoscreen rect 座標原點從控制項所屬視窗客戶區移動到螢幕左上角,長寬為整個控制...