一、基本的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)
{
//
TODO: 在此添加專用代碼和/或調用基類
m_mysplitter1.CreateStatic(this,
1, 2); //建立一個一行二列的分割視窗
m_mysplitter1.CreateView(0,
0, RUNTIME_CLASS(CViewLeft), CSize(0, 0),
pContext); //建立第0行第0列的視圖
m_mysplitter1.CreateView(0, 1, RUNTIME_CLASS(CViewRight), CSize(0, 0),
pContext); //建立第0行第1列的視圖
m_mysplitter1.SetColumnInfo(0,
250, 10); //設定某列的寬度,這裡表示設定第0列的理想寬度為250像素,最小寬度為10像素(什麼是最小寬度?沒弄明白)
return
TRUE;
//return
CFrameWnd::OnCreateClient(lpcs, 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,
1. 輕按兩下分隔欄展開或者收起左邊的一欄
重載OnLButtonDblClk函數:
void CMySplitterWnd::OnLButtonDblClk(UINT nFlags, CPoint point)
TODO: 在此添加消息處理程式代碼和/或調用預設值
//CSplitterWnd::OnLButtonDblClk(nFlags,
point);
int left, min;
GetColumnInfo(0, left, min); //得到第0欄(即左邊的一欄)的寬度
if(left == 0 || left == min) //如果目前已經是收起的狀态
{
SetColumnInfo(0,
250, 10); //重新設定左邊一欄的寬度,這裡設定為250,即展開
}
else
0, 10); //重新設定左邊一欄的寬度,這裡設定為0,即收起
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)
// TODO: 在此添加消息處理程式代碼和/或調用預設值
//CSplitterWnd::OnLButtonDown(nFlags, point);
(2)重載OnMouseMove函數,也改成什麼都不做:
void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
// TODO: 在此添加消息處理程式代碼和/或調用預設值
//CSplitterWnd::OnMouseMove(nFlags, point);
使用CSplitterWnd分割視窗(二)