Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];

Вниз

Изменение цвета фона чужого окна   Найти похожие ветки 

 
Teenager ©   (2006-09-13 23:15) [0]

Здравствуйте, знающие добрые люди :)

у мя возник очередной вопрос, который скорее всего неразрешим... как изменить цвет фона у чужого окна? по-идее - никак. Но мало ли :) Так же мне хотелось бы изменить имя класса чужого окна... но это должно быть еще нереальнее.

Заранее спасибо.


 
Eraser ©   (2006-09-13 23:55) [1]

> [0] Teenager ©   (13.09.06 23:15)

это сделать довольно проблематично, нужно внедриться в адресное пространство "вражеского" процесса и перекрыть оконную процедуру таким образом, чтобы перехватывать WM_PAINT и рисовать там свой фон.. не факт, что будет корректно работать в общем случае.


 
Galiaf ©   (2006-09-14 12:42) [2]

можно взять хэндл окна и порсто нарисовать на нем прямоугольник нужного цвета, но на сколько я помню таким образом могут пострадать кнопки или текст этого окна, кажется будет рисоваться поверх всего, ща я гляну правда ли это...


 
Teenager ©   (2006-09-14 19:40) [3]

Eraser, да, скорее всего ты прав :( я такого делать не буду. уж слишком много версий чужого приложения мне прийдется поддерживать.

Galiaf, и ты прав... только то, что ты написал - делать совершенно низя... а жаль.

я вот подумал следующее...

а что если брать каждый пиксел чужого окна... переводить его в градацию серого - а оттуда - скажем в градации красного... таким образом чужое окно можно будет "перекрасить" полностью... также по идее можно будет регулировать параметры изменения цвета - чтобы частично цвет чужого окна оставался (для многоцветия)... только по идее такой процесс будет ресурсоемким и достаточно сложным :(

есть еще один вариант - поверх чужого окна рисовать свое - полупрозрачное и (например) красное - это тоже окрасит чужое окно в красный цвет... только при попытке кликанья на кнопки на чужом окне - события будут передаваться не ему, а поверхлежащему нашему полупрозрачному окну. как это изменить? как передавать события нижележащему окну - или дочерним окнам нежележащего окна - кнопкам например...?

как Вам мои варианты?

заранее спасибо, люди - за поддержку :)


 
Ketmar ©   (2006-09-14 19:52) [4]

> [3] Teenager ©   (14.09.06 19:40)
клади поверх окно со стилем WS_EX_TRANSPARENT. оно, afair, пропускает мышиные события "насквозь".


 
Teenager ©   (2006-09-14 21:45) [5]

спасибо! :) а что, идея норм? насчет верхнего окна? + а можно контрол (панель) сделать ПОЛУпрозрачной средствами ВинАпи и уже после создания прикрепить ей отэтот мегастиль? оч хотелось бы именно такой вариант (тонкости моей проги )


 
Ketmar ©   (2006-09-14 22:40) [6]

> [5] Teenager ©   (14.09.06 21:45)
нет. стиль задаётся при создании. иначе -- будет грустно. %-)


 
Teenager ©   (2006-09-15 19:28) [7]

если не сложно (!) , можете привести :) как это делать на ВинАпи - создавать окно, делать его прозрачным... выставить его поверх чужого окна - думаю, сумею ) надеюсь )


 
Ketmar ©   (2006-09-15 19:29) [8]

могу. но севершенно не хочу. ибо есть гугль и ещё куча других поисковиков.


 
Galiaf ©   (2006-09-18 13:12) [9]

Звиняйте, долго меня небыло хотя говорил что ща прооверю =)... так уж вышло. Вот я глянул, если рисовать прямоугольник на окне то выходит что кнопки не перерисовываются но перерисовываются всякие label"ы больше не проверял т.к. перерисовка лабелов это недопустимо, вот на счет взятия цвета пикселя, идея подходит имхо только для не старых машин но вот если делать список всяких программ с готовыми параметрами(имею в виду что ты знаешь в какой програме где что нарисовано и не рисуешь на этом месте), т.е. ты указываешь какая это программа и твоя открывает соответствующий файл и ресует по параметрами взятыми от туда, кстати файл можно писать после первого запуска незнакомой программы и брать цвета пикселов тем самым записывая в файл где можно рисовать а где нельзя. В любом случае я могу сильно ошибаться, просто высказал свои мысли на эту тему.


 
Eraser ©   (2006-09-18 13:13) [10]

> [9] Galiaf ©   (18.09.06 13:12)

рисовать надо на WM_PAINT, но перед тем, как это сделает приложение.


 
DVM ©   (2006-09-21 15:02) [11]


> рисовать надо на WM_PAINT, но перед тем, как это сделает
> приложение.

Если речь об изменении фона, то может все таки на WM_ERASEBKGND ?


 
Eraser ©   (2006-09-21 15:06) [12]

> [11] DVM ©   (21.09.06 15:02)

точно, так оптимальнее будет.


 
NickCoder ©   (2006-09-21 20:53) [13]

Я могу предложить только поменять системную политру, но в этом случае все окна будут иметь такой цвет!


 
Teenager ©   (2006-09-21 23:31) [14]

Привет... а я думал, тут ничего больше не напишут :)

Кетмар - блин, отот стиль, что ты мне посоветовал, не пропускает события :(((
а насчет гугля и других поисковиков ты совершенно прав :)

Мне нужна комбинация стилей - чтобы пропускало...

WS_EX_LAYERED вроде подходит, но не для child windows. А я-то панельку юзаю...

короче говоря, есть уже прозрачная панелька, но через нее события не проходят... люди, найдите мне нужный стиииль :)

попиксельная прорисовка - тоже вариант конечно классный... но не думаю, что он пойдет.. надо ведь будет хукать пэйнт-мессаги нижележащего окна, и реагировать на это прорисовкой всей области.. и снова-таки.. может другой вариант- как-то рэндэрить чужое окно на свой битмап,[далее быстро его изменять в цветах] а потом уже его кидать на свою панель...

ваши предложения?


 
Ketmar ©   (2006-09-21 23:37) [15]

>[14] Teenager(c) 21-Sep-XLI A.S., 23:31
>Кетмар - блин, отот стиль, что ты мне
>посоветовал, не пропускает события :(((
пропускает. только не надо окно делать дочерним.


 
Teenager ©   (2006-09-21 23:46) [16]

эээ... а без дочернего никак! я ж компонентом хочу..


 
Ketmar ©   (2006-09-21 23:49) [17]

тогда всё руками.


 
Teenager ©   (2006-09-21 23:58) [18]

доступное объяснение... если смогу все-таки что-то сделать - напишу :)

может, сделаю частичную реализацию - т.е. буду ловить клики-мувы.. и посылать их форме внизу. мож че-то и выйдет.

Есть как бы еще один супербешеный вариант - для особых извращенцев - пришел только что в голову... посредством регионов ))) т.е. один пиксел - куда указывает мышь в данный момент- делать "прозрачным" - и мышь всегда будет пробивать окно.....

как вам, а? :)


 
Ketmar ©   (2006-09-22 00:22) [19]

>[18] Teenager(c) 21-Sep-XLI A.S., 23:58
>пиксел - куда указывает мышь в данный момент-
>делать "прозрачным" - и мышь всегда будет
>пробивать окно.....
фиговато нам.


 
Teenager ©   (2006-09-22 00:27) [20]

ясно. жаль без объянений. что ж, будем искать других путёв :)


 
Ketmar ©   (2006-09-22 00:30) [21]

>[20] Teenager(c) 22-Sep-XLI A.S., 00:27
>ясно. жаль без объянений.
подумай сам. пойми, что движение мыши отлавливается постфактум. и что постоянно корёжить регион -- операция накладная.


 
Teenager ©   (2006-09-22 00:34) [22]

это логично :) но разве не сложнее - отлавливать изменение нижележащего окна и перерисовываться полностью, корректируя цвет каждого пикселя?

а если не так, то как? как-то - можно.

http://www.c-sharpcorner.com//Code/2003/May/TransparentControls.asp

жаль, ничего конкретного тут не говориться... и исходников нет :( только дээльэлька...


 
Teenager ©   (2006-09-22 00:37) [23]

извиняюсь, туплю к ночи :) пора идти спать. предложенная ссылка не дает возможности "пробивать" свое окно, зато там люди делают реально клаффную прозрачность.

может, за ночь что-то и придумается.


 
Ketmar ©   (2006-09-22 00:48) [24]

>[22] Teenager(c) 22-Sep-XLI A.S., 00:34
>изменение нижележащего окна и перерисовываться
>полностью, корректируя цвет каждого пикселя?
WS_EX_LAYERED -- для кого?

>
>http://www.c-sharpcorner.com//Code/2003/May/Trans
>parentControls.asp
>жаль, ничего конкретного тут не говориться... и
>исходников нет :( только дээльэлька...
всё там сказано. WS_EX_TRANSPARENT. и ручное рисование. зачем, если есть WS_EX_LAYERED -- не понятно. и ставить стили цифирью вместо констант -- моветон.


 
Teenager ©   (2006-09-22 19:43) [25]

Вы ошибаетесь, Кетмар... ничего не выходит, если юзать указанную мной статью. Мало того, что компонент не "пробивается" мышью, так еще при получении перекрываемой кнопкой фокуса (или вообще если даже мышь навести) то она не позволяет больше прорисовываться над собой транспарэнт-компоненту.... хоть в перекрываемом участке продолжает не реагировать на клики.

еще раз повторяю. WS_EX_LAYERED не катит для дочерних окон :(

эх.


 
Ketmar ©   (2006-09-22 19:59) [26]

>[25] Teenager(c) 22-Sep-2006, 19:43
>юзать указанную мной статью. Мало того, что
>компонент не "пробивается" мышью, так еще при
он и не должен. в данном случае WS_EX_TRANSPARENT используется несколько для другого. в частности для того, чтобы окно, лежащее поверх других, получало WM_PAINT в последнюю очередь.

>вообще если даже мышь навести) то она не
>позволяет больше прорисовываться над собой
>транспарэнт-компоненту.... хоть в перекрываемом
>участке продолжает не реагировать на клики.
потому что там все намного сложнее, нежели думал автор статьи. %-)

>еще раз повторяю. WS_EX_LAYERED не катит для
>дочерних окон :(
мда. вполне возможно. тут я запросто мог ошибиться. проверять лениво пока. %-)


 
Teenager ©   (2006-09-22 20:56) [27]

"мда. вполне возможно. тут я запросто мог ошибиться. проверять лениво пока. %-)"
MSDN ;) (хотя там и есть ошибки - черные дыры))) )

http://forum.sources.ru/index.php?showtopic=79535
моя идея насчет регионов - оказывается, уже реализована в коде - ну правильно, я ж не гениален :)

Люди, я в Вас верю ))


 
Ketmar ©   (2006-09-22 21:31) [28]

>[27] Teenager(c) 22-Sep-2006, 20:56
>MSDN ;) (хотя там и есть ошибки - черные дыры)))
да понятно, что MSDN. это я извиняюсь так за дезу. вот, ещё и открытым текстом извиняюсь (если деза %-).

>моя идея насчет регионов - оказывается, уже
>реализована в коде - ну правильно, я ж не
>гениален :)
а я и не говорил, кстати, что это не будет работать. я лишь имел в вижду, что будет работать криво. %-)


 
Teenager ©   (2006-09-22 21:45) [29]

поискал по куче форумов. видимо, норм решения нет.
если есть предложения - буду счастлив.

Кетмар - спасибо за поддержку, кросавчег :)


 
Ketmar ©   (2006-09-22 21:50) [30]

>[29] Teenager(c) 22-Sep-2006, 21:45
>Кетмар - спасибо за поддержку, кросавчег :)
ну, ежели ещё что обругать надо -- так ты заходи, я с удовольствием. %-)


 
Teenager ©   (2006-09-22 22:57) [31]

появилась новая возможность - как-то через рисунки с прозрачностью :)
например запихнуть в png альфа-канал, и радоваться )))

ссылку на эту возможность - кину позже, если кому интересно. но там на .NET :(


 
Ketmar ©   (2006-09-23 07:52) [32]

>[31] Teenager(c) 22-Sep-2006, 22:57
>появилась новая возможность - как-то через
>рисунки с прозрачностью :)
фу. обыкновенный AlphaBlend() на канву контрола. %-)


 
Старик   (2006-09-23 12:13) [33]

Teenager, если ты можешь получить хендл чужого окна, то почему нельзя:
1. Скопировать ВСЮ его поверхность в канву своей программы.
2. Перерисовать так, как тебе нужно.
3. Полученное произведение искусства нарисовать на форме нужного приложения.

Тогда у тебя будет окно, окрашенное нужным цветом. Другое дело, что я не уверен, что будет происходить при нажатии на кнопку, допустим, если ты вдруг и ее перекрасишь. Скорей всего, глюки. Но попробовать, я думаю, стоит.


 
GrayFace ©   (2006-09-23 21:45) [34]

Teenager ©   (13.09.06 23:15)
Так же мне хотелось бы изменить имя класса чужого окна... но это должно быть еще нереальнее.

Это проще, но тоже сложно.

Teenager ©   (14.09.06 19:40) [3]
как Вам мои варианты?

Утопические :)

Ketmar ©   (14.09.06 19:52) [4]
клади поверх окно со стилем WS_EX_TRANSPARENT. оно, afair, пропускает мышиные события "насквозь".

Да как-то нет. Проверял на форме. Вам удавалось его удачно использовать? А то не всегда его WM_PAINT вызывается.

Teenager ©   (14.09.06 21:45) [5]
+ а можно контрол (панель) сделать ПОЛУпрозрачной средствами ВинАпи и уже после создания прикрепить ей отэтот мегастиль? оч хотелось бы именно такой вариант (тонкости моей проги )

Это уже реальнее. Панель, через которую можно кликать сделать нет проблем (httransparent в WM_NCHITTEST), с прозрачностью тоже может получится. По меньшей мере, можно сделать чтоб через панель были видны неWin контролы.


 
Teenager ©   (2006-09-25 20:00) [35]

хм, вы так умеете обнадеживать :) спасибо.

только я все равно не понимаю - что мне делать :)

httransparent в WM_NCHITTEST - как понимать?
как я понял, событие возникает при щелчке по неклиентской части окна.
надо глянуть в описания)

а еще мне бы очень хотелось оцэ всё на .NET реализовать (C#) ...

Старик - чужая форма будет активно юзаться.
мне надо цветовой фильтр... хоть какой-то... эх :(


 
GrayFace ©   (2006-09-26 18:51) [36]

Teenager ©   (25.09.06 20:00) [35]
httransparent в WM_NCHITTEST - как понимать?
как я понял, событие возникает при щелчке по неклиентской части окна.
надо глянуть в описания)

Этим событие возникает при движении мыши по форме и выясняет, к какой части окна принадлежит данная точка. Если HTTRANSPARENT, то кликается насквозь, с одним условием - окно снизу должно принадлежать этому потоку.

Teenager ©   (25.09.06 20:00) [35]
мне надо цветовой фильтр... хоть какой-то... эх :(

Смешать цвета легко, рисовать поверх чужого окна - неизвестно, получится ли.

Teenager ©   (25.09.06 20:00) [35]
только я все равно не понимаю - что мне делать :)

А ты объясни, что надо в целом.


 
Ketmar ©   (2006-09-26 23:52) [37]

>[34] GrayFace(c) 23-Sep-2006, 21:45
>Да как-то нет. Проверял на форме. Вам удавалось
>его удачно использовать? А то не всегда его
>WM_PAINT вызывается.
писал нечто вроде CursorXP. вроде бы вполне себе работало. правда, WM_PAINT там был побоку, потому что окно с альфа-каналом, тут свои приколы.


 
Teenager ©   (2006-09-28 21:26) [38]

хай, люди %)

"А ты объясни, что надо в целом."

Итак, я на панель в моем окне пытаюсь запихнуть часть чужого окна :) достаточно сложной структуры. Чужое окно имеет свой цвет, который не подходит под дизайн моего приложения.

Я принимаю решение - поместить поверх моей панели с чужим окном - прозрачную панель для корректировки цвета. Другие варианты - более удачные - приветствуются!

Насчет прозрачной панели - она должна пропускать события мув/клик, и отображать все контролы, что под ней с регулируемой степенью прозрачности.

"с одним условием - окно снизу должно принадлежать этому потоку."
как видишь, ГрэйФэйс... мне не повезло )

"правда, WM_PAINT там был побоку, потому что окно с альфа-каналом, тут свои приколы."
если ты считаешь, Кетмар :), что это мне поможет - расскажи, плиз )

эх, ну... надеюсь, вы все-таки поможете мне разобраться )


 
Ketmar ©   (2006-09-28 21:33) [39]

>[38] Teenager(c) 28-Sep-2006, 21:26
>если ты считаешь, Кетмар :), что это мне поможет
гильотина поможет. %-) я всё равно до сих пор толком задачу не понял. %-) когда решишь -- покажи хоть, что мы тут так весело обсуждали. %-)


 
teenager ©   (2006-09-28 21:37) [40]

эй, эй, эй...

ну неужели я плохо объяснил :(

вот смотри, есть у мя скажем калькулятор, да? кальк.ехе
1) запускаю
2) запихиваю окно калькулятора в свою панель в своем окне
3) у мя все в красном дизайне, а калькулятор - виндошного цвета
4) надо сделать так, чтобы калькулятор - покраснел
5) вывод - наложить на него полупрозрачную красную панель.
6) и будет все одноцветным в красном дизайне.

понятно? :)



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.047 c
15-1170042568
Slider007
2007-01-29 06:49
2007.02.18
С днем рождения ! 27 января


2-1169710706
inkvizitor
2007-01-25 10:38
2007.02.18
3D графика


15-1169702424
BorisUK
2007-01-25 08:20
2007.02.18
PL SQL задачки, упражнения, у кого есть?


15-1169710131
pasha_golub
2007-01-25 10:28
2007.02.18
Section 508 для программ


2-1170319304
Itonix
2007-02-01 11:41
2007.02.18
DisplayFormat





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский