2013-07-03 3 views
1

Есть ли способ приостановить рендеринг CTreeCtrl или его CTreeView во время дорогостоящей операции, например, развернуть/свернуть все узлы в дереве? Если для него нет функции, например, PauseRendering(TRUE) или что-то подобное, возможно ли перехватить сообщение об рисовании и только переслать его на дерево, если мой метод ExpandAll не был вызван?Пауза Рендеринг/Рисование CTreeCtrl (MFC)

+0

Похоже, работа для потоков. –

+0

Возможно, это правда, но я довольно новичок в C++ и совершенно новичок в MFC, поэтому я не уверен, что это будет хорошая идея, потому что у меня есть крайний срок для этой вещи. – aguazales

ответ

4

Вы можете использовать WM_SETREDRAW сообщений: при отправке с wParam в FALSE это предотвратит окно от получения WM_PAINT сообщений; при отправке с wParam в TRUE он будет установлен в нормальное состояние.

Не забудьте вручную перерисовать окно после того, как вы сделали, потому что это не делается автоматически:

RedrawWindow(hWnd, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN); 
+0

Спасибо! Я окружил вызовы метода 'ExpandAll' с помощью' Tree-> SendMessage (WM_SETREDRAW, FALSE) 'и' Tree-> SendMessage (WM_SETREDRAW, TRUE) ', и он значительно ускорил его. Отмечу, что метод 'CWnd :: RedrawWindow' принимает только 3 параметра при вызове из CTreeView (без hWND). 'RedrawWindow (NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE)' работал для меня. Еще раз спасибо за вашу помощь. – aguazales

+0

Моя единственная проблема теперь в том, что вертикальная полоса прокрутки для древовидного представления все еще рисуется во время всего этого процесса (и выглядит неустойчивым, потому что метод «ExpandAll» рекурсивный). Но это проблема пользовательского интерфейса, а не скорость. – aguazales

+2

У меня была такая же проблема в течение длительного времени, когда вертикальная полоса прокрутки появлялась и исчезала, даже когда SetRedraw была ложной, поэтому я, наконец, решил что-то сделать! Решение на удивление просто (мой класс получен непосредственно из CTreeCtrl): 'CMyTreeCtrl :: DisableRedraw() { SetRedraw (FALSE); ModifyStyle (NULL, TVS_NOSCROLL); } CMyTreeCtrl :: EnableRedraw() { ModifyStyle (TVS_NOSCROLL, NULL); SetRedraw (TRUE); RedrawWindow (NULL, NULL, RDW_NOCHILDREN | RDW_UPDATENOW | RDW_INVALIDATE); } ' Не знаю, почему я не думал об этом много лет назад :-) –

Смежные вопросы