Привет All.
Вопрос достаточно сложный поэтому начну издалека. Имеется DLL, в которой находится
документ/отображение. Отображение представляет собой окно разделенное на две части
сплиттером. Левая часть CTreeView. С ней все ясно. Правая не однозначно
зафиксированная. Это может быть и CFormView и CListView. Изменение правой части
происходит по щелчку по узлу дерева.
Обработчик события TVN_SELCHANGED для дерева:
void CProjectTree::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HWND mhw = ::GetParent(this->m_hWnd);
::PostMessage (::GetParent(mhw),WM_USER+10,0,pNMTreeView->itemNew.lParam);
mhw = NULL;
*pResult = 0;
}
Сообщение WM_USER+10 попадает в CChildFrame, где и происходит подмена.
Глобальный массив viewarr содержит:
viewarr[0] = RUNTIME_CLASS(CDLLDocumentView);
viewarr[1] = RUNTIME_CLASS(CTestForm);
LRESULT CChildFrame::OnMyMessage(WPARAM wp, LPARAM lp)
{
if (lp==0) return 1;
int WindowId = 0;
switch(lp)
{ case 1: WindowId = 0; break;
case 2: WindowId = 1; break;
}
if ((WindowId!=CurrentViewId)&&(lp<3))
{
m_wndSplitter.DeleteView(0, 1);
// Вот эта строка срабатывает.
// AfxSetResourceHandle(((CMyMultiDocTemplate*)pCtx.m_pNewDocTemplate)->m_hInst);
// А вот эта вызывает ошибку связанную с картай указателей (CPtrMap или что-то похожее).
// AFX_MANAGE_STATE(AfxGetStaticModuleState()) ;
pCtx.m_pLastView = (CView*)viewarr[WindowId];
pCtx.m_pNewViewClass = viewarr[WindowId];
m_wndSplitter.CreateView(0, 1,viewarr[WindowId], CSize(270, 150), &pCtx);
//m_wndSplitter.SetActivePane(0,0,(CWnd*)viewarr[WindowId]);
CRect rect;
GetClientRect(rect);
SetWindowPos(&wndTop,0,0,rect.right+8+k,rect.bottom+27,SWP_NOMOVE);
CurrentViewId = WindowId;
k *= -1;
}
return 1;
}
И все было бы замечательно, только это срабатывает только 1 раз. С 1-го -> 2-ой,
а при замене второго вида 1-м у первого не отрабатываются события. Не происходит
отрисовки, ресайза и т.п.
Что посоветует всезнающий ALL?