C++ Как изменить цвета контролов методами WinAPI?

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Ответить
iscan
Сообщения: 5
Зарегистрирован: 20 фев 2005, 22:16

05 апр 2005, 16:28

По умолчанию, если поставить какой-нибудь контрол, например:
CreateWindow("button","",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_DEFPUSHBUTTON|WS_BORDER,20,30,100,20,hWnd,(HMENU)ID_BUTTON,Inst,NULL);
то цвет его фона будет серый. Такими же получаются и кнопки.

Никак не могу найти где это поменять методами API.
(На форуме искал)
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

05 апр 2005, 19:19

на самом деле все просто - создаешь свой класс на основе стандартного и указываешь нужную тебе кисть в соотв поле WNDCLASSEX? а именно изменить - по моему через setwindowlong можно - где-то в инете я видел пример - поискай - найдешь
В SAD - все в SAD.
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

06 апр 2005, 13:39

Есть такие сообщения, они шлются родительскому окну WM_CTLCOLOR... для многих контролсов свои (для кнопок WM_CTLCOLORBTN). Они и предназначены для изменения стандартных цветов.

Код: Выделить всё

  HDC hdcButton = (HDC) wParam; 
  HWND hwndButton = (HWND) lParam;
  SetTextColor(hdcButton, RGB(255,0,0)); // Set red color for text of the button
  SetBkMode(hdcButton, TRANSPARENT); // Don't use text backgrtound color
  return CreateSolidBrush(RGB(0,0,255)); // Return backround blue brush
Лучше конечно не создавать кисть в каждом сообщении т.к. она каждый раз создается заного и получается лик ресурсов, но для примера сойдет
(GiG)*fh
Сообщения: 48
Зарегистрирован: 05 ноя 2004, 14:08
Откуда: Russia
Контактная информация:

08 май 2005, 21:14

Блин, чё-то не получается ни один из способов... Чё-нить другое не посоветуете?
И пусть удача повернется к тебе нужным местом :)
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

10 май 2005, 09:38

Ну тогда тебе надо рисовать кнопку самому, глянь стиль BS_OWNERDRAW
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

10 май 2005, 16:45

Плохо пробуешь, если не получается. А ты в паренте это пишешь или в самом контроле?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
(GiG)*fh
Сообщения: 48
Зарегистрирован: 05 ноя 2004, 14:08
Откуда: Russia
Контактная информация:

11 май 2005, 15:16

В паренте
И пусть удача повернется к тебе нужным местом :)
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

12 май 2005, 16:43

Для стандартых кнопок обрабатывать WM_CTLCOLORBTN смысла мало: все равно будет использован системный цвет,
цитата:
Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face, highlight and shadow-but the WM_CTLCOLORBTN message allows only one brush to be returned. To provide a custom appearance for push buttons, use an owner-drawn button.
Т.е. придется рисовать кнопку самому, используя стиль BS_OWNERDRAW, либо примерно то же самое с помощью subclassing.
Ответить