天天看點

【VS開發】CSplitterWnd的定制使用

一、基本的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分割視窗(二)