|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Работаем с native API image list, есть примерно такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
В Vista/Win7 рисует иконку полупрозрачной без проблем, а вот в WinXP - какой-то серо-бурый прямоугольник вместо иконки. Что надо поправить чтобы этот же подход работал в WinXP? Или может есть ещё идеи как эффективно нарисовать иконку из стандартного image list полупрозрачной на заданном DC? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2011, 17:19 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
gdi+ надо использовать, примеры поищи ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2011, 17:26 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Зачем для этого стандартный? У нет ни единого преимущества перед апишным. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2011, 18:03 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Под "стандартным" я имел не визуальный ImageList control, поставляемый в составе MS Commont Controls (MSCOMCTL6.OCX), а стандартный WinAPI image list, создаваемый такой функцией: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
(пускай и из classic VB6) GDI+ однозначно не катит, т.к. есть большой проект, в котором всё построено на API image list, и надо решить задачу в пределах выбранной технологии, т.е. чисто нейтивными API-функциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 10:56 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Ну тогда включаем голову хотя бы на минимальных оборотах . ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 11:31 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Antonariy , прежде чем обвинять оппонента в безысходной тупости, посмотрите хотя бы на это . Вы что думаете, я поиск не использовал как первое средство помощи страждущим? Как видите, я даже спецпосты на других форумах и ресурсах для девелоперов создавал. Если у Вас есть готовое решение а не флуд типа "поди поищи" - тогда пишите, а так нечего мусорить на форуме. Если кому кажется, что я задачу сформулировал некорректно, вот альтернативная формулировка: надо нарисовать иконку, которая хранится в Windows API image list, как прозрачную с заданной степенью прозрачности. Речь идёт не о том, чтобы 32-битные иконки с альфа-каналом выводить, а чтобы вообще ко всей иконке применить эффект прозрачности. Посмотрите на приаттаченный скриншот. Всё работает "чики-пики" в Windows 7, но не в XPюше - смотрите как одна и та же иконка фотоаппарата с разной степенью прозрачности выводится, а у неё ещё и свой альфа-канал по краям изображения есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 14:53 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Речь идёт не о том, чтобы 32-битные иконки с альфа-каналом выводить, а чтобы вообще ко всей иконке применить эффект прозрачности.Теперь понятно. GDI+ ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 16:18 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Хотя не очень. Как это выглядит в XP? Пример неправильной отрисовки можете выложить? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 16:23 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Пожалуйста: ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 16:30 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Примерчик бы еще. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 16:51 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Хотя не надо. Этот пример у меня под XP работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 16:55 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Antonariy, Вы снова невнимательны. В указанном Вами примере используются эффекты типа cut и selected, но это не то же самое что нарисовать икону с заданной прозрачностью от 0 до 255. Да и если бы Вы в код заглянули, то увидели бы, что сам автор Steve McMahon закомментарил неработающие строки: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Нам как раз эффект ILS_ALPHA нужен... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2011, 18:08 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Каюсь, реально невнимателен, код формы не посмотрел и показалось, что картинки полупрозрачные. Остается GDI+ авторGDI+ однозначно не катит, т.к. есть большой проект, в котором всё построено на API image list, и надо решить задачу в пределах выбранной технологии, т.е. чисто нейтивными API-функциями.GDI+ это тоже native api. ImageList можно оставить в качестве хранилища рисунков. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2011, 22:27 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Хорошо, я готов использовать GDI+ (gdiplus.dll) как API-функции через Declare в VB, но как их применить для моей конкретной задачи? Ещё раз напоминаю: мне надо нарисовать на форме или любом другом API DC заданную иконку из image list с заданным уровнем прозрачности. Пример, который Вы дали (alpha.zip), делает прозрачной целую форму (целый заданный hwnd), и делает это посредством превращения её сначала в т.н. "многослойное" окно (layered window): Код: plaintext
, а потом через вызов UpdateLayeredWindow с флагом ULW_ALPHA делает ВСЁ окно полупрозрачным: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Может, я чего-то не понимаю? Как это применить к выводу конкретного изображения? Уже обыскал весь Интернет. Если знаете - подскажите хотя бы функцию(и), которыми это делается. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2011, 11:39 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Рисовать можно в любом DC, все необходимые функции в примере. Во вложении оригинальный пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2011, 12:04 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Если уж говорить про GDI+, вот сейчас нашёл ещё такой пример . Вроде делает то, что нужно (см. раздел "Transparency"), но конечно там такие классы наворочены как friendly "обёртки", что без пол-литра сразу не разберёшься как это вытянуть как отдельную функциональность и потом к image list привязать. Насколько я понял из беглого просмотра кода, там такие преобразования через специальную матрицу делаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2011, 12:12 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
В MSDN конечно документация по GDI+ native API совсем скудная. Еслик ому надо - вот здесь нашёл поприличней доку: GDI+ Flat API Reference ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2011, 12:34 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Antonariy , Ваш пример xaser.rar хорош, и показывает подход как нарисовать с помощью GdipDrawImageRect картинку на форме. Однако он сразу перестаёт работать как отключаем превращение формы в layered window. Чтобы Вы напрасно не тратили время, лучше выложите (или дайте ссылку) на пример, в котором делается то, что мне надо, с помощью GDI+. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2011, 12:37 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
wisekatЕсли уж говорить про GDI+, вот сейчас нашёл ещё такой пример .Мощный пример, со своим я так и не смог вывести картинку в PictureBox. Но в нем действительно много лишнего. wisekatНасколько я понял из беглого просмотра кода, там такие преобразования через специальную матрицу делаются. Нет там матриц, есть байтовый массив. Вытащить функционал не сложно в пошаговом режиме. Вся суть в процедуре cGDIpRenderer.RenderImageClassToDC. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2011, 12:45 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
wisekat Antonariy , Ваш пример xaser.rar хорош, и показывает подход как нарисовать с помощью GdipDrawImageRect картинку на форме. Однако он сразу перестаёт работать как отключаем превращение формы в layered window. Чтобы Вы напрасно не тратили время, лучше выложите (или дайте ссылку) на пример, в котором делается то, что мне надо, с помощью GDI+.У меня был только этот пример (к тому же он глючит — IDE через какое-то время после остановки проекта вылетает), ваш лучше, он стоит того, чтобы разобрать его на кусочки. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2011, 12:47 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
wisekat, всё же приложили бы минимальный тестовый проект и (особенно) данные, чтобы было что щупать. Вполне вероятно, что AlphaBlend() (родная для Win98 и выше) справится. Документация по GDI+ Flat API читается специфическим образом: смотрится для flat API-шки в таблице соответствия объектный аналог и читается описание к нему. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2011, 16:43 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Бенедикту и всем :) При независимых раскопках вопроса нашёл вот такую потрясную статью на RSDN: Прозрачность - это просто Автор тоже клонит к AlphaBlend. Пока попробую сам что-то подобное в проекте сварганить - и затем отпишусь о результатах. Главное, чтобы это сработало с любым типом иконки из image list, а не только с 32-битным каналом. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2011, 12:32 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Изучил вот статью про прозрачность на RSDN + решил воспользоваться советом Бенедикта и попробовать сделать всё на AlphaBlend. Статья кончено была хороша, но что в ней не понравилось - это то, что автор начал с image list, а закончил выводом классических битмапов через AlphaBlend. А вот промежуточного и самого главного звена - как перейти от иконы из image list к нужному битмапу там и нет... Хотя автор всё-таки даёт общий теоретический совет: сделайте из необходимого изображения 32-битный битмап и маску с помощью функции CreateDIBSection, а затем используйте всё это хозяйство в AlphaBlend. Даже примерный код даёт: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.
Но функция всё равно работает с оригиналом-битмапом, в котором пикселы какого-то определённого цвета принимаются за прозрачный. ************************************* Ладно, как я вывернулся, и нутром чую что это правильно, хотя надо всё же доказать математически. Нужная икона из image list рисуется полупрозрачной вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Я всё думал как правильно "прикрутить" AlphaBlend к тому, что я имею. Придумал вот как: я сначала копирую во временный буфер изображение с экрана, затем вывожу на него иконку, у которой есть своя маска полупрозрачности, а затем через AlphaBlend накладываю всё это "временное" хозяйство на исходный участок на экране, но уже применяя общий заданный уровень прозрачности при этой операции. Надо конечно доказать чисто математически что получается то же самое как если бы сделать вывод полупрозрачным на нужный DC учитывая полупрозрачные пиксели иконки. Разницу уловили? Вместо создания спец-32-битного-битмапа с маской и его выводом напрямую через AlphaBlend я рисую в копии реального экрана, а затем уже вывожу эту копию полупрозрачной. Я предполагаю, что операция полупрозрачного вывода является транзитивной, т.е. независимо от того, в каком порядке её применили, получаем один и тот же результат. По крайней мере, я это не опроверг путём попиксельного анализа скриншотов в Photoshop. Я взял и тупо сравнил характерные пиксели, полученные моим методом, и через "стандартный" ILS_ALPHA в ImageList_DrawIndirect. Результат совпадает в обоих случаях. Я сравнивал 3 категории пикселей: из области где в иконке былая полная прозрачность, из полупрозрачной области (в скриншотах выше это края фотоаппарата), и из области непрозрачных пикселей иконки. Результат: всё сошлось один-в-один по RGB показателям и точным координатам пикселей. Прошу знающих людей отписаться по данному решению и хотя бы даже подтвердить что я всё делаю правильно чтобы мне было спокойней на душе. Как будет время - постараюсь найти математику и строго всё доказать сам для полного успокоения моей души. И ещё. Предложенный метод будет работать в Win9x начиная с 98-й, а WinNT - с 2000-й Винды. И даже есть такая информация, что будет работать шустро, т.к. внутри Винда может использовать DirectX при работе AlphaBlend. И ещё добавлю, что метод получается универсальным - он будет действовать даже для 8-б 16- и 24-битных иконок, которые про понятие прозрачности и не слыхали :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2011, 15:16 |
|
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
|
|||
---|---|---|---|
#18+
Столкнулся с такое же проблемой. Решение нашел тут http://www.codeproject.com/KB/miscctrl/AlphaImageImagelist.aspx Нужен манифест Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
код примерно такой Код: plaintext 1. 2.
В данной иконке картинка имеет глубину 32 бита, а маска - 8 бит. А она в свою очередь была программно конвертирована из png. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2011, 15:30 |
|
|
start [/forum/topic.php?fid=60&msg=37194118&tid=2158749]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 151ms |
0 / 0 |