Есть ли способ приостановить рендеринг CTreeCtrl
или его CTreeView
во время дорогостоящей операции, например, развернуть/свернуть все узлы в дереве? Если для него нет функции, например, PauseRendering(TRUE)
или что-то подобное, возможно ли перехватить сообщение об рисовании и только переслать его на дерево, если мой метод ExpandAll не был вызван?Пауза Рендеринг/Рисование CTreeCtrl (MFC)
ответ
Вы можете использовать WM_SETREDRAW
сообщений: при отправке с wParam
в FALSE
это предотвратит окно от получения WM_PAINT
сообщений; при отправке с wParam
в TRUE
он будет установлен в нормальное состояние.
Не забудьте вручную перерисовать окно после того, как вы сделали, потому что это не делается автоматически:
RedrawWindow(hWnd, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN);
Спасибо! Я окружил вызовы метода '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
Моя единственная проблема теперь в том, что вертикальная полоса прокрутки для древовидного представления все еще рисуется во время всего этого процесса (и выглядит неустойчивым, потому что метод «ExpandAll» рекурсивный). Но это проблема пользовательского интерфейса, а не скорость. – aguazales
У меня была такая же проблема в течение длительного времени, когда вертикальная полоса прокрутки появлялась и исчезала, даже когда 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); } ' Не знаю, почему я не думал об этом много лет назад :-) –
- 1. Кнопка в столбце MFC CtreeCtrl
- 2. Изменить порядок объекта CTreeCtrl путем перетаскивания, MFC
- 3. Как включить или отключить узел в CTreeCtrl в MFC?
- 4. как обработать событие изменения состояния CTreeCtrl в MFC
- 5. MFC CTreeCtrl CustomDraw CDIS_HOT стиль изменения шрифта не удалось
- 6. C++ MFC - CTreeCtrl - Разница между SelectItem и SetItemState
- 7. Использование обработчика OnBegindrag с CTreeCtrl
- 8. Получение идентификатора экземпляра CTreeCtrl снова
- 9. Изменение цвета выбранного объекта CTreeCtrl?
- 10. Confused о CWnd :: OnLButtonDown() и CTreeCtrl :: OnLButtonDown()
- 11. Как прокрутить объект CTreeCtrl до центра
- 12. Интерфейс MFC с tabControl
- 13. Проблема с TVN_SELCHANGED на объекте CTreeCtrl
- 14. CTreeCtrl с темой проводника, не поддерживаемой DPI
- 15. Как получить событие Click Treeview (CTreeCtrl) в MFC, созданное во время выполнения?
- 16. Добавить значок для конкретных элементов дерева в Tree (CTreeCtrl) в MFC
- 17. Как программно завершить редактирование CTreeCtrl?
- 18. Добавление элемента в CTreectrl C++
- 19. CTreeCtrl Checkbox Состояние дочернего элемента
- 20. CTreeCtrl SelectItem не выбирает элемент
- 21. Пользовательский ничья CTreeCtrl: как добавить удар шрифта через?
- 22. Выберите пункт дерева TreeView в MFC
- 23. CTreeCtrl - изменение своей позиции без перемещения всей площади
- 24. MFC TVN_ITEMEXPANDING не вызывает функцию обработчика
- 25. Монастырь Пауза
- 26. CountDownTimer Пауза
- 27. Пауза UILocalNotification
- 28. Пауза итерации
- 29. AVCaptureSession пауза?
- 30. Пауза NSOperation
Похоже, работа для потоков. –
Возможно, это правда, но я довольно новичок в C++ и совершенно новичок в MFC, поэтому я не уверен, что это будет хорошая идея, потому что у меня есть крайний срок для этой вещи. – aguazales