Как я могу разделить CDockablePane? - PullRequest
0 голосов
/ 25 августа 2011

Как я могу разделить CDockablePane на две части, точно так же, как "Class View" в VS2010 IDE?
Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 04 ноября 2012

расширить CSplitterWndEx следующим образом:

class CPaneSplitter : public CSplitterWndEx
{
 public :
    BOOL AddWindow(int row, int col, CWnd* pWin,CString clsName, 
    DWORD dwStyle,DWORD dwStyleEx, SIZE sizeInit);
};

добавить следующий член в MyDockablePaneClass

CTreeCtrl m_wndTree 
CListCtrl m_wndList 
CPaneSplitter wndSplitter

OnCreate MyDockablePaneClass выглядит следующим образом:

int MyDockablePaneClass::OnCreate(LPCREATESTRUCT lp)
{
if(CDockablePane::OnCreate(lp)==-1)
        return -1;
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT 
        | TVS_HASBUTTONS |TVS_EDITLABELS;
    DWORD dwStyleEx = 0;
    m_wndSplitter.CreateStatic(this,2,1);
    if(!m_wndSplitter.AddWindow(0,0,&m_wndTree,WC_TREEVIEW,dwStyle,
dwStyleEx,CSize(100,100)))
        return -1;

    dwStyle = WS_CHILD | WS_VISIBLE | LVS_ICON  | LVS_SHAREIMAGELISTS;
    dwStyleEx =  0;
             if(!m_wndSplitter.AddWindow(1,0,&m_wndList,WC_LISTVIEW,dwStyle
,dwStyleEx,CSize(100,100)))
        return -1;


    if(!m_toolbar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_REFTREE))
    {
        TRACE0("Failed to create RefTreePane Toolbar Control\n");
        return -1;
    }
    m_toolbar.LoadToolBar(IDR_REFTREE, 0, 0, TRUE /* Is locked */);
    m_toolbar.SetPaneStyle(m_toolbar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
    m_toolbar.SetPaneStyle(m_toolbar.GetPaneStyle() & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
    m_toolbar.SetOwner(this);
    // All commands will be routed via this control , not via the parent frame:
    m_toolbar.SetRouteCommandsViaFrame(FALSE);
    return 0;
}

добавить хендлер для OnSize следующим образом

void MyDockablePaneClass::OnSize(UINT type,int cx,int cy)
{
    CDockablePane::OnSize(type, cx, cy);
    int cyTlb = m_toolbar.CalcFixedLayout(FALSE, TRUE).cy;
    CRect rectClient;
    GetClientRect(rectClient);
    m_toolbar.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width()
    , cyTlb,SWP_NOACTIVATE | SWP_NOZORDER);
    m_wndSplitter.SetRowInfo(0,(cy-cyTlb)/2,25);
    m_wndSplitter.SetRowInfo(1,(cy-cyTlb)/2,25);
    m_wndSplitter.SetWindowPos(NULL,rectClient.left
    , rectClient.top + cyTlb
    , rectClient.Width()  , rectClient.Height() - cyTlb , SWP_NOZORDER | SWP_NOACTIVATE);
}

Примечание: я добавляю обработчик для позиционирования панели инструментов в обработчике onSize, если у вас нет панели инструментов, удалите код и предположите, что cyTlb = 0

удачи

0 голосов
/ 27 июня 2012

Class View кажется CDockablePane, но то, что разделяет верхнюю и нижнюю часть Class View, похоже, не имеет ничего общего с CDockablePanes, а является разделителем. Я успешно сделал это, используя очень маленький класс, полученный из CSplitterWndEx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...