Эту проблему легко решить, предоставив Windows дескриптор для любой кисти, которую вы хотите использовать для рисования фона кнопки.Вы делаете это всякий раз, когда получаете WM_CTLCOLORBTN
сообщение в обработчике сообщений родительского окна кнопки.
Я смоделировал небольшое демонстрационное приложение, которое сравнивает две разные стороны кнопкиая сторона.Оба являются стандартными элементами управления Win32 BUTTON
, но один слева обрабатывает сообщение WM_CTLCOLORBTN
и задает кисть того же цвета, что и фон окна.Вы можете сразу увидеть разницу - светло-серый (или, точнее, цвет по умолчанию для 3D-элементов управления, COLOR_3DFACE
) полосы вокруг прямоугольника кнопки исчезли, и кнопка выглядит намного лучше на фоне пользовательского цвета фона:
Эффект также работает в Windows XP с включенными визуальными темами - вот скриншот того же приложения:
И код, которыйЯ использовал для создания вышеупомянутого эффекта почти смехотворно просто.Добавьте это к процедуре главного окна вашего приложения (MainWndProc
), как описано выше.Вам не нужно прикасаться к кнопкам.
HBRUSH hButtonBackColor = NULL;
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CTLCOLORBTN:
{
if (!hButtonBackColor)
{
// Create the brush, if it hasn't already been created.
// (You can use any type of brush here; this is just an example.)
hButtonBackColor = GetSysColorBrush(COLOR_3DDKSHADOW);
}
return (LRESULT)hButtonBackColor;
}
// ...
}
}
Однако убедитесь, что указанная вами кисть точно такого же цвета, что и цвет фона вашего окна - прозрачная кисть может работать неправильно.Точно так же для узорчатой кисти (кто-нибудь использует ее больше?) Необходимо установить источник кисти , чтобы он соответствовал фону.
Всегда проверяйте, что вы отпускаете любыекисти, которые вы создаете, вызывая DeleteObject
!! В C ++ вы бы сделали это, сделав объект CBrush
(или эквивалентный) членом вашего диалогового класса, чтобы он был автоматическиуничтожены.В C вам нужно обработать сообщение WM_NCDESTROY
и удалить кисть вручную.
Также обратите внимание, что вам не нужно указывать стиль BS_OWNERDRAW
, чтобы этот трюк сработал.В приведенном выше примере используются два стандартных элемента управления кнопки, созданные с использованием только следующих флагов стиля окна: WS_CHILD
, WS_VISIBLE
и BS_PUSHBUTTON
.
Конечно, если ваш дизайн более сложный, чем приведенный вышеНапример (например, ваши кнопки перекрывают несколько фонов), вам, скорее всего, придется идти по маршруту рисования владельцем.Я просто думаю, что это излишне для такой простой задачи, как та, которую вы, похоже, описываете.