Создать 32 битную иконку из байтового массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Создать 32 битную иконку из байтового массива

Сообщение Alexanbar » 02.03.2005 (Ср) 1:12

Поместил иконку в ресурсный файл.
Загружаю в массив с помощью LoadResData.
Пробую получить IPIctureDisp с помощью Oleloadpicture.
Всё проходит благрполучно для 8-битных иконок, а 32-битные не образуются.
Тоже самое - при использовании OleLoadPictureEx.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.03.2005 (Ср) 10:16

Моя обёртка не подойдёт? Она умеет.
Изображение

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 02.03.2005 (Ср) 19:24

А где её брать?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.03.2005 (Ср) 19:39

Тут: http://mix.web.ur.ru/JPEG.zip

Чтобы загрузить иконку из байтового массива Data(), нужно написать:
Код: Выделить всё
Dim i As prjGDIplus.Image
Set i = CreateImageFromMemory(Data())


Потом можешь работать с i.Icon
Изображение

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 02.03.2005 (Ср) 23:25

К сожалению, отрисовка 32битной иконки идёт неверно- например, вокруг значка IE видна чернота
Делаю так:

Dim v() As Byte
Dim i As prjGDIplus.Image

v = LoadResData(107, "32BITICONS")

Set i = CreateImageFromMemory(v)
DrawIconEx Picture1.hdc, 0, 0, i.Icon.Handle, 48, 48, 0, 0, DI_NORMAL

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 03.03.2005 (Чт) 1:57

Как вариант, добавить в раздел иконок ехе-шика, или длл-ки иконку(например ResHacker'ом), а потом
Код: Выделить всё
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
Private Declare Function ExtractAssociatedIcon Lib "shell32.dll" Alias "ExtractAssociatedIconA" (ByVal hInst As Long, ByVal lpIconPath As String, lpiIcon As Long) As Long
Sub Form_Load()
dim  a as long
a = ExtractAssociatedIcon(me.hwnd,"C:\WINDOWS\system32\calc.exe",1)
DrawIcon(hdc, 0, 0, a)
end sub
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.03.2005 (Чт) 6:41

Alexanbar писал(а):К сожалению, отрисовка 32битной иконки идёт неверно- например, вокруг значка IE видна чернота
Делаю так:

Dim v() As Byte
Dim i As prjGDIplus.Image

v = LoadResData(107, "32BITICONS")

Set i = CreateImageFromMemory(v)
DrawIconEx Picture1.hdc, 0, 0, i.Icon.Handle, 48, 48, 0, 0, DI_NORMAL

А ты попробуй вот так:
Код: Выделить всё
Dim v() As Byte
Dim i As prjGDIplus.Image

v = LoadResData(107, "32BITICONS")

Set i = CreateImageFromMemory(v)
CreateGraphics(Picture1.hDC).DrawImage i, 0, 0, 48, 48
Изображение

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 03.03.2005 (Чт) 20:42

Увы, результат аналогичный. :(

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 03.03.2005 (Чт) 20:49

Так как мой вариант ??
الفيجوال بيسك الرابح

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 03.03.2005 (Чт) 23:22

Не хотелось бы пользоваться ResHacker'ом. Мне нужно, чтобы все ресурсы (32битные иконки) были добавлены во время разработки, а в процессе выполнения их извлечь и добавить либо в стандартные Imagelist-ы, либо на Picturebox-ы.
К тому же, насколько я знаю, замена ресурсов ResHacker-ом и подобными программами может давать осложнения. Желательно, чтобы исходный ресурс и новый ресурс имели одинаковые характеристики, а это , как раз и не выполняется. Добавив 8-битную иконку, нет никакой уверенности, что она заменится на 32-битную без проблем.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.03.2005 (Пт) 3:41

А если мой IL взять? Там конструктор есть CreateFromResource.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2005 (Пт) 9:34

Alexanbar писал(а):Увы, результат аналогичный. :(

Alexanbar, плз дай свою иконку, а лучше - всю тестовую прогу; я рад бы проверить свою обёртку, да мне не на чем :-(
Я проверял её с отдельными .ico-файлами, там она прекрасно отрисовывает полупрозрачные части. Т.ч. дело именно в том, в каком виде иконка лежит в ресурсе, и в каком виде оттуда извлекается.
Изображение

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 04.03.2005 (Пт) 11:58

Посылаю. Добавил оригиналы иконок IE разных размеров. Ресурсы типа "CUSTOM" и "32BITICONS" добавлял кнопкой "Add Custom Resource"
Вложения
32_b_Icons.zip
(23.54 Кб) Скачиваний: 49

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 04.03.2005 (Пт) 15:55

А где этот IL? Насколько я понял, имеется ввиду Imagelist?
Пробовал Imagelist с vbaccelerator - там выявился следующий недостаток - нельзя одновременно хранить иконки разной глубины цвета.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.03.2005 (Пт) 16:52

Можно, но они приведутся к одной глубине, наверное :)

А мой IL в Кирпичах...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.03.2005 (Сб) 23:04

Alexanbar писал(а):Посылаю. Добавил оригиналы иконок IE разных размеров. Ресурсы типа "CUSTOM" и "32BITICONS" добавлял кнопкой "Add Custom Resource"

Чего-то не выходит у меня ничего :-(
Похоже на ограничения самого GDI+. А IL GSerg-а не пробовал?
Изображение

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 05.03.2005 (Сб) 23:51

Пока нет. Решил пока пойти другим путём:
Создаю библиотеку иконок *.icl. Далее, если установлена XP и включена к-л тема, извлекаю иконки и заменяю 8битные иконки в Imagelist-ах на 32битные. Неудобство - к иконке в *.icl, насколько я знаю, можно обратиться только по номеру, а хотелось бы задавать к-л строку.

Редактор ресурсов MS VS-7 позоляет добавлять 32б иконки, но при этом формат ресурсного файла изменяется на несовместимый с VB6.

А если создать там DLL, скорее всего, придётся тащить Framework +IE6, а это далеко не всем юзверям нужно.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.03.2005 (Вс) 0:17

ICL - это та же DLL, только без кода (одни ресурсы). Значит, можно обращаться и по названию.
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 06.03.2005 (Вс) 1:27

Дык все же вибрали мой вариант :D
الفيجوال بيسك الرابح

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 06.03.2005 (Вс) 12:31

Действительно, в icl есть и имена. Остаётся только научиться их прочитывать вместо номеров.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.03.2007 (Пн) 17:23

[quote="tyomitch"]Чтобы загрузить из байтового массива Data(), нужно написать:
Код: Выделить всё
Dim i As prjGDIplus.Image
Set i = CreateImageFromMemory(Data())


Можешь дать расшифровку CreateImageFromMemory или исходники обертки? Собственно все что мне пока надо - это заменить в коде GdipLoadImageFromFile на получение рисунка из массива...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.03.2007 (Пн) 19:45

CreateStreamOnHGlobal, GdipLoadImageFromStream
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 38

    TopList