轉 使用CSplitterWnd分割視窗

2022-05-12 22:13:01 字數 3005 閱讀 5488

原帖:

一、基本的csplitterwnd的使用

1. 在cmainframe中新增乙個csplitterwnd成員:

csplitterwnd m_splitterwnd1;

2. 基於cview建立兩個新的檢視類,cviewleft和cviewright,乙個用於在左邊顯示,乙個用於在右邊顯示。

3. 過載cmainframe的oncreateclient函式,在並其中呼叫csplitterwndr的createstatic函式建立該分割視窗,createview函式建立左右兩個檢視,setcolumninfo設定分割視窗的列的寬度:

bool cmainframe::oncreateclient(lpcreatestruct lpcs, ccreatecontext* pcontext)

執行後就可以看到生成了分割為左右兩個檢視的視窗。

二、為分割窗新增一些自己需要的功能

從系統的csplitterwnd類派生乙個新類。

在類檢視中右鍵,選擇「新增」->「類」,在彈出視窗中選擇mfc類,輸入新類的名字cmysplitter,基類選擇為cwnd(這裡基類的選項裡面沒有csplitterwnd,所以要先選擇cwnd)。然後把生成的mysplitter.h和mysplitter.cpp裡面的三個地方的「cwnd」改成「csplitterwnd」。

mysplitter.h中:

class cmysplitter : public csplitterwnd

mysplitter.cpp中:

implement_dynamic(cmysplitter, csplitterwnd)

begin_message_map(cmysplitter, csplitterwnd)

1. 雙擊分隔欄展開或者收起左邊的一欄

過載onlbuttondblclk函式:

void cmysplitterwnd::onlbuttondblclk(uint nflags, cpoint point)

else

recalclayout(); 

//重新構建視窗布局

}2. 設定分隔欄的寬度

在cmysplitter的建構函式中(這裡是把寬度設為11畫素):

m_cxsplittergap = 11;

m_cxsplitter = 11; 

//int   m_cxsplitter,   m_cysplitter;                     //   size   of   splitter   bar  

//int   m_cxbordershare,   m_cybordershare;        //   space   on   either   side   of   splitter  

//int   m_cxsplittergap,   m_cysplittergap;         //   amount   of   space   between   panes  

//int   m_cxborder,   m_cyborder;                            //   borders   in   client   area    

3. 禁止拖動分隔欄的位置

(1)過載onlbuttondown函式,改成什麼都不做:

void cmysplitter::onlbuttondown(uint nflags, cpoint point)

(2)過載onmousemove函式,也改成什麼都不做:

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

4. 在分隔欄上新增乙個」按鈕「

(1)在資源檢視中匯入兩張位圖資源,分另是乙個向左的箭頭和乙個向右的箭頭,大小為(6*31)畫素:idb_bitmap_left,idb_bitmap_right

(2)為cmysplitter類新增顯示該「按鈕」相關的成員:

cbitmap m_bitmapleft;    //左箭頭位圖

cbitmap m_bitmapright;   //右箭頭位圖

cdc m_dcmem;       //

crect m_rectimgbtn;    //顯示該「按鈕」的矩形區域

(3)新增乙個成員函式得到顯示該「按鈕」的矩形區域:

//這個函式用來得到顯示該按鈕的矩形區域

void cmysplitter::getimgbtnrect(void)

}else}}

(4)過載ondrawsplitter函式,畫出該按鈕:

void cmysplitter::ondrawsplitter(cdc* pdc, esplittype ntype,

const crect& rect)

getimgbtnrect();

pdc->bitblt(m_rectimgbtn.left, m_rectimgbtn.top,

m_rectimgbtn.width(), m_rectimgbtn.height(), 

&m_dcmem, 0, 0, srccopy);        //從m_dcmem中把複製到pdc中並畫出來(大概是這個意思)

}}}(5)過載onlbuttonup函式,使得點選該「按鈕」時可以收起或者展開左欄

void cmysplitter::onlbuttonup(uint nflags, cpoint point)

else

}(6)過載onmousemove函式,當滑鼠移動到「按鈕」上時,把滑鼠形狀變成手形

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

else

}

使用CSplitterWnd類分割視窗

一 在單文件 檢視結構中 將視窗進行分割 步驟如下 1 在框架類中定義乙個csplitterwnd類物件 m wndsplitter 2 過載框架類的oncreateclient 函式 這其中要注意 在cmainframe的原始檔cpp中新增工程view標頭檔案 如 include splitwnd...

CSplitterWnd 控制項的特性

最近,調ui,發現 csplitterwnd 這個控制項的特性,很有意思。先貼點它自繪的原始碼。void mycsplitter ondrawsplitter cdc pdc,esplittype ntype,const crect rectarg otherwise,actually draw c...

php使用技巧 轉

靜態呼叫的成員一定要定義成 static php5 only 貼士 php 5 引入了靜態成員的概念,作用和 php 4 的函式內部靜態變數一致,但前者是作為類的成員來使用。靜態變數和 ruby 的類變數 class variable 差不多,所有類的例項共享同乙個靜態變數。quote php co...