С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
programmist99
54 / 54 / 63
Регистрация: 18.03.2014
Сообщений: 385
Завершенные тесты: 1
1

WM_CTLCOLORBTN

13.04.2015, 22:44. Просмотров 1102. Ответов 1
Метки нет (Все метки)

что нужно забить в SendMessage(?, WM_CTLCOLORBTN, ?, ?), чтобы изменить цвет кнопки?
заранее спасибо

Добавлено через 33 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
COLORREF btncolor = RGB(0, 255, 0);
case WM_COMMAND:
    {
        if ((HWND)lParam == btn[0])
        {
            btncolor = RGB(255, 0, 0);
            SendMessage(main_window, WM_CTLCOLORBTN, (WPARAM)GetDC(btn[0]), (LPARAM)btn[0]);
            InvalidateRect(btn[0], NULL, true);
        }
    }
    case WM_CTLCOLORBTN:
    {
        SetBkMode((HDC)wParam, TRANSPARENT);
        return (LRESULT)CreateSolidBrush(btncolor);
    }
этот код результата не дает, при нажатии на кнопку с нее исчезает текст, а сама она не перекрашивается
0
Operok
178 / 176 / 66
Регистрация: 15.02.2015
Сообщений: 510
Завершенные тесты: 2
28.04.2015, 10:50 2
Посылать ничего не нужно. Достаточно просто обработать WM_CTLCOLORBTN, как у вас это и написано. При чём для bushbutton достаточно просто вернуть кисть, для кнопок со статиком (radio и check) нужно ещё обрабатывать WM_CTLCOLORSTATIC и помимо возвращения кисти закрашивать клиентскую область (::FillRect((HDC)wparam, &rect, hbrush)) и отключить закрашивание фона текста (::SetBkMode((HDC)wparam, TRANSPARENT)). При использовании классической темы закрашивать клиентскую область необязательно. Однако, не советую использовать для закрашивания фона главного окна прозрачную кисть по типу (HBRUSH)GetStockObject(NULL_BRUSH).
Если нужно изменить цвет самой кнопки, то нужно использовать стиль BS_OWNERDRAW и перерисовывать кнопку в WM_DRAWITEM.

Добавлено через 10 минут
и ещё:
создайте static кисть в оконной процедуре и при закрытии окна нужно будет её освободить (DeleteObject(HBRUSH)), иначе не происходит освобождение ресурсов, а сообщение WM_CTLCOLOxx приходит далеко не один раз.
0
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru