Здравствуйте, Carc, Вы писали:
C>Здравствуйте, Hex65, Вы писали:
H>>Здравствуйте, Carc, Вы писали:
C>>>Ох...
C>>>CMatrixTreeView::OnSelectCommand...
C>>>какое-то оконное сообщение обрабатывает? Что это за мистическая "активация окна"?
H>>это прилетает постмессадж посланный из MainFrame перед самым выходом из OnTreeMatrix() — создание CView — моего CSpltterWnd с вложенным CTreeView.
H>>ON_COMMAND(ID_MATRIX, OnTreeMatrix);
H>>Попробую избавиться от этого
.
C>Та не! Ни то!
C>Я как бы типа догадывался что всё это WM_COMMAND сообщение — но оно откуда то берется? Меню, кнопка, сами шлете? Откуда!
C>Хочеться понять, что если есть PostMessage, то как то он образуется. Вопрос когда? На каком действии пользователя? Ну я не знаю, к примеру, потеря фокуса CView, какой-нить WM_MOUSEMOVE — т.е. по большому счету должно быть некоторое событие от пользователя (пошел в другой вид), и отсюда вся цепочка (тоже к примеру) WM_KILLFOCUS а там PostMessage(WM_COMMAND) и.т.д.
C>Полагаю что проблема именно в этом самом событии изначальном. Ну или вариант руками отрисоваться (SetWindowPos+SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED) или те же RedrawWindow.
C>Или надо смотреть в код, какая то странная проблема — дерево "дергается" явно не в тот момент, когда должно "дергаться" настоящее (true) по попу дерявянное и неслабо написанное дерево. Из постов выше скадывается ощущение какой-то архитектурной "неловкости" — что-то вдруг всё выкладывается, то вдруг обратно закладывается... Ну да про архитектуру "горе-советников" много, поэтому и не стоит заморачиваться. Но ощущение, что проявляется она именно в том, что не нужный момент дерево сворачивается\разворачиватся...
C>Вот собственно начальный момент какой? PostMessage это всё следствия — это нюансы, не в них дело!
Спасибо за участие в разборе проблемы.
Во-первых, мне самому не нравится эта реализация, но остановился на ней т.к. более правильную(?) решить не удалось.
ОК. Отступление: Сначала о исходной задаче. Ранее уже обсуждалось здесь.
Мне нужно иметь переключаемые деревья, по комбобоксу из одного окна переключаться между деревьями. Удалять деревья нежелательно, т.к важны статусы элементов. Попытка реализовать несколько CTreeCtrl в одном CTreeView не удалась. Потому решил при переключении сохранять/восстанавливать.
Если попробовать еще раз, то сейчас пришла след мысль на реализацию: при переключении CTreeCtrl Detach/Attach либо Create & Fill.
Плохо, что в системе будет фактически несколько ресурсов-CTreeCtrl, а один — только их wrapper класс.
Во-вторых, дерево наполняется и/или восстанавливается в одной функции, на одном сообщении, и после восстановления функционирует номально, а после чзаполнения — нет. Наполнять приходится, когда переключаемся к дереву, которое еще не загружали. Эта основная непонятка, Чем наполнение отличается от восстановления. (посмотрю еще когда именно восстанавливается работоспособность дерева).
Могу первое наполнение сделать в OnInitialUpdate(), но переключение между деревьями в последующем через сообщение необходимо.
Уже писал, что фактически нет перерисовки вообще, включая сколбар, но обработка реакции есть. И вставив везде Invalidate() отрисовка есть, а скролбара все-равно нет.
Попробую вникнуть в Ваше предложение.
Не понимаю, как определить начальный момент и что Вы под ним понимаете.
OnTreeMatrix — функция обработки МЕНЮ, далее ее код:
void CMainFrame::OnTreeMatrix()
{
if (0 == m_pMatrixTreeDblViewTemplate)
{
m_pMatrixTreeDblViewTemplate = new CMultiDocTemplate(
IDR_BASEADMTYPE,
RUNTIME_CLASS(CLdbAdmDoc), // document class
RUNTIME_CLASS(CMyChildFrame), // child frame - реализован на CSplitterWnd
RUNTIME_CLASS(CMatrixView)); // one from 3 CView: CSelectView, CTreeView, CMatrixView
}
CBaseAdmDoc *doc = GetBaseDocument();
CMatrixView *mView = doc->GetMatrixView();
if (mView)
{
// allready opened => activate & return
return;
}
CMDIChildWnd* pActiveChild = MDIGetActive();
CMatrix *matrix = doc->CreateMatrix(typeMView);
CFrameWnd* pFrame = m_pMatrixTreeDblViewTemplate->
CreateNewFrame(pDocument, pActiveChild);
CMatrixSelectView *aView = ...;
CMatrixTreeView* tree1 = ...;
CMatrixTreeView* tree2 = ...;
// call OnInitinalUpdate() of views
m_pMatrixTreeDblViewTemplate->InitialUpdateFrame(pFrame, doc);
pFrame->SetActiveView(mView);
LONG selectedId = matrix->GetId();
aView->PostMessage(WM_MATRIXVIEW_SELECT_MSG, 0, selectedId);
tree1->PostMessage(WM_MATRIXVIEW_SELECT_MSG, 0, selectedId);
tree2->PostMessage(WM_MATRIXVIEW_SELECT_MSG, 0, selectedId);
}
Буду рад услышать Ваши идеи, где я туплю

.