CSplitterWnd с двумя панелями: левая панель - это CTreeView, правая - это CFrameWnd: не удается установить другие виды на правой панели.
Я пытаюсь реализовать классический вид приложения 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 ответ
Решение
Вы должны разместить пользовательский вид непосредственно в правой части окна сплиттера, а не внутри 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;
}