Как добиться корректного отображения альфа-канала

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

Как добиться корректного отображения альфа-канала

Сообщение Space » 02.07.2009 (Чт) 18:22

в ф-и 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

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 02.07.2009 (Чт) 21:17

Видимо, никак :) Объект stdpicture в бейсике просто не умеет его понимать... точнее, не знаю, как сам объект, но контролы - точно не понимают. Не веришь - попробуй загрузить иконку с альфой в пикчебокс через дизайнер.

Просто рисуй иконку на пикчебоксе с помощью DrawIconEx - и будет тебе альфа-канал
Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 02.07.2009 (Чт) 21:34

просто рисовать мне не подходит, просто рисование выливается в размер картинки 32х32, а мне надо 16х16. Также надо использовать SavePicture.
А что за метод использован в рисовании таких иконок в ListView, вот кусок кода:
Код: Выделить всё
' Set the item index (is zero-based)
  lvi.iItem = li.Index - 1

  ' Get the item's icon index within the system's small imagelist.
  ' (indices of images in the small and large imagelists are the same)
  lvi.iImage = GetFileIconIndexPIDL(pidlfqChild, SHGFI_SMALLICON)
   
  ' 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

  ' And set the item's icon, with any overlay
  Call ListView_SetItem(objLV.hWnd, lvi)

что тут за маски и оверлей, что они дают? Как переводится коммент "Overlay images reside ..."?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 02.07.2009 (Чт) 21:51

Space писал(а):просто рисовать мне не подходит, просто рисование выливается в размер картинки 32х32, а мне надо 16х16

Одно с другим никак не связано.
Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение JohnK » 02.07.2009 (Чт) 21:59

А так подойдет?

Код: Выделить всё
Private Type TypeIcon
cbSize As Long
picType As PictureTypeConstants
hIcon As Long
End Type

Private Type CLSID
id(16) As Byte
End Type

Private Const MAX_PATH = 260

Private Type SHFILEINFO
hIcon As Long ' out: icon
iIcon As Long ' out: icon index
dwAttributes As Long ' out: SFGAO_ flags
szDisplayName As String * MAX_PATH ' out: display name (or path)
szTypeName As String * 80 ' out: type name
End Type

Private Declare Function OleCreatePictureIndirect Lib "oleaut32.dll" (pDicDesc As TypeIcon, riid As CLSID, ByVal fown As Long, lpUnk As Object) As Long
Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
Private Declare Function ExtractAssociatedIcon Lib "shell32.dll" Alias "ExtractAssociatedIconA" (ByVal hInst As Long, ByVal lpIconPath As String, ByRef lpiIcon As Long) As Long
Private Declare Function DrawIcon Lib "user32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long

Private Const SHGFI_ICON = &H100
Private Const SHGFI_LARGEICON = &H0
Private Const SHGFI_SMALLICON = &H1

Private Function IconToPicture(hIcon As Long) As IPictureDisp
Dim cls_id As CLSID
Dim hRes As Long
Dim new_icon As TypeIcon
Dim lpUnk As IUnknown

With new_icon
.cbSize = Len(new_icon)
.picType = vbPicTypeIcon
.hIcon = hIcon
End With
With cls_id
.id(8) = &HC0
.id(15) = &H46
End With
hRes = OleCreatePictureIndirect(new_icon, cls_id, 1, lpUnk)
If hRes = 0 Then Set IconToPicture = lpUnk
End Function

Private Function GetIcon(filename As String, icon_size As Long) As IPictureDisp
Dim index As Integer
Dim hIcon As Long
Dim item_num As Long
Dim icon_pic As IPictureDisp
Dim sh_info As SHFILEINFO

SHGetFileInfo filename, 0, sh_info, Len(sh_info), SHGFI_ICON + icon_size
hIcon = sh_info.hIcon

Set icon_pic = IconToPicture(hIcon)
Set GetIcon = icon_pic
End Function

Private Sub Command1_Click()
On Error GoTo LoadPictureError

Picture1.Picture = GetIcon(Text1.Text, SHGFI_SMALLICON)
Exit Sub

LoadPictureError:
End Sub

Private Sub Form_Load()
Text1.Text = "Путь к экзешнику"
End Sub

SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 02.07.2009 (Чт) 22:08

Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 02.07.2009 (Чт) 22:41

А так подойдет?

Альфа-канала нет, заменил код на прорисовку, прорисовки нет...
Код: Выделить всё
Dim hIcon As Long

Private Type TypeIcon
cbSize As Long
picType As PictureTypeConstants
hIcon As Long
End Type

Private Type CLSID
id(16) As Byte
End Type

Private Const MAX_PATH = 260

Private Type SHFILEINFO
hIcon As Long ' out: icon
iIcon As Long ' out: icon index
dwAttributes As Long ' out: SFGAO_ flags
szDisplayName As String * MAX_PATH ' out: display name (or path)
szTypeName As String * 80 ' out: type name
End Type

Private Declare Function OleCreatePictureIndirect Lib "oleaut32.dll" (pDicDesc As TypeIcon, riid As CLSID, ByVal fown As Long, lpUnk As Object) As Long
Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
Private Declare Function ExtractAssociatedIcon Lib "shell32.dll" Alias "ExtractAssociatedIconA" (ByVal hInst As Long, ByVal lpIconPath As String, ByRef lpiIcon As Long) As Long
Private Declare Function DrawIcon Lib "user32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long

Private Const SHGFI_ICON = &H100
Private Const SHGFI_LARGEICON = &H0
Private Const SHGFI_SMALLICON = &H1

Private Function IconToPicture(hIcon As Long) As IPictureDisp
Dim cls_id As CLSID
Dim hRes As Long
Dim new_icon As TypeIcon
Dim lpUnk As IUnknown

With new_icon
.cbSize = Len(new_icon)
.picType = vbPicTypeIcon
.hIcon = hIcon
End With
With cls_id
.id(8) = &HC0
.id(15) = &H46
End With
hRes = OleCreatePictureIndirect(new_icon, cls_id, 1, lpUnk)
If hRes = 0 Then Set IconToPicture = lpUnk
End Function

Private Function GetIcon(filename As String, icon_size As Long) As IPictureDisp
Dim index As Integer
Dim item_num As Long
Dim icon_pic As IPictureDisp
Dim sh_info As SHFILEINFO

SHGetFileInfo filename, 0, sh_info, Len(sh_info), SHGFI_ICON + icon_size
hIcon = sh_info.hIcon

Set icon_pic = IconToPicture(hIcon)
Set GetIcon = icon_pic
End Function

Private Sub Command1_Click()
On Error GoTo LoadPictureError

'Picture1.Picture = GetIcon(Text1.Text, SHGFI_SMALLICON)
GetIcon Text1.Text, SHGFI_SMALLICON
DrawIcon Picture1.hdc, 0, 0, hIcon
Exit Sub

LoadPictureError:
End Sub

Private Sub Form_Load()
Text1.Text = "c:\WINDOWS\System32\shell32.dll"
End Sub

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 02.07.2009 (Чт) 22:44

Одно с другим никак не связано.
Не понял, что с чем не связано?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 03.07.2009 (Пт) 0:41

просто рисование никак не связано с тем, что ты вместо хендла значка 16х16 получил хендл значка 32х32. Ты путаешь файл иконки и значки из этого файла. Хендл относится не к файлу, а к значку - что извлёк, то и нарисуешь.
Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 03.07.2009 (Пт) 14:30

ладно. Ну вот, например, тут viewtopic.php?p=6726082#p6726082 почему не отрисовывает?

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 03.07.2009 (Пт) 18:30

artur2, вот код, показывающий, как DrawIcon рисует иконки 16х16
Вложения
GetIconFile+.zip
(1.61 Кб) Скачиваний: 76

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 03.07.2009 (Пт) 18:42

Замени на DrawIconEx
Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 03.07.2009 (Пт) 19:28

DrawIconEx не работает

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 03.07.2009 (Пт) 19:35

С чего бы это? Всё как надо работает :)
viewtopic.php?p=6726076#p6726076
Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 03.07.2009 (Пт) 20:16

ну где ж работает?
Вложения
GetIconFile2+.zip
(1.71 Кб) Скачиваний: 92

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 03.07.2009 (Пт) 21:11

DI_NORMAL
Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 05.07.2009 (Вс) 13:38

у меня не работает Picture1.Cls! Остаётся Picture, загруженное в дизайнере. Что такое?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 05.07.2009 (Вс) 14:11

cls очищает то, что нарисовано на контроле. То, что загружено в свойство picture, очищается загрузкой другой картинки (ну или loadpictre() без параметров)
Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 05.07.2009 (Вс) 14:20

LoadPicture очищает и то, что нарисовано. Прикольно. Зачем нужны 2 метода очистки?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как добиться корректного отображения альфа-канала

Сообщение arthur2 » 05.07.2009 (Вс) 14:52

затем, что это не метод очистки :)
Артур
 
   

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 06.07.2009 (Пн) 8:00

однако, очищает лучше его :) Как мне теперь показать эту иконку в ListView, ReportIcon?

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

Re: Как добиться корректного отображения альфа-канала

Сообщение Space » 07.07.2009 (Вт) 0:15

люди, ау!


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

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

Сейчас этот форум просматривают: Google-бот и гости: 97

    TopList