ВВЕДЕНИЕ И СООТВЕТСТВУЮЩАЯ ИНФОРМАЦИЯ:
Я реализовал сложную отрисовку фона главного окна и его дочерних статических элементов управления.
На картинке ниже показано, как это выглядит.
Статические элементы управления имеют стиль SS_NOTIFY
, что важно упомянуть, так как определенные вещи происходят, когда пользователь нажимает на них.
На данный момент действия, активируемые при нажатии на них, не имеют значения.
И главное окно, и статические элементы управления имеют градиентный фон, который был создан с использованием GradientFill(...)
API.
Верхний баннер главного окна создан серой кистью, а линии сетки созданы с помощью LineTo(...)
и MoveTo(...)
API.
Карта на оранжевом статическом элементе управления и верхний левый логотип — это EMF
файлов, верхний правый логотип — это PNG
файл, а остальные изображения — это растровые изображения.
Оранжевый статический элемент управления имеет 4 дочерних статических элемента управления, которые имеют owner drawn
и стиль SS_NOTIFY
.
Это был единственный способ, который я мог придумать, который позволил мне нарисовать элемент управления так, как меня просили (если я могу улучшить это, пожалуйста, предложите это, я приму любое разумное предложение).
Чтобы нарисовать оранжевый статический элемент управления, я решил нарисовать его фон в обработчике WM_CTLCOLORSTATIC
, а владельцу нарисовать дочерние статические элементы управления в процедуре подкласса.
Уведомления, полученные от дочерних статических элементов управления, также обрабатываются в процедуре подкласса оранжевых статических элементов управления, так как я не знал, как их пересылать в родительское окно, но опущены, поскольку они также неактуальны в данный момент.
Я решил предоставить ссылку на демонстрационный проект, вместо того, чтобы делать этот пост довольно длинным с фрагментами кода.
Я попытался представить демонстрационное приложение настолько маленьким и простым, насколько это возможно.
Я не скупился на комментарии, поэтому считаю, что все хорошо освещено и объяснено в исходном коде.
Если остались вопросы, пожалуйста, оставьте комментарий, и я отвечу как можно скорее (обычно сразу или, по крайней мере, в тот же день).
Вот ссылка на демонстрационный проект:http://www.filedropper.com/geotermistgrafika_1
Важное обновление:
/==========================================================/
Текст ниже в квадратных скобках был исходной частью вопроса, но теперь опущен, поскольку в проекте были утечки памяти. Вышеприведенная ссылка ведет на улучшенную версию.
[ Обновлено в ответ на комментарий участника xMRi: Эта ссылка должна быть правильной: http://www.filedropper.com/geotermistgrafika ]
/==========================================================/
Я работаю на Windows XP, использую MS Visual Studio C++ и чистый Win32 API.
Одно примечание: поскольку версия VS Express не имеет редактора ресурсов, файл ресурсов и заголовок ресурса были созданы с помощью ResEdit отсюда: http://www.resedit.net/.
ПРОБЛЕМА:
Когда я изменяю размер окна, статические элементы управления слегка мерцают.
МОИ УСИЛИЯ ПО РЕШЕНИЮ ПРОБЛЕМЫ:
Я считаю, что в моем коде нет утечек памяти, поэтому я сомневаюсь, что это проблема, но, будучи неопытным, я был бы очень признателен, если бы мое предположение можно было как-то подтвердить.
Я думаю, что я правильно обработал WM_ERASEBKGND
, и я исключил стили CS_VREDRAW
и CS_HREDRAW
из своего класса окна - поэтому мерцание не должно вызываться из-за этого.
Я забыл упомянуть, что мое окно имеет стиль WS_CLIPCHILDREN
, поэтому я упоминаю об этом сейчас, в ответ на комментарий ниже, сделанный участником Roger Rowland.
Я реализовал двойную буферизацию для обоих обработчиков, чтобы избежать мерцания.
ВОПРОСЫ:
Как изменить код в демонстрационном проекте, чтобы избавиться от мерцания?
Мне нужен совет, как оптимизировать обработчики
WM_PAINT
иWM_CTLCOLORSTATIC
, чтобы мой код рисования стал более эффективным и быстрым.
Небольшое примечание ко второму вопросу:
Я думал улучшить свой код, отрисовав всю картинку на фоне главного окна, и поместить прозрачные статические элементы управления поверх той части изображения, которая соответствует фону статических элементов управления.
Таким образом, я бы возвращал только NULL_BRUSH
в своем обработчике WM_CTLCOLORSTATIC
и выполнял всю работу в WM_PAINT
.
Я на правильном пути с этой идеей? Может ли это работать?
Спасибо. С Уважением.
WM_PAINT
. Делайте всю работу вWM_CTLCOLORSTATIC
, в которой вы рисуете на экране только один раз. (Скомпонуйте все в растровое изображение, а затемBitBlt
растровое изображение на экран.) - person Raymond Chen   schedule 05.11.2013