![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
GP1000 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 2.5.2008 Репутация: нет Всего: нет |
Подскажите пожалуйста как сделать кнопку на основе иконки .
Эта кнопка должна быть прозрачной по отношению к фону на котором она лежит .То есть в нормальном положении это должна быть одна иконка в нажатом положении другая . Я пробовал делать так :
Иконка отрисовывается ,но кнопочный фон серый все равно остается . Где и что я не правильно сделал? Что бы решить эту проблему я пошел другим путем - создавая свои дочерние окна и отрисовывавая в них иконки и самостоятельно отрабатывать их логику . Можно ли все это проще , через обычные кнопки ?? Это сообщение отредактировал(а) GP1000 - 10.4.2009, 18:49 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
можно попробовать поиграться со стилем WS_EX_TRANSPARENT
но похоже, все равно придется перехватывать некоторый функционал кнопки, чтобы встроенная процедура окна ее не заливала тут возможны 2 случая: 1. если фон закрашивается на WM_ERASEBKGND, то достаточно переопределить класс кнопки с нулевой кистьюWNDCLASS::hbrBackground (но я, честно говоря, не припомню, чтобы встроенные классы явно пользовались этим параметром) 2. если фон кнопки закрашивается еще и при рисовании, на WM_PAINT, (а скорее всего так и есть), то можно переопределить класс окна кнопки с заглушками на сообщения WM_ERASEBKGND, WM_PAINT и WM_PRINT, но это, по сути - создание нового класса окна -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
По моему это только писать самому свой класс для кнопки, по крайней мере я так и делал.
Но можно еще в WM_DRAWITEM рисовать кнопки, но это скажем не очень-то удобно, если кнопок много. -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
GP1000, через WM_DRAWITEM и рисует
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
GremlinProg, Я вижу что он рисует и как рисует.
А не выходит у него потому-что рисует в том HDC который приходит в LPDRAWITEMSTRUCT. А нужно создавать в памяти рисовать в нем а потом выдавать на отрисовку. Я так и делал. Но очень неудобно когда много кнопок и много картинок. -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
![]() GP1000, пробовал с WS_EX_TRANSPARENT? -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
А кто говорил об ошибке?
А надо рисовать то что находится под кнопкой. Правильно? -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
правильно, но двойной буфер без WS_EX_TRANSPARENT прозрачности не принесет ни коим образом -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
А причем тут WS_EX_TRANSPARENT? Он по-моему вообще не работает. Хотя не стану утверждать. А делал я так. Брал HDC родительского окна брал из его битмапа область над которой находится кнопка и рисовал ее на саму кнопку, по-моему все понятно , а вы стали ко мне придираться. -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
я не придираюсь, такой метод будет работать только если родительское окно не отсекает дочерние и это не самый хороший вариант, поскольку накладывает ограничения на родительское окно, а WS_EX_TRANSPARENT заставляет это родительское окно рисовать себя прежде, чем дочернее будет отрисовано, тогда можно гарантировать, что задний фон дочернего уже будет содержать часть родителя, без дополнительных операций -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
GremlinProg, вы хотите сказать если я кнопке поставлю стиль WS_EX_TRANSPARENT, то она будет прозрачная?
-------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
нет, я уже писал что для этого требуется: http://forum.vingrad.ru/index.php?showtopi...t&p=1843435 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
Хорошо, не будем спорить.
Но я написал то что делал, и все работает. -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
Emura |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
Задам здесь вопрос.
Andrey44
GremlinProg
Именно WS_CLIPCHILDREN и не дает нормально реализовать прозрачность, подскажите как побороть.. |
||||
|
|||||
GremlinProg |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ладно, уговорили,
привожу пример использования WS_EX_TRANSPARENT:
в приложении - скомпилированный exe'шник как видно, все прозрачно без лишних заморочек Добавлено через 3 минуты и 3 секунды
в пример этот флаг тоже включен Присоединённый файл ( Кол-во скачиваний: 38 ) ![]() -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "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. |