Re[14]: Отсутствие перерисовки в CTreeView. MFC bug?
От: Hex65  
Дата: 27.11.08 09:48
Оценка:
Здравствуйте, 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);
}


Буду рад услышать Ваши идеи, где я туплю .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.