MFC: Как избежать мерцания в обновлениях дочернего контроля? - PullRequest
3 голосов
/ 10 октября 2011

Я гуглял уже несколько дней, и все, что я получаю, это одни и те же ответы, но это не то, что я хочу (позже я опишу то, чего не хочу).

ЧтоЯ хочу это:

  • Скажем, у меня есть родительский диалог, который имеет несколько дочерних элементов управления CStatic.
  • Родительское диалоговое окно использует черный в качестве фона, когда оно находится в фокусе, и серый, когда оно не в фокусе.
  • Дочерние статические элементы управления просто отображают текст, но его фон должен соответствовать цвету фона родителя

Проблема:

  • Я могу заставить дочерние элементы управления всегда отслеживать цвет родителя, однако процесс обновления цвета идет медленно и вызываетмерцание.
  • Когда я делаю диалоговое окно для фокусировки, я вижу, как диалоговое окно меняет свой цвет с серого на черный, затем каждый текстовый элемент управления также меняется с серого на черный.
  • Этомедленный, потому что он на встроенном устройстве.

Двойная буферизация не будет работать, потому что у родителя и потомка есть своя собственная процедура рисования, поэтому я думаю, что невозможно использовать один и тот же буфер.Я читал, что WS_EX_COMPOSITE или что-то работает для Vista, но я на более низкой ОС.

Что мне не нужно:

  • Я ужепонять, как переопределить процедуру фонового стирания (вот почему я уже получаю обновления для элементов управления)
  • Я знаю, как использовать CMemDC в целом, но, как уже говорилось, в моем случае это не будет работать.

Есть идеи, ребята?Я уверен, что скорость обработки играет определенную роль, но я твердо верю, что это просто техника или настройка, которую я делаю неправильно.Я помню, что мой первый компьютер был 133 МГц, но я не помню, чтобы Windows 95 обновляла элементы управления по одному, когда их родитель теряет фокус - они обновляются почти мгновенно.И у меня даже тогда не было хорошей видеокарты.

Пожалуйста, помогите.

Дополнения: - Я попытался сделать BkMode элементов управления прозрачным и даже использовать NULL_BRUSH,Все это вместе с ON_WM_CTLCOLOR.То, что я получил, - это просто диалог с отверстиями, и в этих отверстиях находится контрольный текст.Другими словами, вместо фона элемента управления просто не было нарисовано (как ожидалось из NULL_BRUSH), но эта область также не была покрыта заданием рисования диалога.- Я думаю об удалении WS_CLIPCHILDREN, но я верю, что это в любом случае приведет к перерисовке элементов управления, поэтому снова мигайте.

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Вы пробовали SetRedraw ()?Вы можете вызвать SetRedraw (FALSE) для дочерних окон, чтобы они не обновлялись каждый раз, когда вы меняете родителя, и когда родительское редактирование завершено, вы можете, наконец, вызвать SetRedraw (TRUE) для дочерних элементов - и, возможно, сделать его недействительным, чтобы они сами обновились.только один раз.

0 голосов
/ 15 февраля 2012

Я сделал это раньше, переопределив фон стирания диалога. Затем, вместо вызова функции по умолчанию, вы подготавливаете область, пересекаете все дочерние элементы диалогового окна и выделяете их границы из области. В конце вы заполняете прямоугольник цветом фона диалога.

По сути, идея состоит в том, чтобы стирать только там, где нет элементов управления.

Это было бы, но я не уверен, есть ли лучший способ сделать это. Например, опция «clip children», или я считаю, что был стиль двойной буферизации.

0 голосов
/ 10 октября 2011

Вы пытались переопределить WM_CTLCOLOR?Проверьте мой ответ на этот пост

Примечание: Вы можете установить цвет фона статического элемента управления, используя pDC->SetBkColor и возвращая кисть с нужным вам цветом.

...