CSplitterWnd 控制項的特性

2021-07-17 06:08:47 字數 1123 閱讀 6900

最近,調ui,發現 csplitterwnd 這個控制項的特性,很有意思。先貼點它自繪的原始碼。

void mycsplitter::ondrawsplitter(cdc* pdc, esplittype ntype, const crect& rectarg)

otherwise, actually draw

colorref clrbtnshadow = 0x00a0a0a0;

colorref clrbtnhilite = 0x00ffffff;

colorref clrwindowframe = 0x00646464;

colorref clrbtnface = 0x00f0f0f0;

crect rect = rectarg;

switch (ntype)

// fill the middle

colorref clr = 0x00f0f0f0;

pdc->fillsolidrect(rect, clr);

這是它的重繪的部分原始碼,也是主要的**。重繪的時序分為兩個部分,第一部分,是 void csplitterwnd::recalclayout() 呼叫 ondrawsplitter(cdc* pdc, esplittype ntype, const crect& rectarg)。這次的呼叫,傳入的pdc 是 null,目的就是讓 redrawwindow(rectarg, null, rdw_invalidate|rdw_nochildren|rdw_noerase ) 執行,用來強制更新 csplitterwnd 內部範圍的顯示,而不是更新 csplitterwnd 自身邊框的顯示。第二部分,就是 void csplitterwnd::ondraw(cdc* pdc),這次傳入的 pdc不是null,所以,它就開始繪製自己的邊框這類的顯示。

那麼,在mfc框架下,這樣的設計是沒問題的。但是對於diy ui的情況,就有點問題了。就像之前的博文,我在view中 使用了sdl,然後sdl的渲染是採用的opengl,這時候,渲染的影象資訊是儲存在sdl內部的,在現實的時候,只是swapbuff了一下。這個swapbuff之後顯示的內容,mfc本地沒有管理,也沒法管。當csplitterwnd強制更新內部範圍的顯示時,就有問題了。

那麼這種情況,就要自定義csplitterwnd的重繪行為了。

使用CSplitterWnd類分割視窗

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

轉 使用CSplitterWnd分割視窗

原帖 一 基本的csplitterwnd的使用 1.在cmainframe中新增乙個csplitterwnd成員 csplitterwnd m splitterwnd1 2.基於cview建立兩個新的檢視類,cviewleft和cviewright,乙個用於在左邊顯示,乙個用於在右邊顯示。3.過載c...

C 控制項 MenuStrip控制項(選單控制項)

一 概述 選單通過存放按照一般主題分組的命令將功能公開給使用者。menustrip 控制項是此版本的 visual studio 和 net framework 中的新功能。使用該控制項,可以輕鬆建立 microsoft office 中那樣的選單。menustrip 控制項支援多文件介面 mdi ...