| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Окно в форме картинки |
| Автор: TGrey 3.12.2010, 23:03 |
| Добрый день, может кто может подсказать, я давно видел статью, как делать форму в виде картинки без использования Регионов. Там форма была в точности, как картинка с тенями и без квадратного очертания. Может у кого есть код или доходчивая статья, за счет чего и как это делается? Спасибо. |
| Автор: 586 4.12.2010, 17:00 | ||
|
| Автор: TGrey 4.12.2010, 17:39 |
| Да я знаю на счет этой функции, но она делает полностью окно прозрачным вроде? Ну а если нарисовать картинку, а вокруг нее залить все прозрачным цветом, то останется рамка окна. Я читал, что это как-то делается через ДИБ битмапы и PNG картинки, но я не нашел полного руководства, что к чему. |
| Автор: TGrey 4.12.2010, 19:13 |
| Попробую. Но вообще меня интересует вот такой результат. http://www.codeproject.com/KB/GDI/pxalphablend/img2.gif |
| Автор: 586 4.12.2010, 19:39 | ||||
Если ещё полупрозрачность нужна, тогда так:
|
| Автор: TGrey 4.12.2010, 19:41 |
| И что в картинке будет полупрозрачным? |
| Автор: 586 4.12.2010, 19:49 |
Вся картинка. А фон будет невидимым. Вот так будет: |
| Автор: TGrey 4.12.2010, 20:04 |
| Да получилось, но что у меня, что у вас на скрине, видно, что очертание рисунка пострадало. А на том скрине, что я привел, там даже тени имеются от рисунка. Я вот о чем) Хотя этот метод тоже возьму на заметку. Есть еще идеи?) |
| Автор: 586 4.12.2010, 20:12 | ||
Это просто края рисунка нужно подправить в фотошопе. А тень можно сделать, нарисовав в шахматном порядке серые пиксели в перемешку с прозрачными. |
| Автор: TGrey 4.12.2010, 20:26 |
| Да я думаю дело не в этом. Я как только картинку делаю БМП формата стразу теряются ее цвета и она становиться невзрачной. Вот нашел статью, где описывается работа с альфа-каналом http://www.infocity.kiev.ua/graf/content/graf093.phtml но там тоже ничего конкретного, все в общих чертах, а что для чего и как - умалчивается. |
| Автор: GremlinProg 6.12.2010, 09:41 | ||
эту проблему немного обсуждали тут: http://forum.vingrad.ru/forum/topic-264876/hl/%25D0%25BF%25D1%2580%25D0%25BE%25D0%25B7%25D1%2580%25D0%25B0%25D1%2587%25D0%25BD%25D0%25BE%25D1%2581%25D1%2582%25D1%258C/index.html Добавлено через 5 минут и 53 секунды кстати, загляни еще раз в RSDN, присмотрись к прозрачной картинке с текстом RSDN, видишь, шум есть даже там :)) |
| Автор: TGrey 6.12.2010, 16:02 |
| Да шум есть, но то обсуждения были для 98 винды) Может что изменилось. Та и вот в том скрине, что я привел первым, там все четко и красиво) Но там я прочитал используется либа одна, чтобы открывать ПСП файлы ну и сам код тоже не документирован. Нашел вот такую ссылочку http://blog.duck17.net/post/Per-pixel-Alpha-Blending-in-Native-Win32-API.aspx но, я что-то не пойму, как делать БМП с альфа-каналом. |
| Автор: GremlinProg 7.12.2010, 10:01 | ||||
в 2009-м году 98 вендой, я не настолько суров :))
ну я практически уверен, что тень там формируется одним растром, за счет градаций четвертой компоненты (альфа-канала), а не полутонов с остальными тремя, т.е. надо использовать UpdateLayeredWindow с ULW_ALPHA, по ссылке кстати хороший пример, смотри функцию Paint тут через временный HDC в UpdateLayeredWindow передается картинка с альфаканалом и для нее устанавливаются атрибуты BLENDFUNCTION, аналогично как в функции AlphaBlend альфаканал можно задать в PNG, любым соответствующим редактором, либо в примере показан способ, как это сделать с обычным битмапом, испрльзуя фотошоп, только вот чтобы его прочитать, придется использовать DIB'ы, поэтому тут и стоит SetDIBitsToDevice, простой LoadImage будет игнорировать альфу, хотя по идее там есть возможность задействовать DIB-секцию BitBlt, конечно же :)) |
| Автор: TGrey 7.12.2010, 16:25 |
| Так, уточню. Тобишь PNG формат загрузится через LoadImage, или что PNG, что Битмап надо грузить через секции? Кстати какой редактор то? МСПэинт подойдет? Или фотошоп? И как это хоть сделать)? |
| Автор: GremlinProg 8.12.2010, 08:24 | ||||
загрузи пример, там же есть исходник
можно фотошопом, но я не особо ему доверяю в плане полутонов, а вот у Paint.Net есть очень удобная палитра, в которой этой альфой можно как рисовать, так и сохранять с ней полноценные растры: http://forums.getpaint.net/index.php?/topic/11201-alpha-32bits-bitmap-support-for-paintnet/ у Paint.Net это формат *.bmpx, т.е. это тот же 32-битный битмап (т.е. формат обычного битмапа), но уже с альфа-составляющей ps: на сколько понял, плагин bmpx на данный момент поставляется в базовой комплектации редактора |
| Автор: TGrey 8.12.2010, 19:42 |
| Исходник то есть, но и БМП там 32битовый, но я что-то не пойму, что нужно сделать, чтобы получить такую картинку. Скачал Пэинт НЭТ, чем рисовать этот альфа канал, что-то не понял. |
| Автор: TGrey 8.12.2010, 22:01 |
| Так ну все, я нашел в гугле, как создавать этот канал, буду пробовать кодить. Если кто еще наткнется на эту тему вот еще пару полезных ссылок. http://www.codeproject.com/KB/buttons/TransButtonNetDemo.aspx http://www.axialis.com/tutorials/tutorial-misc001.html http://stackoverflow.com/questions/307348/how-to-draw-32-bit-alpha-channel-bitmaps |
| Автор: GremlinProg 9.12.2010, 09:23 |
создаешь например 2 слоя, на верхнем рисуешь что-нибудь, цвет выбираешь из палитры, только разверни эту палитру (кнопка "Больше >>"), там будет бегунок "прозрачность (альфа)" 0 - прозрачный, 255 - непрозрачный так и рисовать, а потом сохранить рисунок как *.bmpx |
| Автор: AntonN 10.1.2011, 11:34 | ||||
Не надо править в редакторе исходное изображение, UpdatelayeredWindow использует упрощенную формулу бленда, нужно перед самым ее использованием у битмапа все каналы умножить на альфу (т.е. они затемнятся). В принципе такое можно сделать и в редакторе, но если изображение формируется динамически или из нескольких спрайтов, то такой способ недопустим. |
| Автор: GremlinProg 10.1.2011, 13:03 | ||
упрощенная формула бленда к шуму на краях полутонового растра с тенями не имеет ни какого отношения |
| Автор: AntonN 10.1.2011, 17:34 |
| самое прямое. думаю понятно на картинке где какое изображение, такая же елочка выше на том же фоне ![]() |
| Автор: GremlinProg 10.1.2011, 21:28 | ||
| аха, прямо, давай вот так же этот сделай:
:)) |
| Автор: AntonN 11.1.2011, 00:33 |
![]() |
| Автор: GremlinProg 11.1.2011, 09:21 |
| ну, махинации с альфой тут не пройдут, я же говорю, "сделай с этим", а не так же :)) умножай альфу вот на этом растре: ![]() и покажи его к примеру на зеленом или черном фоне |
| Автор: Dem_max 11.1.2011, 11:52 |
| Кому интересно вот исходник с примером. |
| Автор: AntonN 11.1.2011, 22:26 | ||||||
-->
в нем нет альфы |
| Автор: GremlinProg 12.1.2011, 09:10 |
поэтому я и говорю: "Безумству храбрых поем мы песню..." :)) |
| Автор: AntonN 12.1.2011, 21:58 |
| У него был альфаканал. А в 11 при попытке сделать его bmp - формат менялся. Но пой, пой.. Кстати, для собирания bmp 32-битного я написал себе давно утилитку, чтобы от фотошопов не зависеть. Если кому надо - дам ссылку |
| Автор: GremlinProg 13.1.2011, 08:24 | ||
AntonN, ты сейчас пытаешься всем доказать, что SetLayeredWindowAttributes, который задействовал 586 в своем примере: http://forum.vingrad.ru/index.php?showtopic=316811&view=findpost&p=2259943 , использует какой-то альфаканал рисуемого растра (той самой ёлочки) будешь дальше продолжать бессмысленную болтовню, получишь втык за оффтоп, это первое и последнее предупреждение (раз уж вникать в проблему топика ты не желаешь)
для собирания bmp 32-битного все уже давно написано, и даже собрав этот bmp, без дополнительной модификации битмапа (построения альфаканала) и использования UpdateLayeredWindow, либо AlphaBlend ты не получишь результат, продемонстрированный на первом скрине от TGrey |
| Автор: AntonN 13.1.2011, 12:20 | ||||||
нет
а вот и ответ о чем я спорю: что там за модификации битмапа (построения альфаканала) требуются? Или в Си нет попиксельных операций и сначала создается битмап о 32 битах с обнуленной альфой, и для ее "модификации" требуется внешний графический редактор? Это и есть та самая "модификация"?
это пятое сообщение этой темы? Как раз такое изображение и получается с помощью UpdateLayeredWindow |
| Автор: GremlinProg 13.1.2011, 12:58 | ||
так где ответ-то? это только до меня туго доходит или не я один вижу после слова "ответ" вопрос? то, что ты не читал топик перед ответом и так понятно, это не преступление, но какой смысл теперь юлить, подгоняя ответ "не в тему" под ответ "в тему" я отвечал на вопрос TGrey по коду 586, с SetLayeredWindowAttributes а ты цитируешь этот мой ответ с указанием на UpdateLayeredWindow, о котором речь пошла уже после примера с ёлочкой, причем в ёлочке ты откуда-то находишь альфу и упорно гнешь на то, что она рисуется с UpdateLayeredWindow, хотя 586 уже заведомо указал свой метод, приложив код исходя из этого, отправляйся в угол на 5 дней с "неудом" в дневник, жестоко, а что делать, я предупреждал для остальных, тематическая часть топика была закончена вот здесь: http://forum.vingrad.ru/index.php?showtopic=316811&view=findpost&p=2262964 + очень уместный код от Dem_max: http://forum.vingrad.ru/index.php?showtopic=316811&view=findpost&p=2280762 |