Иконки и другие ресурсы с 32 битным цветом

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

Иконки и другие ресурсы с 32 битным цветом

Сообщение ger_kar » 16.12.2012 (Вс) 12:53

В последнее время почти все ресурсы, будь то иконки, курсоры или просто картинки выполнены в формате png. С одной строны это конечно выглядит очень привлекательно, но с другой работа с такими изображениями в VB определенные трудности. например что-бы изображение иконки в формате png поместить на обыкновенную кнопку приходится мудрить и делать это на стадии работы приложения. Я например сделал ради проведения экспериментов так:
Код: Выделить всё

    Public Type GUID
        Data1 As Long
        Data2 As Integer
        Data3 As Integer
        Data4(7) As Byte
    End Type

    Public Type PictDesc
        cbSizeofStruct As Long
        picType As Long
        hImage  As Long
        xExt    As Long
        yExt    As Long
    End Type

Public Const IMAGE_BITMAP       As Long = 0
Public Const IMAGE_ICON         As Long = 1
Public Const IMAGE_CURSOR       As Long = 2

Public Const PICTYPE_BITMAP     As Long = 1
Public Const PICTYPE_ICON       As Long = 3

'[LoadImage]
    Public Declare Function LoadImage _
                   Lib "user32.dll" _
                   Alias "LoadImageA" _
                  ( _
                   ByVal hInst As Long, _
                   ByVal lpsz As String, _
                   ByVal un1 As Long, _
                   ByVal n1 As Long, _
                   ByVal n2 As Long, _
                   ByVal un2 As Long _
                  ) As Long

'[OleCreatePictureIndirect]
    Public Declare Function OleCreatePictureIndirect _
                   Lib "olepro32.dll" _
                  ( _
                   ByRef PicDesc As PictDesc, _
                   ByRef RefIID As GUID, _
                   ByVal fPictureOwnsHandle As Long, _
                   ByRef IPic As IPicture _
                  ) As Long

'[LoadResIcon]
'========================================================================================================
'ЗАГРУЖАЕТ ИЗОБРАЖЕНИЕ ИКОНКИ ИЗ РЕСУРСОВ
'========================================================================================================
Public Function LoadResIcon(ByVal sIdIcon As String) As IPictureDisp

    Dim hImage          As Long
    Dim Pic             As PictDesc
    Dim IID_IDispatch   As GUID
   
    If Len(sIdIcon) > 0 Then
   
        'Идентификатор иконки должен начинаться со знака  '#'  поэтому производится проверка
        'и если этот знак отсутствует, то он добавляется и строка приводится к нужному виду.
        If Asc(sIdIcon) <> 35 Then sIdIcon = "#" & sIdIcon
       
        With IID_IDispatch
            .Data1 = &H20400
            .Data4(0) = &HC0
            .Data4(7) = &H46
        End With
       
        hImage = LoadImage(App.hInstance, sIdIcon, IMAGE_ICON, 48, 48, LR_DEFAULTSIZE)
       
        If hImage > 0 Then
            With Pic
                .picType = PICTYPE_ICON
                .hImage = hImage
            End With
       
            Call OleCreatePictureIndirect(Pic, IID_IDispatch, 1, LoadResIcon)
        End If
       
    End If
   
End Function

И сразу грабли. Такой вариант работает только в скомпилированном виде. При при запуске и отладке по IDE Функция LoadImage ищет ресурсы самого VB IDE. Оно и понятно. Встроенные функции VB работают одинаково хорошо, хоть под IDE хоть в скомпилированном виде. Видимо при работе под IDE ресурсы загружаются непосредственно из фаила ресурсов (*.res). К сожалению для работы с новыми иконками и изображениями PNG они не годятся.
А теперь собственно вопрос. Как можно сделать универсальный вариант, чтобы работал одинаково хорошо и в IDE и в скомпилированном виде.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение ger_kar » 17.12.2012 (Пн) 12:47

Теперь весь вопрос сводится к тому, как и чем можно загрузить ресурс из *.res файла. Чтобы во время работы под IDE, брать ресурсы непосредственно из этого файла.
Бороться и искать, найти и перепрятать

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

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение arthur2 » 20.12.2012 (Чт) 19:01

заведи проект длл, можно вообще без кода, добавь в него тот же самый .res и скомпилируй, обозвав так же, как нужный тебе экзешник, и в ту же папку, что и нужный тебе экзешник. Потом по условной компиляции, если отладка, то бери ресурсы из app.exename & ".dll", а если бинарник, то из & ".exe"

Если поменяешь какие-то ресурсы в .res, просто запускаешь вспомогательный проект на компиляцию - удобно в фоновом режиме.
Артур
 
   

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение ger_kar » 20.12.2012 (Чт) 19:11

Ну при таком подходе можно сразу основной проект компилировать и потом в режиме отладки брать ресурсы из него.
Тут с PNG'шными иконками и другая проблема. Если делать присвоение иконки через
Set objxxx.Picture = LoadResIcon(ByVal sIdIcon As String) As IPictureDisp
То она отображается с чернотой, надо теперь еще и это как-то победить.
А насчет Dll, может вообще вынести все ресурсы из исполняемого файла в нею. Мне такая идея уже нравиться. Саму dll делать при этом не в VB, а VS6 или другой.
Бороться и искать, найти и перепрятать

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

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение Хакер » 21.12.2012 (Пт) 2:46

ger_kar писал(а):Ну при таком подходе можно сразу основной проект компилировать и потом в режиме отладки брать ресурсы из него.

Это уже то, что я тебе в ICQ подсказал. На что ты мне ответил, что у тебя проект компилируется полчаса, и ждать каждый раз тебя не устраивает. И вот тебе arthur2 гениальное решение подсказывает: подгружать на свой же собственный EXE, а крохотную res-dll-шку.

ger_kar писал(а):VB, а VS6 или другой.

Так не бывает.
VS6 это гипероним для VB6, а VB6 соответственно — гипоним для VS6.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение ger_kar » 21.12.2012 (Пт) 7:10

Хакер писал(а):Это уже то, что я тебе в ICQ подсказал. На что ты мне ответил, что у тебя проект компилируется полчаса,
Ну не пол часа конечно, но вполне ощутимое время, плюс перекомпилировать проект постоянно придется. Сначала вариант Артура мне показался даже более гемморным - это опять перекомпиляция + еще один проект + опять же условная компиляция в зависимости от режима, а твой вариант казался более предпочтительным, хотя бы потому, что второй проект не нужен. Но уже по ходу написания поста мне пришла в голову мысль о том, что ресурсы в самом исполняемом файле нафиг не нужны и их можно вынести раз и навсегда в отдельную Dll и ... А дальше мысль была такой, что раз *.res файл готовиться в VS2010, то и Dll нужно делать там же и сразу же и таким образом она всегда будет актуальной. А вообще на будущее нужно конечно добывать ресурсы непосредственно из res файла.
Хакер писал(а):VS6 это гипероним для VB6, а VB6 соответственно — гипоним для VS6.
Термины то блин какие :) гипероним, гипоним, вроде русский в школе учил, но таковых ранее не слыхивал. А если по теме, то я конечно же был уже в полудреме и сначла подумал об VC6, но потом вспомнил, что она тоже кривая на предмет работы с картинками *.png и в этом отношении от VB6 далеко не ушла, а вот VS2010 совсем другое дело. Но там нет разделения среды на VB и остальные приблуды :) . Там все общее, как при коммунизме, поэтому видимо на волне этой мысли так и написал.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.12.2012 (Пт) 7:56

Хакер писал(а):Так не бывает.

Dll c иконками можно делать программами, вообще с программированием не связанными. Ещё icl существует, кстати.

ger_kar писал(а):а вот VS2010 совсем другое дело. Но там нет разделения среды на VB и остальные приблуды :) . Там все общее, как при коммунизме, поэтому видимо на волне этой мысли так и написал.

Ну, в Express версии есть :D
А вообще, как ты собрался там dll создавать, Си++ проек Win32? Насколько я понимаю, всё остальное будет .NET, или для иконок не важно?

ger_kar писал(а):Термины то блин какие :) гипероним, гипоним, вроде русский в школе учил, но таковых ранее не слыхивал.

Я тоже, тем не менее, смысл-то понятен :)

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

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение Хакер » 21.12.2012 (Пт) 8:05

Qwertiy писал(а):А вообще, как ты собрался там dll создавать, Си++ проек Win32? Насколько я понимаю, всё остальное будет .NET, или для иконок не важно?

Вот это да...
Вообще-то, чтобы создать DLL из res-файла, достаточно просто Microsoft-овского линкера, который бесплатен.
Код: Выделить всё
link.exe my-res-file.res /nologo /noentry /dll /machine:x86 /out:my-res-lib.dll
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение Adam Smith » 27.12.2012 (Чт) 12:45

Изняюсь за вторжение.

Я уже довольно давно присваиваю форме 32х битную иконку. Правда не в IDE, а только в рантайм )

Повесить 32х битную иконку на обычный команд батон тоже не проблема. Почти без костылей.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение ger_kar » 27.12.2012 (Чт) 16:25

Adam Smith писал(а):Я уже довольно давно присваиваю форме 32х битную иконку. Правда не в IDE, а только в рантайм )Повесить 32х битную иконку на обычный команд батон тоже не проблема. Почти без костылей.
Ну конечно хотелось бы посмотреть не что (то что можно присвоить), а как происходит. Т.е. интересует методика :)
Бороться и искать, найти и перепрятать

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение Adam Smith » 28.12.2012 (Пт) 10:22

Код: Выделить всё
Private Declare Function SendMessage _
                Lib "user32" _
                Alias "SendMessageA" (ByVal hwnd As Long, _
                                      ByVal wMsg As Long, _
                                      ByVal wParam As Long, _
                                      lParam As Any) As Long

Private Declare Function GetWindowLong _
                Lib "user32" _
                Alias "GetWindowLongA" (ByVal hWnd As Long, _
                                        ByVal nIndex As Long) As Long

Private Declare Function SetWindowLong _
                Lib "user32" _
                Alias "SetWindowLongA" (ByVal hWnd As Long, _
                                        ByVal nIndex As Long, _
                                        ByVal dwNewLong As Long) As Long

Private Sub Form_Load()

  Const WM_SETICON As Long = &H80

  Const ICON_BIG   As Long = 1

  Const GWL_STYLE = (-16)

  Const BS_ICON As Long = 64

  Const BM_SETIMAGE As Long = 247

  Const IMAGE_ICON = 1

  Dim lIcon As Long

  '32х битная иконка формы VB6
  lIcon = LoadResPicture(1, vbResIcon)
  SendMessage Me.hwnd, WM_SETICON, ICON_BIG, ByVal lIcon

  '32х битная иконка кнопки VB6
  lIcon = LoadResPicture(2, vbResIcon)
  SetWindowLong Command1.hWnd, GWL_STYLE, GetWindowLong(Command1.hWnd, GWL_STYLE) Or BS_ICON
  SendMessage Command1.hWnd, BM_SETIMAGE, IMAGE_ICON, ByVal lIcon


Сейчас попробую подкинуть код сабклассинга, чтоб стиль кнопки не менялся.
Последний раз редактировалось Adam Smith 28.12.2012 (Пт) 10:35, всего редактировалось 3 раз(а).

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

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение Хакер » 28.12.2012 (Пт) 10:26

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение Adam Smith » 28.12.2012 (Пт) 10:36

:lol:
Хакер, это проще чем убрать кнопку дающую блевотный результат.

[Хакер] :: Эта кнопка нужна, чтобы вставить посреди строки. Константу ZLM_ALWAYS_CHECK_NODE знаешь?

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Иконки и другие ресурсы с 32 битным цветом

Сообщение Adam Smith » 28.12.2012 (Пт) 13:16

Не, честно незнаю.
Не обращай внимания :) , просто характер у меня такой, склочный :mrgreen:, плиз помоги с русификацией ошибок.

Кароч, тот код, что я дал нормально выглядит только в Win7 и Vista, в ХР кнопка становится классикой.

В ХР иконку на кнопку тоже можно и даже текст остается, НО нормально выглядят только 24 битные.

Или просто я не полностью разобрался с сабклассингом, вот на SQL.ru хороший пример от Дмитрия77.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

    TopList