Имею приложение WIN32. Его главное окно - hwndMain
, одно из его дочерних окон - hwndView
. На hwndView
есть одна вкладка hwndTab
.
Когда я изменяю размер hwndMain
, изменяется hwndView
, равно как и hwndTab
. Он немного мерцает, но не сильно.
Я пробовал использовать стиль WS_EX_COMPOSITED
(для hwndView
или hwndTab
), но это дало мне пустое окно. Я попытался использовать WS_EX_TRANSPARENT
, и он решает проблему мерцания, но когда размер окон увеличивается, дочерние элементы обновляются очень медленно, например, я вижу черную область в течение одной секунды, затем область обновляется.
Я успешно решил проблему мерцания для TreeView
, используя стиль WS_CHIPCHILDREN
. (См. Примечание ниже). Но использование WS_CHIPCHILDREN
стиля для hwndView
не решает проблему мерцания для управления вкладками.
Я также обратил внимание на WM_ERASEBKGND
и Not set hbrBackground
.
Я хочу использовать двойной буфер для управления вкладками, но я не могу найти учебник для этой цели. Все учебные материалы, которые я нашел: В WM_PAINT
, после создания CompatibleDC
и CompatibleBitmap
, нарисуйте то, что хотите, в memdc
и .....; Но я не хочу делать какие-либо специальные чертежи в WM_PAINT
для hwndTab
. Я просто хочу, чтобы вкладка выполняла эту работу, но показывала только окончательный результат.
Может ли кто-нибудь показать мне небольшой пример того, как дважды буферизовать элемент управления табуляцией (если вы думаете, что это устранит проблему мерцания элемента управления табуляцией) на языке c
+ winapi
, поскольку я не знаю C #, Net ,. .и т.д.
Примечание: для моего TreeView это дочерний элемент окна hwndContainer
. Он создан как:
win->hwndContainer = CreateWindowEx(
WS_CLIPCHILDREN,
_T("SUMATRA_PDF_TOCBOX"), NULL,
WS_CHILD,
0, 0, gGlobalPrefs.sidebarDx, 0,
win->hwndPanel, NULL,
ghinst, NULL);
Использование WS_CLIPCHILDREN
исправляет мерцание, даже если я не использую двойной буфер. Но странно ставить WS_CLIPCHILDREN
на позицию первого параметра. Если поставить после WS_CHILD, т.е.
win->hwndContainer = CreateWindowEx(
NULL,
_T("SUMATRA_PDF_TOCBOX"), NULL,
WS_CHILD | WS_CLIPCHILDREN,
0, 0, gGlobalPrefs.sidebarDx, 0,
win->hwndPanel, NULL,
ghinst, NULL);
, то мерцание все еще происходит.
Поэтому я также пытался использовать первый способ, когда создавал hwndView
, но он просто давал пустое белое окно. Я действительно запутался в этих вещах.
Вот изображение пустого окна, когда я использовал WS_EX_COMPOSITED
для hwndView
. Когда я использовал его для hwndContainer
, такой проблемы не было.
На самом деле hwndView
имеет два дочерних элемента: элемент управления табуляцией hwndTab
и дочерний элемент, который имеет собственный двойной буфер и рисунок. Я не уверен, что это является причиной проблемы с использованием WS_EX_COMPOSITED
.