![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Здравствуйте! Сталкнулся с такой проблемой: закрашиваю клиентскую область окна белой кистью ( WHITE_BTUSH), на закрашиваемом окне имеются элементы управления(две кнопки и один чекбокс), так вот при закраске их фон не меняется(см. прикреплённый файл). Вопрос, какбы можно убрать этот фон не совпадающий с цветом фона окна?
Присоединённый файл ( Кол-во скачиваний: 41 ) ![]() |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: нет Всего: 91 |
Все элементы управления в программе - отдельные окна со своим фоном.
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
есть флаг по использованию родительского контекста, точно не помню как в винапи он будет
типа (CS_) WS_PARENTDC Это сообщение отредактировал(а) mes - 24.7.2008, 22:22 |
|||
|
||||
Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Это я знаю, вовпрос не в том что все элементы это окна со своим фоном, а в том как этот самый фон изменить. ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
||||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Юзай сообщения, и возвращяй нужный цвет.
case WM_CTLCOLORBTN: case WM_CTLCOLORSTATIC: { SetBkMode((HDC)wParam,TRANSPARENT); return (LRESULT) GetSysColorBrush(COLOR_BTNFACE); } Ноя так понял тебя интересует стиль как у винды ? то юзай такой код, после создания окна нужно этой функции передать HWND окна (диалога):
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
так ведь в атаче на скриншоте уже установлен ХP-стиль ... ![]() |
|||
|
||||
Kostik88 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Пробовал, но результат никакой.
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
тогда только как предложил Dem_max- надо перегрузить ответ на дочерний запрос родителю о атрибутах |
|||
|
||||
Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Dem_max, Вот к примеру я пишу обработку сообщения для чекбокса :
Только цвет фона чекбокса не меняется. 0о Это сообщение отредактировал(а) Kostik88 - 25.7.2008, 17:46 |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Нифига не установлен, ты к к ехе только присобачил манифест, 'nnjlftn возможность отображать контролы в стиле XP, а тему ХР можно задать только через EnableDialogTheme(HWND hwnd) -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Чтобы убрать этот фон с элементов управления мне обязательно нужно ставить тему ХР чтоли? А присобачил манифест Я, а не mes ![]() Это сообщение отредактировал(а) Kostik88 - 25.7.2008, 18:13 |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Не ты функцией активизируешь текущую тему. Текущей может быть стандартная или которая изменяет оформление рабочего стола, ты бы лучше сделал как говорят и не ...... нам мозг. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Dem_max, меньше всего мне хочется ......., такому как ты, мозг!
Это сообщение отредактировал(а) Kostik88 - 26.7.2008, 15:08 |
|||
|
||||
mekhanikus |
|
||||||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Попробуй сделать так:
Функция должна возвращать HBRUSH, а ты возвращаеш LRESULT. Это сообщение отредактировал(а) mekhanikus - 27.7.2008, 14:47 |
||||||
|
|||||||
Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
mekhanikus, так всё правильно, обработчик события WM_CTLCOLORSTATIC возвращает значения BOOL - го типа и поэтому LRESULT, если ставить значение HBRUSH компилятор просто напросто будет ругаться.
Кому интересно про включение ХP те могут глянуть сайтик, похожая проблема, такаяже ф-ция.... Но почемуто у меня она отказывается работать. http://forum.sources.ru/index.php?showtopic=219977 Добавлено через 13 минут и 23 секунды Просто будет выдаваться ошибка: 'return' : cannot convert from 'HBRUSH' to 'BOOL' Это сообщение отредактировал(а) Kostik88 - 28.7.2008, 00:04 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Во первых где ты ловишь сообщение? у родителя ? приходит или нет? Во вторых не кажется ли окончание static подозрительным? Чекбокс как никак кнопка. Мне кажется, что в данном случае надо использовать WM_CTLCOLORBTN ![]() |
|||
|
||||
Kostik88 |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Я тоже так думаю=) только не шипко помогло(
Сообщение ловлю у родителя.
приходит. |
||||||
|
|||||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Можно еще так
#include <uxtheme.h> #pragma comment(lib, "UxTheme.lib") SetWindowTheme(hwndList, L"Explorer", NULL); -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Kostik88 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Вроде бы решил проблему:
для бутонов:
и для чекбокса:
теперь фон кнопок и чекбоксов меняется. Добавлено через 2 минуты и 54 секунды А если хочется поставить любой другой фон то можно воспользоваться ф-цией CreateSolidBrush =) |
||||
|
|||||
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Странно.
Читаем про WM_CTLCOLORSTATIC
Тоже самое про WM_CTLCOLORBTN. Кинь исходник, если не жалко, самый минимум, как ты кнопки делаешь и красишь. Интересно самомы скомпилить. |
|||
|
||||
Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
mekhanikus, Я не совсем понял что тебя в этих сообщения не устраивает и в чём твое негодование относительно цитаты из msdn?
Код выкладывать не буду ибо там больше 3 тысяч строк кода. Хочешь проверить сделай простой проект прикрепи к нему диалог с помощью Resource View и кинь на него кнопочки и проверь эти сообщения. |
|||
|
||||
Draeden |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
Любопытная задачка: нужно поменять значения поля в WNDCLASS созданного ранее через RegisterWindowClass.
Интересно посмотреть, есть ли красивое решение... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
если я правильно понял то Вам нужно SetClassLong Добавлено через 1 минуту и 44 секунды также непонятно почему вопрос поместили в этом топике.. в чем связь с темой ?? |
|||
|
||||
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Никакого негодования, спокоен как удав. Просто, у меня был опыт раскрашивания статиков. При этом в DialogProc сообщения обрабатывались макросами HANDLE_MSG, с последующим вызовом соответствующих функций. Так вот функция раскраски статиков возвращала HBRUSH, и все работало. Сейчас попробовал стелать тоже самое без HANDLE_MSG, действительно, без (LRESULT) ругается. ![]() Оказывается в HANDLE_MSG сделано тоже самое - преобразование в LRESULT. Век живи - век учись. ![]() Кстати PUSHBUTTON у меня нехотят краситься никак. |
|||
|
||||
Draeden |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
если я правильно понял то Вам нужно SetClassLong Добавлено @ 23:28 также непонятно почему вопрос поместили в этом топике.. в чем связь с темой ?? Это не мой вопрос. Автор темы хочет поменять цвет фона для определённого окна, а также для всех его дочерних окон. Цвет фона определяется полем в структуре WNDCLASS которая регистрируется функцией RegisterClass. Таким образом нужно 1. найти все дочерние окна 2. определить классы всех окон - родительского и дочерних ( этот класс возвращается функцией RegisterClass и указывается при вызове CreateWindow ) 3. найти структуры WNDCLASS для найденных классов ( я не вижу документированного способа сделать это ) 4. изменить соотвтесвующее поля в этой структуре ( кисть фона ) 5. обновить родительское окно со всеми дочерними окнами Проблема - п.3, всё остальное сделать просто. |
||||||
|
|||||||
Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Draeden, если Вы не заметили то вопрос уже решён, кодом в несколько строк.
|
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Цвет фона класса окон, а не отдельно взятого окна.
http://msdn.microsoft.com/en-us/library/ms633588(VS.85).aspx |
||||||
|
|||||||
Draeden |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
И то верно, надо MSDN внимательнее читать
![]() |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Kostik88,
Ага а ты попробуй Оформление XP поставить на классический вид или оформление другое поставь из сторонних разработчиков и получишь гимморой, и тогда фон будет другим цветом и твои статики будут закрашиваться белым цветом, а подбирать через СreateSolidBrush у тебя не получится. А чтою этого небыло используется SetWindowTheme(hwndList, L"Explorer", NULL), которая сама автоматически раскрашивает контролы с установленной цветовой схемой в системе, при этом эта функция вызывается только для родительского окна или для диалога который создается на TabControl/ -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Kostik88 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Нихрена она не ставится! Говорил же уже! Добавлено через 2 минуты и 47 секунд
пробовал и всё нормально никокого гимароя не вылезло! манифест тоже не просто так существует! Добавлено через 8 минут и 20 секунд И к томуже это для Лист контрола тема SetWindowTheme(hwndList, L"Explorer", NULL) |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |