мерцание на вкладке управления - WIN32

Имею приложение 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.

введите описание изображения здесь


person user565739    schedule 06.08.2012    source источник


Ответы (1)


Вы используете стиль WS_EX_COMPOSITED. Когда вы передаете WS_CLIPCHIDREN в качестве первого аргумента CreateWindowEx, он интерпретирует значение WS_CLIPCHILDREN как расширенный стиль окна. Поскольку значение WS_CLIPCHILDREN равно 0x02000000L, то же самое, что и WS_EX_COMPOSITED, вы только что создали составное окно.

А в составном окне, согласно документации, все его потомки нарисованы в порядке отрисовки снизу вверх с использованием двойной буферизации.

Я не понимаю, что вы имеете в виду, когда говорите:

Я попытался использовать стиль WS_EX_COMPOSITED (для hwndView или hwndTab), но он просто дал мне пустое окно.

Вам нужно будет опубликовать код, воспроизводящий эту проблему. Но ваш предпоследний фрагмент кода создает составное окно.

person Cody Gray    schedule 06.08.2012
comment
Нет, я не совмещал WS_EX_COMPOSITED с WS_CLIPCHIDREN. Сначала я попробовал (для hwndView) WS_EX_COMPOSITED в одиночку, но это дало мне белое пустое окно. Затем я попробовал WS_CLIPCHILDREN в третьем параметре, то есть WS_CHILD | WS_CLIPCHILDREN, проблем нет, но проблема мерцания не устранена. - person user565739; 06.08.2012
comment
Но после вашего объяснения я знаю, почему это работает для TreeView, когда я помещаю WS_CLIPCHILDREN в первый параметр. - person user565739; 06.08.2012