WTL CSplitterWindow 修改

來源:互聯網
上載者:User

WTL的分割視窗CSplitterWindow非常好用。具體參見我的
http://data.blueanywhere.cn/wtl/ 第7章節

但美中不足的是有兩點:

  1. 沒有設定移動範圍
  2. 雙擊分隔條每次都是預設置中分隔,其實這個很多時候不是本意,雙擊應該是最恰當的而不是最置中的。

幸好WTL全部有代碼,小修小補一下即可滿足以上要求。開啟相關的檔案:c:\YourWTL\include\atlsplit.h

紅色是修改部分 

 

1.增加內部變數

class CSplitterImpl{public:enum { m_nPanesCount = 2, m_nPropMax = 10000 };HWND m_hWndPane[m_nPanesCount];RECT m_rcSplitter;int m_xySplitterPos;int m_nDefActivePane;int m_cxySplitBar;              // splitter bar width/heightstatic HCURSOR m_hCursor;int m_cxyMin;                   // minimum pane sizeint m_cxyMax;//【修改之處】cxyMax = -1 就是沒設定,和原來一樣int m_cxyMid;//【修改之處】cxyMid = -1 就是沒,和原來一樣int m_cxyBarEdge;              // splitter bar edgebool m_bFullDrag;int m_cxyDragOffset;int m_nProportionalPos;bool m_bUpdateProportionalPos;DWORD m_dwExtendedStyle;       // splitter specific extended stylesint m_nSinglePane;             // single pane mode

 

 2. 初始化

 

// ConstructorCSplitterImpl() :m_xySplitterPos(-1), m_nDefActivePane(SPLIT_PANE_NONE), m_cxySplitBar(0), m_cxyMin(0),m_cxyMax(-1),m_cxyMid(-1),//【修改之處】m_cxyBarEdge(0), m_bFullDrag(true), m_cxyDragOffset(0), m_nProportionalPos(0), m_bUpdateProportionalPos(true),m_dwExtendedStyle(SPLIT_PROPORTIONAL),m_nSinglePane(SPLIT_PANE_NONE)

 

 3.雙擊處理

LRESULT OnLButtonDoubleClick(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/){T* pT = static_cast<T*>(this);if (m_cxyMid == -1 ) {//【修改之處】pT->SetSplitterPos();   // middle}else {pT->SetSplitterPos(m_cxyMid,true);//【修改之處】}return 0;}

4.移動範圍設定 SetSplitterPos

bool SetSplitterPos(int xyPos = -1, bool bUpdate = true){if(xyPos == -1)   // -1 == middle{if(t_bVertical)xyPos = (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) / 2;elsexyPos = (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge) / 2;}// Adjust if out of valid rangeint cxyMax = 0;if (m_cxyMax == -1 ) {//【修改之處】if(t_bVertical)cxyMax = m_rcSplitter.right - m_rcSplitter.left;elsecxyMax = m_rcSplitter.bottom - m_rcSplitter.top;}else {//【修改之處】if(t_bVertical)cxyMax = ((m_rcSplitter.right - m_rcSplitter.left)>m_cxyMax?m_cxyMax:(m_rcSplitter.right - m_rcSplitter.left));//【修改之處】elsecxyMax = ((m_rcSplitter.bottom - m_rcSplitter.top)>m_cxyMax?m_cxyMax:(m_rcSplitter.bottom - m_rcSplitter.top));//【修改之處】}if(xyPos < m_cxyMin + m_cxyBarEdge)xyPos = m_cxyMin;else if(xyPos > (cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin))xyPos = cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin;

設定一下編譯通過了。我的應用程式裡這麼處理,初始化一下系統變數

 

CSplitterWindow  m_wndVertSplit;.......m_wndVertSplit.m_cxySplitBar = 1;m_wndVertSplit.m_cxyMin = 80;m_wndVertSplit.m_cxyMax = 480;m_wndVertSplit.m_cxyMid = 200;

 

然後分割條就只能在80-480之間移動了,雙擊分割條,自動回復到200的位置,而不是原來的中間位置。

 

以上修改在 Visual C++ 6.0 WTL 8.0 通過
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.