csplitterwnd 類——拆分視窗類,提供分離視窗的功能,使一個視窗包含多個方格。
基本介紹
- 中文名:csplitterwnd
- 套用:提供一個分隔器視窗的功能
- 特點:通常被嵌入CFrameWnd
- 構造:在一個分隔器視窗中創建一個窗格
- 頭檔案:afxext.h
英文釋義,創建步驟:,運用原理,類成員,構造,操作符,可重載,運用實例,1鎖定切分條,2切分條的定製,
英文釋義
CSplitterWnd類提供一個分隔器視窗的功能,分隔器視窗是一個包含有多個窗格的視窗。窗格通常是應用程式特定的由CView派生的對象,但它也可以是具有適當子視窗ID的任何CWnd對象。
一個CSplitterWnd對象通常被嵌入CFrameWnd或CMDIChildWnd父對象。
創建步驟:
1. 在父框架中嵌入一個CSplitterWnd成員變數。
2.重載父框架的CFrameWnd::OnCreateClient成員函式。
3. 從重載的OnCreateClient函式中調用類CSplitterWnd的Create或CreateStatic成員函式。
運用原理
調用Create成員函式可以創建一個動態的分隔器視窗。動態的分隔器視窗通常用於創建和滾動同一文檔的多個窗格或視圖。框架將自動為該分隔器創建一個起始窗格;然後,當用戶操縱該分隔器視窗的控制項時,框架創建,調整大小,並且排列其它的窗格。
當你調用Create時,應指定一個最小行高度和最小列寬度,這兩個最小值被用來確定窗格什麼時候太小以致於不能被完全顯示。在調用了Create之後,你可以通過調用SetColumnInfo和SetRowInfo來調整這些最小值。
你還可以使用SetColumnInfo和SetRowInfo成員函式來給一列設定一個“理想的”寬度,以及給一行設定一個“理想的”高度。當框架顯示一個分隔器視窗時,首先顯示父框架,然後才顯示分隔器視窗。然後,框架從分隔器視窗的客戶區左上角至右下角,根據窗格的理想尺寸以行或列來排放各個窗格。
動態分隔器視窗中的所有窗格都必須是同一個類的窗格。讀者熟悉的支持動態分隔器視窗的應用程式包括Microsoft Word和Microsoft Excel。
使用CreateStatic成員函式可以創建一個靜態分隔器視窗。用戶只能修改靜態分隔器視窗中的窗格的尺寸,但是不能改變其中的窗格序號和次序。
在創建靜態分隔器時必須專門創建該靜態分隔器的所有窗格。你必須在父框架的OnCreateClient成員函式返回之前確保創建了所有窗格,否則,框架將不能正確顯示該視窗。
CreateStatic成員函式將使用為0的最小行高度和最小列寬度來自動初始化一個靜態分隔器。在調用了Create之後,可以通過調用SetColumnInfo和SetRowInfo成員函式來調整這兩個最小值。在調用CreateStatic之後,你也可以使用SetColumnInfo和SetRowInfo成員函式來指定你所希望的理想窗格值。
靜態分隔器中的窗格通常屬於不同的類。給予靜態分隔器視窗的示例,參見圖形編輯器和Windows檔案管理器。分隔器視窗支持特殊的滾動條(除窗格可能帶有的滾動框之外)。這些滾動條是CSplitterWnd對象的子對象並且被窗格共享。
當你創建這個分隔器視窗時,你創建了這些特殊的滾動條。例如,如果一個CSplitterWnd具有一行,兩列,則WS_VSCROLL風格將顯示兩個窗格共享的垂直滾動條。當用戶移動這個滾動條時,WM_VSCROLL訊息將被傳送給兩個窗格。當窗格設定滾動條位置時,這個共享滾動條將被設定。
有關動態分隔器視窗的更多信息,參見“Visual C++程式設計師指南”中的文章“多文檔類型,視和框架視窗”中的“分隔器視窗”;和Visual C++在線上文檔中的“TN029:分隔器視窗”;以及CSplitterWnd類概述。有關如何創建動態分隔器視窗的更多信息,參見“Visual C++在線上教程”中的“在增強視的Scribble中添加分隔器視窗”;和MFC常規示例VIEWEX。
#include
請參閱:CView, CWnd
類成員
構造
CSplitterWnd 構造一個CSplitterWnd對象
Create 創建一個動態的分隔器視窗並將它與一個CSplitterWnd對象連線
CreateStatic創建一個靜態的分隔器視窗並將它與一個CSplitterWnd對象連線
CreateView 在一個分隔器視窗中創建一個窗格
操作符
GetRowCount 返回當前窗格行的計數值
GetColumnCount 返回當前窗格列的計數值
GetRowInfo 返回指定行的信息
SetRowInfo 設定指定行的信息
GetColumnInfo 返回指定列的信息
SetColumnInfo 設定指定列的信息
GetPane 返回位於指定行和列處的窗格
IsChildPane 確定視窗是否是此分隔器視窗的當前子窗格
IdFromRowCol 返回位於指定行和列處的窗格的子視窗ID
RecalcLayout 在調整行或列尺寸後調用此函式來重新顯示該分隔器視窗
GetScrollStyle 返回共享滾動條的風格
SetScrollStyle 為分隔器視窗的共享滾動條指定新的滾動條風格
可重載
OnDrawSplitter 繪製一個分隔器視窗的圖像
OnInvertTracker 繪製一個分隔器視窗的圖像,使它具有與框架視窗相同的大小和形狀
CreateScrollBarCtrl 創建一個共享的滾動條控制項
DeleteView 從分隔器視窗中刪除一個視圖
SplitRow 表明一個框架視窗是否是水平分隔的
SplitColumn 表明一個框架視窗是否是垂直分隔的
DeleteRow 從分隔器視窗中刪除一行
DeleteColumn從分隔器視窗中刪除一列
GetActivePane 根據焦點或框架中的活動視來確定活動窗格
SetActivePane 在框架中設定一個活動窗格
CanActivateNext 檢查Next Pane或Previous Pane命令當前是否有效
ActivateNext執行Next Pane或Previous Pane命令
DoKeyboardSplit 執行鍵盤分隔命令,通常是“Window Split”
DoScroll 執行分隔視窗的同步滾動
DoScrollBy 將分隔視窗滾動給定的像素數
運用實例
1鎖定切分條
當用戶創建好分割視窗後,有時並不希望通過拖動切分條來調節視窗的大小。這時就必須鎖定切分條。鎖定切分條的最簡單的方法莫過於不讓CSplitterWnd來處理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR訊息,而是將這些訊息交給CWnd視窗進行處理,從而禁止掉這些訊息。拿WM_LBUTTONDOWN處理過程來說。修改為如下: void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point){
CWnd::OnLButtonDown(nFlags,point);
}
其餘的處理方法類似。
2切分條的定製
由Window自己生成的切分條總是固定的,沒有任何的變化,我們在使用一些軟體比如ACDSee的時候卻能發現它們的切分條卻是和自動生成的切分條不一樣的。那么如何定製自己的切分條呢?通過重載CSplitterWnd的虛方法OnDrawSplitter和OnInvertTracker可以達到這樣的目的。下面的代碼生成的效果是分割視窗的邊界顏色為紅色,分割條的顏色為綠色.代碼如下:void CSplitterWndEx::OnDrawSplitter(CDC *pDC, ESplitType nType, const CRect &rectArg){ if(pDC==NULL)
{RedrawWindow(rectArg,NULL,RDW_INVALIDATE|RDW_NOCHILDREN);
return;
}
ASSERT_VALID(pDC);
CRect rc=rectArg;
switch(nType)
{
case splitBorder:
//重畫分割視窗邊界,使之為紅色
pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));
rc.InflateRect(-CX_BORDER,-CY_BORDER);
pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));
return;
case splitBox:
pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
rc.InflateRect(-CX_BORDER,-CY_BORDER);
pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
rc.InflateRect(-CX_BORDER,-CY_BORDER);
pDC->FillSolidRect(rc,RGB(0,0,0));
pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
return;
case splitBar:
//重畫分割條,使之為綠色
pDC->FillSolidRect(rc,RGB(255,255,255));
rc.InflateRect(-5,-5);
pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));
return;
default:
ASSERT(FALSE);
}
pDC->FillSolidRect(rc,RGB(0,0,255));
}
void CSplitterWndEx::OnInvertTracker(CRect &rect)
{
ASSERT_VALID(this);
ASSERT(!rect.IsRectEmpty());
ASSERT((GetStyle()&WS_CLIPCHILDREN)==0);
CRect rc=rect;
rc.InflateRect(2,2);
CDC* pDC=GetDC();
CBrush* pBrush=CDC::GetHalftoneBrush();
HBRUSH hOldBrush=NULL;
if(pBrush!=NULL) hOldBrush=(HBRUSH)SelectObject(pDC->m_hDC,pBrush->m_hObject); pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),BLACKNESS);
if(hOldBrush!=NULL)
SelectObject(pDC->m_hDC,hOldBrush);
ReleaseDC(pDC);
}