CSplitterWnd с двумя панелями: левая панель - это CTreeView, правая - это CFrameWnd: не удается установить другие виды на правой панели. - PullRequest
0 голосов
/ 10 марта 2011

Я пытаюсь реализовать классическое приложение Windows Explorer, CpliterWnd имеет две панели: Левая панель - CLeftTreeView: общедоступная CTreeView Правой панелью является CRightPaneFrame: общедоступный CFrameWnd, CRightPaneFrame имеет переменную-член m_pCustomView.

CustomView - это класс, добавленный в ресурс диалога (отредактированный с помощью редактора ресурсов и мастера добавления классов)

class CustomView : public CFormView
{

DECLARE_DYNCREATE(CustomView)

public:  // Changed to public so that i can instantiate this view on heap
CustomView();           // protected constructor used by dynamic creation
virtual ~CustomView();
BOOL Create(LPCTSTR A, LPCTSTR B, DWORD C,
    const RECT& D, CWnd* E, UINT F, CCreateContext* G); // To override the protected specifier of CFormView::Create()

MainFrame.cpp имеет следующую запись

if (!m_SplitterWnd.CreateView(0, 0, RUNTIME_CLASS(CLeftTreeView), CSize(125, 100),   pContext) ||  !m_SplitterWnd.CreateView(0, 1, RUNTIME_CLASS(CRightPaneFrame), CSize(100, 100), pContext))    
{
     m_SplitterWnd.DestroyWindow();
     return FALSE;
}

и позже в CRightPaneFrame

BOOL CRightPaneFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
    // TODO: Add your specialized code here and/or call the base class
    m_pCustomView = new CustomView;
    m_pCustomView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,VIEW_CUSTOM, pContext);
    SetActiveView(m_pCustomView);
    m_pCustomView->ShowWindow(SW_NORMAL);
    RecalcLayout();
    return true;
}

Я не знаю, что я делаю неправильно, но CustomView не загружается в нужную панель.

Любые предложения по изменению подхода или Что не так с текущим подходом ??

1 Ответ

0 голосов
/ 14 марта 2011

Вы должны поместить пользовательский вид непосредственно в правую часть окон разделителя, а не внутри CFrameWnd.

if (!m_SplitterWnd.CreateView(0, 0, RUNTIME_CLASS(CLeftTreeView), CSize(125, 100), pContext) 
|| !m_SplitterWnd.CreateView(0, 1, RUNTIME_CLASS(CCustomView), CSize(100, 100), pContext))

{
    m_SplitterWnd.DestroyWindow();
    return FALSE;
}
...