Диалог получения иконки файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Диалог получения иконки файла

Сообщение Space » 28.06.2009 (Вс) 20:59

Есть такой диалог или надо писать самому? Т.е. мне надо получить иконку exe-файла или связанного с ним файла. Также мне нужно получать иконки инет-сайтов. Ну точно как в проводнике Винды иконки файлов отображаются.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Диалог получения иконки файла

Сообщение JohnK » 28.06.2009 (Вс) 21:02

Ты уже поднимал эту тему Иконки, или я ошибаюсь?
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 28.06.2009 (Вс) 21:19

то была тема выгребания иконок из shell32.dll, а тут другое.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 29.06.2009 (Пн) 13:16

выбрал 2 примера кода из этого сайта. Один показывает чёткую иконку, второй размытую - почему? Пока на поставил Picture1.AutoRedraw = True ох и намучился с вариантами кода, т.к. ничерта не показывало! А если бeз Picture1.AutoRedraw = True, какой метод надо вызывать для обновления области рисования после DrawIcon?
Всегда ли иконка приложения имеет IconOrd=0? Я получаю иконку 32х32. Какой IconOrd имеет иконка 16x16?
Вложения
GetIconFile.rar
(7.71 Кб) Скачиваний: 65

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 29.06.2009 (Пн) 18:26

Мда... Picture1.AutoRedraw = True не всегда помогает, Refresh не пашет, Visible=False/True не спасает. Чё делать??? Как обновить после DrawIcon?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Диалог получения иконки файла

Сообщение Хакер » 29.06.2009 (Пн) 20:25

Объясни, чем эта тема отличается от той?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 29.06.2009 (Пн) 21:32

там речь шла о диалоге, показывающем все иконки в shell32.dll. Тут упор у меня уже на проблемы отображения иконки после DrawIcon (с получением связанных иконок уж разобрался). Также, чувствую одним местом, что иконки 16х16 не всегда могут присутствовать в файле и мне придётся всё это дело пихать в Image (чтобы уменьшить иконку 32х32 до 16х16), при этом мне придётся рисовать иконку в невидимом PictureBox (а получится ли?) да ещё надо сохранять на диск и читать... SavePicture сохраняет в bmp, а там нет прозрачности... :( Т.е., мабудь, мне придётся пихать всё в ListImage и сохранять на диск как-то эти данные :(

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Диалог получения иконки файла

Сообщение Хакер » 29.06.2009 (Пн) 22:00

Ты шутишь? Тот диалог показывает иконки из любого файла, где они есть, а не только из shell32.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 29.06.2009 (Пн) 22:10

ещё почему-то не работает DrawIconEx, хотя DrawIcon работает...
Код: Выделить всё
    DrawIcon Picture1.hdc, 0&, 0&, hIcon
    'DrawIconEx Picture1.hdc, 0&, 0&, hIcon, 0&, 0&, 0&, 0&, DI_DEFAULTSIZE

Ты шутишь? Тот диалог показывает иконки из любого файла, где они есть, а не только из shell32.
Да то совсем другая задача, показать все иконки для выбора. А тут иконка выбрана, теперь мучаюсь с её отрисовкой. Может, лучше рисовать (писать данные) её как-то в память как объект, а потом показывать где надо, а то Picture1.Picture не существует после такой отрисовки (DrawIcon) :evil:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Диалог получения иконки файла

Сообщение iGrok » 29.06.2009 (Пн) 22:45

Space писал(а):ещё почему-то не работает DrawIconEx, хотя DrawIcon работает...
Код: Выделить всё
    DrawIcon Picture1.hdc, 0&, 0&, hIcon
    'DrawIconEx Picture1.hdc, 0&, 0&, hIcon, 0&, 0&, 0&, 0&, DI_DEFAULTSIZE

Ты шутишь? Тот диалог показывает иконки из любого файла, где они есть, а не только из shell32.
Да то совсем другая задача, показать все иконки для выбора. А тут иконка выбрана, теперь мучаюсь с её отрисовкой. Может, лучше рисовать (писать данные) её как-то в память как объект, а потом показывать где надо, а то Picture1.Picture не существует после такой отрисовки (DrawIcon) :evil:

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

А вообще я что-то не догоняю, чего ты хочешь сделать, и что у тебя не получается.
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 29.06.2009 (Пн) 22:55

я хочу от уже имеющегося hIcon загнать иконку в формат StdPicture и ещё получить связанную иконку 16х16 (пока только получаю 32х32)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Диалог получения иконки файла

Сообщение iGrok » 29.06.2009 (Пн) 23:55

Space писал(а):я хочу от уже имеющегося hIcon загнать иконку в формат StdPicture и ещё получить связанную иконку 16х16 (пока только получаю 32х32)

1) http://www.xtremevbtalk.com/showthread.php?t=128730
Там ищи IconToPicture.

2) ExtractIconEx позволит тебе вытащить не только стандартную(32*32), но и маленькую (16*16) иконку.
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 30.06.2009 (Вт) 19:19

1. поэксперементировал с ExtractIconEx, понял следующее: большая и маленькая иконка считаются как одна иконка для ф-и, т.е. если в последнем параметре указать 1 (извлечь 1 иконку), извлекутся большая и малая иконки. ExtractIconEx возвращает 2, хотя было ей указано извлечь 1 иконку, при указании 2-х иконок тоже вернёт 2 -> неоднозначность (там просто на lRet 0 и 1 идут как ошибка).
2. ф-я DrawIcon масштабирует иконку 16х16 до размера 32х32, поэтому и были различия в чёткости иконок двух выложенных ранее примеров (мог бы кто-то и сказать :().
3. ф-я DrawIconEx у мя не работает - причина неизвестна.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 30.06.2009 (Вт) 19:59

Ну наконец-то всё получилось! Спасибо всем. Только ещё глюк (с прозрачностью что ли) - на форме рисует иконку bug.bmp, в действительности norm.bmp (вложения) - при использовании IconToPicture:

Код: Выделить всё
Private Type PictDesc
    cbSizeofStruct As Long
    PicType As Long
    hImage As Long
    xExt As Long
    yExt As Long
End Type
Private Type Guid
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (lpPictDesc As _
PictDesc, riid As Guid, ByVal fPictureOwnsHandle As Long, ipic As IPicture) As Long

Public Function IconToPicture(ByVal hIcon As Long) As StdPicture
    If hIcon = 0 Then Exit Function
    Dim oNewPic As Picture
    Dim tPicConv As PictDesc
    Dim IGuid As Guid
    With tPicConv
    .cbSizeofStruct = Len(tPicConv)
    .PicType = vbPicTypeIcon
    .hImage = hIcon
    End With
    With IGuid
    .Data1 = &H7BF80980
    .Data2 = &HBF32
    .Data3 = &H101A
    .Data4(0) = &H8B
    .Data4(1) = &HBB
    .Data4(2) = &H0
    .Data4(3) = &HAA
    .Data4(4) = &H0
    .Data4(5) = &H30
    .Data4(6) = &HC
    .Data4(7) = &HAB
    End With
    OleCreatePictureIndirect tPicConv, IGuid, True, oNewPic
    Set IconToPicture = oNewPic
End Function
Вложения
bug.rar
(1.39 Кб) Скачиваний: 67

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 30.06.2009 (Вт) 22:53

что на этот баг влияет, hPal (палитра) из Type PictDesc(Type PicBmp) или данные Type guid (не нашёл в инете описание структуры)?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 01.07.2009 (Ср) 19:09

Интересно то, что из exe иконки извлекает без глюков, а от связанных файлов и из system32.dll иконки с глюками! Что за проблемы с альфа-каналом?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 02.07.2009 (Чт) 12:27

ну неужели никто никогда не заполнял ListView каталогами и файлами аналогично проводнику Винды с показом их иконок? И в кирпичах этого нет. Парадокс.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Диалог получения иконки файла

Сообщение pronto » 02.07.2009 (Чт) 14:04

Поизучай на досуге, может это именно то, что тебе нужно...
Вложения
vbexplorer.zip
VB Explorer
(64.11 Кб) Скачиваний: 74
O, sancta simplicitas!

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Диалог получения иконки файла

Сообщение Space » 02.07.2009 (Чт) 14:35

не смог понять этот кусок кода. Что это такое и на что влияет?
Код: Выделить всё
  ' Add any overlay image...
  ' Overlay images reside in bits 8-11 of the system's normal imagelist
  ' (as opposed to a state imagelist). The share overlay is the 1st image,
  ' shortcut is 2nd, 3rd, and 4th images vary. The SFGAO_SHARE
  ' (folders) and SFGAO_LINK (files) attributes are mutually exclusive.
  If (ulAttr And (SFGAO_SHARE Or SFGAO_LINK)) Then
    lvi.mask = LVIF_IMAGE Or LVIF_STATE
    lvi.stateMask = LVIS_OVERLAYMASK
    If (ulAttr And SFGAO_SHARE) Then
      lvi.state = INDEXTOOVERLAYMASK(1)
    Else   ' (ulAttr And SFGAO_LINK)
      lvi.state = INDEXTOOVERLAYMASK(2)
    End If
  Else
    lvi.mask = LVIF_IMAGE   ' no overlay...
  End If

И ещё - я так понял, показать корректно иконку можно только в ListView, т.к. тут присутствуют всякие маски, оверлеии какие-то. А в Image придётся пихать из ListView? :)


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 25

    TopList