Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Visual Basic Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167


Всем привет.

Как известно встроенные средства Visual Basic 6.0 не поддерживают возможности работы с PNG изображениями, т.е. к примеру нельзя ипользовать Png картинку в качестве свойства Form.Picture. Я представляю небольшую библиотеку и Add-in которые позволяют обойти эти ограничения. Данная библиотека позволяет загружать и сохранять Png изображения (с альфа каналом) стандартными средствами (LoadPicture / SavePicture), а также включает поддержку Png изображений (с альфа каналом) в контролы. Любой контрол который в своей работе использует стандарнтые Ole Picture объекты будет поддерживать загрузку Png изображений. В свою очередь если изображение выводится посредством IPicture::Render то картинка будет отрисовываться с учетом альфа канала. Данная библиотека должна работать на всех версиях Windows начиная с XP:

Картинка с другого сайта.

Как использовать?

Библиотека может быть использована как внешняя DLL либо быть прилинкована к исполняемому файлу (только native code). Для использования в качестве Dll необходимо вызвать функцию Initialize которая вернет 1 в случае успеха. После этого можно пользоваться возможностями библиотеки. Если необходимо выгрузить библиотеку то нужно вызвать функцию CanUnloadNow которая сообщит можно ли в данный момент выгрузить библиотеку. Если библиотека готова к выгрузке функция вернет S_OK после которой нужно вызвать Uninitialize. Если функция возвращает S_FALSE то библиотеку нельзя выгружать т.к. имеются активные Picture объекты которые еще не выгружены и они используют библиотеку. Для IDE создан специальный Add-in который автоматически загружает библиотеку при старте среды. В скомпилированном варианте можно к примеру в событии Initialize или в процедуре Main вызывать Initialize, а при завершении Uninitialize:
Private Declare Function Initialize Lib "VBPng.dll" () As Long
Private Declare Sub Uninitialize Lib "VBPng.dll" ()

Private Sub Form_Initialize()

    If Initialize() = 0 Then
        MsgBox "Unable to initialize png dll", vbCritical
    End If
    
End Sub

Private Sub Form_Terminate()
    Uninitialize
End Sub


Для статической линковки необходимо использовать более новый линкер (в своих примерах я использовал линкер из Visual Studio 2010), поскольку оригинальный имеет баги при использовании опции /OPT:REF, а также в секцию VBCompiler файла проекта (vbp) необходимо добавить параметры:
Для EXE:
LinkSwitches= ..\Libs\msvcrt_winxp.obj ..\Libs\VBPng.lib -ENTRY:mainCRTStartup

Для DLL:
LinkSwitches= ..\Libs\msvcrt_winxp.obj ..\Libs\VBPng.lib -ENTRY:VBDllMain -EXPORT:Initialize -EXPORT:Uninitialize

В случае DLL, в скомпилированном виде необходимо сделать инициализацию, вызвав Initialize из себя же при первом запуске.

Как это работает?

Библиотека написана на C++. Принцип работы библиотеки основан на перехвате функций OleLoadPictureEx и OleLoadPicture. Данные функции не поддерживают загрузку PNG изображений, поэтому если загружается PNG файл, библиотека VbPng пытается загрузить файл с помощью GDI+. При успехе создается аналогичный StdPicture объект который и возвращается функцией. Для вызывающей стороны все это выглядит как-будто она работает с оригинальным объектом. Сам объект поддерживает интерфейсы IPicture, IPictureDisp, IPersistStream, IConnectionPointContainer (не поддерживает connection point'ы возвращает E_NOTIMPL), IDispatch, поэтому может быть присвоен Object переменной или к примеру быть сохраненным в PropertyBag.

Перехватчик функций реализован в классе CHooker. Данный класс использует дизассемблер длин (ldasm) от Ms-Rem с небольшой доработкой. Доработка заключается в добавление флага OP_REL32 к некоторым инструкциям (к примеру JMP SHORT), поскольку в оригинале на некоторых относительных инструкциях этот флаг отсутствовал. Для перехвата функции используется простейший метод сплайсинга при котором в начало функции всталяется инструкция JMP которая переводит поток исполнения на функцию-перехватчик. Поскольку в начале оригинальной функции содержатся инструкции которые мы перезаписываем, необходимо правильно перенести инструкции для того чтобы была возможность вызвать оригинальную функцию. При вызове метода Hook с помощью дизассемблера длин определяется целое количество инструкций которое будет перезаписано инструкцией JMP (5 байт). После этого выделяется временный буфер (с разрешением на исполнение данных) в который будут скопированы данные инструкции + JMP на инструкцию следующую за перезаписываемой. Это позволит, передав управление на этот буфер, вызвать оригинальную функцию как-будто перехвата не было. Тут существует одна сложность заключающаяся в том, что мы не можем просто так скопировать инструкции, поскольку существуют относительные инструкции типа JMP, CALL, JNE которые "прыгают" относительно своего адреса. Для определения типа инструкции как раз и служит флаг OP_REL32 который показывает является ли инструкция относительной или нет. Другая сложность заключается в том что существуют "короткие" относительные инструкции которые "прыгают" в пределах 255 байт, а при переносе кода в буфер расстояние может значительно увеличится. Поэтому после определения количества перезаписываемых инструкций выделяется буфер размером как минимум чтобы обеспечить транслирование из коротких в длинные инструкции. После этого производится анализ каждой инструкции и при необходимости происходит корректировка смещения и типа. В конце буфера добавляется инструкция JMP со смещением на инструкцию следующую за последней перезаписаной. Наконец начало функции перезаписывается на безусловный JMP на функцию-перехватчик.

CHooker объекты используют в качестве буфера кода кучу (Heap) с разрешением на исполнение, поэтому код является DEP безопасным. Куча автоматически создается при создании первого перехватчика и удаляется при уничтожении последнего. В проекте используются 2 таких объекта для перехвата 2-х функций OleLoadPictureEx и OleLoadPicture, с соответствующим перехватчиками OleLoadPictureEx_user и OleLoadPicture_user. В системах до Windows 8 можно было перехватывать только одну OleLoadPictureEx функцию которая вызывается из OleLoadPicture, но начиная с Windows 8 OleLoadPicture вызывает уже недокументированную OleLoadPictureExt, поэтому для обеспечения правильной работы некоторых контролов (к примеру ImageList) нужно перехватывать 2 этих функции. Конечно можно пробовать перехватывать OleLoadPictureExt, но эта функция недокументирована и не факт что в новых версиях Microsoft не изменят эту функцию на другую. В перехватчиках вызывается оригинальная функция и если вызов окончился неудачей вызывается наша реализация. Чтобы обеспечить возможность узнать был ли перехват уже осуществлен (к примеру подгруженная DLL уже перехватила и нет смысла делать это еще раз) используется переменна окружения "VBPng".

Основа библиотеки - класс CPicture который и реализует всю логику работы изображений. Данный класс создавался на основе реверс-инжиниринга библиотеки oleaut32 некоторые функции возможно реализованы не точно. Данный класс позволяет загружать PNG изображения из COM потока (IStream), а также сохранять их в него. Библиотека ведет учет созданных объектов в глобальной переменной g_lCountOfObject для того чтобы обеспечить контроль при выгрузке библиотеки вызовом CanUnloadNow. В противном случае не было бы способа узнать можно ли выгрузить библиотеку или нет. Соответственно при выгрузке библиотеки которой пользуются активные объекты происходило бы падение.

Загрузка изображения выполняется в методе LoadFromStream. Поскольку при загрузке из потока GDI+ автоматически устанавливает указатель в начало, приходится создавать поток в коотром содержатся только данные PNG файла. Эта задача выполняется методом CreatePngStream в котором происходит также первичная валидация PNG чанков. Далее с помощью GDI+ происходит создание объекта Bitmap из данных временного потока. Далее создается DIB-секция и в нее копируются данные PNG пикселей в формате PixelFormat32bppPARGB. Это позволяет выводить изображение с альфа-каналом посредством функции AlphaBlend, а также имеется возможность доступа к GDI-совместимому HBITMAP. Далее, если установлено свойство KeepOriginalFormat равным true, происходит сохранение PNG потока (это позволяет легко сохранять PNG файл без перекодировки).

Второй по важности метод - это Render. Тут все просто, происходит подготовка координат для вывода изображения в HIMETRIC и происходит вывод с помощью AlphaBlend. Т.к. свойство get_Attributes возвращает PICTURE_TRANSPARENT то пользователь перед выводом изображения сам заботится о восстановлении фона за изображением.

Метод SaveAsFile сохраняет изображение в поток. Тут все тоже самое только наоборот. Также стоит отметить что если использовалось сохранение оригинального формата то данные изображение берутся из сохраненного PNG потока. В противном случае создается временный GDI+ битмап из пикселей DIB-секции, извлекается CLSID PNG кодека и происходит сохранение изображения во временный поток. Далее из этого потока данные копируются в поток назначения.

Следующая группа методов это реализация интерфейса IDispatch. Поскольку данные о типе IPicture хранятся в стандартной библиотеке stdole2.tlb то в методе GetTypeInfo происходит загрузка этой библиотеки с извлечением нужного интерфейса типа через ITypeLib::GetTypeInfoOfGuid. Тоже самое относится к методу GetIDsOfNames, тут просто происходит транслирование вызова стандартному ITypeInfo::GetIDsOfNames. Метод Invoke реализован напрямую с проверкой параметров.

Для того чтобы можно было статически прилинковать библиотеку к VB6 EXE файлу необходимо инициализировать сишный рантайм передачей управления на функцию mainCRTStartup и передать управление на метку ___vbaS. Для этой цели служит файл gostartup.asm написаный на fasm'е. Для EXE файла выполняются строчки:
_main:
call Initialize
jmp ___vbaS

Сишный рантайм вызывает функцию main, а она в свою очередь инициализирует библиотеку VbPng. Тут существует проблема со старым линкером, поскольку то ли из-за бага, то ли из-за чего то еще, ликер отбрасывает весь VB-шный импорт из результирующего файла при использовании опции -OPT:REF. Решается данная проблема просто - заменой линкера на современный.
Для DLL выполняются похожие действия, только в этом случае необходимо указать в качестве точки входа _VBDllMain:
_VBDllMain:

push dword [esp + 12]
push dword [esp + 12]
push dword [esp + 12]

; // Init CRT
call  __DllMainCRTStartup@12

; // Init runtime
jmp ___vbaS   

В этом случае сначала вызывается инициализации сишного рантайма, а затем происходит переход на функцию DllMain ActiveX Dll.

Для олегчения работы в IDE был написан Add-in который автоматически загружает VbPng.dll для того чтобы было удобно работать с проектами. Для отключения библиотеки просто нужно отключить Add-in. Тут есть ньюанс, если есть активные PNG-изображения, то Add-in выгрузится, но VbPng нет, при этом покажется предупреждение. В любой момент можно будет включить Add-in, найти изображения, удалить их, и заново отключить Add-in, тогда DLL выгрузится.

_____________________________________________________________________________________________________________

Некоторые контролы, к примеру ListView, не будут отображать альфа канал, поскольку отрисовывают себя не методом Render, а через StretchBlt, для них premultiplied фон будет черный. Это следует иметь в виду при работе с библиотекой. Также не поддерживаются уведомления IPropertyNotifySink (при желании можно реализовать). Ресурсы в FRX файлах и скомпилированных файлах также хранятся в PNG поэтому проекты не будут открываться и работать без библиотеки. Для комфортной работы рекомендуется установить Add-in с автоматическим запуском при загрузке IDE.

В директории содержатся также несколько примеров работы:

  • Test_EXE_Linked - демонстрация 32bpp PNG изображений на стандартных контролах с использованием статической линковки;
  • Test_EXE_Dll - тоже самое только с использованием dll;
  • Test_AXDll - ActiveX DLL библиотека с использованием PNG ресурсов на форме;
  • Test_SavePng - пример сохранения изображения посредством SavePicture.


Также в директории содержатся PNG файлы, собраные мной еще давно посредством спутниковой рыбалки.

Модуль слабо тестировался, поэтому возможны баги. Буду очень рад любым замечаниям, по мере возможности буду их исправлять.
Всем спасибо за внимание, надеюсь модуль кому-то будет полезен.

Проект на GitHub.

The trick,
2019.
25 янв 19, 11:19    [21794058]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
Файлы на гитхабе битые. В кодировке Unix(LF). VB их не понимает. Перезалей плиз архив в другое место.
25 янв 19, 11:56    [21794105]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
Test_EXE_Linked - не билдится:

автор
Microsoft (R) Incremental Linker Version 14.16.27026.1
Copyright (C) Microsoft Corporation. All rights reserved.

LINK : warning LNK4010: invalid subsystem version number 4.0; default subsystem version assumed
LINK : fatal error LNK1104: cannot open file 'kernel32.lib'
25 янв 19, 12:30    [21794142]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
Проект Test_EXE_Dll и Test_EXE_Linked открываются у меня с ошибкой

автор
'C:\Downloads\VbPng-master\VbPng-master\VbSources\Test_EXE_Dll\comctl32.Ocx' could not be loaded--Continue Loading Project?


Помогло понижение версии comctl32 в VBP файле.

Object={6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.5#0; comctl32.Ocx


поменять на:

Object={6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.4#0; comctl32.Ocx
25 янв 19, 12:46    [21794170]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
AndrF
Member

Откуда:
Сообщений: 2062
Насколько помню, стандартная библиотека для этих целей называется gdiplus.dll

Все необходимое для работы с изображениями там есть.
25 янв 19, 12:52    [21794186]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ЦЦа
Member

Откуда:
Сообщений: 17
ATM-TURBO 2,

по крайней мере часть use cases закрывается конвертированием PNG в EMF, имеющем внутри себя EMR_ALPHABLEND (ту же AlphaBlend()) с тем же DIB в PixelFormat32bppPARGB. Пример на форуме: 10895839. Это один модуль с run-time зависимостью от GDI+.
25 янв 19, 13:09    [21794203]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Eolt
Test_EXE_Linked - не билдится:

автор
Microsoft (R) Incremental Linker Version 14.16.27026.1
Copyright (C) Microsoft Corporation. All rights reserved.

LINK : warning LNK4010: invalid subsystem version number 4.0; default subsystem version assumed
LINK : fatal error LNK1104: cannot open file 'kernel32.lib'

Исправил, это было из-за неправильной конфигурации git
25 янв 19, 13:14    [21794211]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
В 2017 студии VBPng не собирается. Просит (Platform Toolset = 'v100').

автор
1>------ Rebuild All started: Project: VBPng, Configuration: ReleaseDll Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Microsoft.Cpp.Platform.targets(65,5): error MSB8020: The build tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found. To build using the v100 build tools, please install Visual Studio 2010 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Done building project "VBPng.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
25 янв 19, 13:16    [21794215]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
ЦЦа
Насколько помню, стандартная библиотека для этих целей называется gdiplus.dll

Все необходимое для работы с изображениями там есть.

Ну и? Модуль как раз и использует gdi+ в описании же написано.

ЦЦа
ATM-TURBO 2,

по крайней мере часть use cases закрывается конвертированием PNG в EMF, имеющем внутри себя EMR_ALPHABLEND (ту же AlphaBlend()) с тем же DIB в PixelFormat32bppPARGB. Пример на форуме: 10895839. Это один модуль с run-time зависимостью от GDI+.

Не понимаю причем тут это.
25 янв 19, 13:21    [21794224]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Eolt
В 2017 студии VBPng не собирается. Просит (Platform Toolset = 'v100').

автор
1>------ Rebuild All started: Project: VBPng, Configuration: ReleaseDll Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Microsoft.Cpp.Platform.targets(65,5): error MSB8020: The build tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found. To build using the v100 build tools, please install Visual Studio 2010 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Done building project "VBPng.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Ну выбери свой набор, я просто в 2010 собирал:
Картинка с другого сайта.
25 янв 19, 13:24    [21794229]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
ATM-TURBO 2,

да сейчас попробую, просто некоторые проекты после смены платформы перестают собираться почему-то
25 янв 19, 13:26    [21794231]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ЦЦа
Member

Откуда:
Сообщений: 17
ATM-TURBO 2
ЦЦа
Насколько помню, стандартная библиотека для этих целей называется gdiplus.dll

Все необходимое для работы с изображениями там есть.

Ну и? Модуль как раз и использует gdi+ в описании же написано.
Не я автор цитаты.

ATM-TURBO 2
Не понимаю причем тут это.
При том, что размах могуч, но при рассмотрении случаев реальных применений может оказаться, что слишком могуч, и можно обойтись меньшей кровью и прочим геморроем.
25 янв 19, 13:41    [21794251]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
Platform Toolset: Visual Studio 2017 (v141)

Ошибка при ребилде:

автор
1>------ Rebuild All started: Project: VBPng, Configuration: ReleaseDll Win32 ------
1>CHooker.cpp
1>CPicture.cpp
1>c:\users\alex\downloads\vbpng-master (1)\vbpng-master\vbpnglibcpp\cpicture.cpp(68): warning C4244: '+=': conversion from 'LONGLONG' to 'DWORD', possible loss of data
1>c:\users\alex\downloads\vbpng-master (1)\vbpng-master\vbpnglibcpp\cpicture.cpp(223): warning C4533: initialization of 'rc' is skipped by 'goto CleanUp'
1>c:\users\alex\downloads\vbpng-master (1)\vbpng-master\vbpnglibcpp\cpicture.cpp(178): note: see declaration of 'rc'
1>c:\users\alex\downloads\vbpng-master (1)\vbpng-master\vbpnglibcpp\cpicture.cpp(223): note: see declaration of 'CleanUp'
1>dllmain.cpp
1>ldasm.cpp
1>VBPng.cpp
1>LINK : fatal error LNK1181: cannot open input file 'msvcrt_winxp.obj'
1>Done building project "VBPng.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
25 янв 19, 13:43    [21794254]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
ЦЦа
При том, что размах могуч, но при рассмотрении случаев реальных применений может оказаться, что слишком могуч, и можно обойтись меньшей кровью и прочим геморроем.

Покажи пожалуйста как с помощью модуля который ты мне приводишь в качестве примера сделать тоже самое что на видео. Я пока вообще не вижу связи, либо ты не понял для чего модуль предназначен.
25 янв 19, 13:51    [21794270]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Eolt
Platform Toolset: Visual Studio 2017 (v141)

Ошибка при ребилде:

автор
1>------ Rebuild All started: Project: VBPng, Configuration: ReleaseDll Win32 ------
1>CHooker.cpp
1>CPicture.cpp
1>c:\users\alex\downloads\vbpng-master (1)\vbpng-master\vbpnglibcpp\cpicture.cpp(68): warning C4244: '+=': conversion from 'LONGLONG' to 'DWORD', possible loss of data
1>c:\users\alex\downloads\vbpng-master (1)\vbpng-master\vbpnglibcpp\cpicture.cpp(223): warning C4533: initialization of 'rc' is skipped by 'goto CleanUp'
1>c:\users\alex\downloads\vbpng-master (1)\vbpng-master\vbpnglibcpp\cpicture.cpp(178): note: see declaration of 'rc'
1>c:\users\alex\downloads\vbpng-master (1)\vbpng-master\vbpnglibcpp\cpicture.cpp(223): note: see declaration of 'CleanUp'
1>dllmain.cpp
1>ldasm.cpp
1>VBPng.cpp
1>LINK : fatal error LNK1181: cannot open input file 'msvcrt_winxp.obj'
1>Done building project "VBPng.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Если ты хочешь пересобрать библиотеку, а не пользоваться готовой.
Нужно либо установить WDK, это в случае если хочешь чтобы производимые exe-шники работали на всех системах без всяких доп зависимостей. Там будет msvcrt_winxp.obj который позволяет использовать msvcrt.dll доступный на чистой XP и выше. Также можно просто скачать нужные библиотечные файлы без установки WDK (msvcrt.lib и msvcrt_winxp.obj). Первый дает линкеру понять что нужно линковать не со спецефичной CRT (типа MSVCR100.dll), а с системной MSVCRT.DLL. Второй задает минимальную версию.
Если зависимости не смущают, то в настройках проекта нужно просто убрать msvcrt_winxp.obj и msvcrt.lib для билда ReleaseDll, и msvcrt_winxp.obj
Если зависимости не смущают то можно просто в билде ReleaseDll убрать msvcrt.lib и msvcrt_winxp.obj из доп зависимостей компоновщика, для билда ReleaseLib удалить msvcrt.lib и msvcrt_winxp.obj, и добавить свою CRT которая используется по умолчанию студией (обычно лежит в папке \VC\lib\).
25 янв 19, 14:02    [21794284]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
Потестил на PNG файлах. Почему-то при добавлении этого файла, студия крашится: http://pngimg.com/uploads/light/light_PNG14440.png

К сообщению приложен файл. Размер - 119Kb
25 янв 19, 14:09    [21794290]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Eolt
Потестил на PNG файлах. Почему-то при добавлении этого файла, студия крашится: http://pngimg.com/uploads/light/light_PNG14440.png

Спасибо за тестирование, сейчас постараюсь исправить.
25 янв 19, 14:12    [21794294]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Eolt,
Баг исправлен. В методе CPicture::LoadFromStream неверно заполнялось поле bi.bmiHeader.biHeight, было:
	bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bi.bmiHeader.biBitCount = 32;
	bi.bmiHeader.biHeight = -rc.Width;
	bi.bmiHeader.biWidth = rc.Width;
	bi.bmiHeader.biPlanes = 1;

стало:
	bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bi.bmiHeader.biBitCount = 32;
	bi.bmiHeader.biHeight = -rc.Height;
	bi.bmiHeader.biWidth = rc.Width;
	bi.bmiHeader.biPlanes = 1;

Еще раз спасибо, за тестирование. Обновил.
25 янв 19, 14:30    [21794317]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
А вообще автор молодец! Проект круто сделан. Посредством хака обновил среду разработки, заставил ее работать с png файлами.
25 янв 19, 14:33    [21794320]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Eolt
А вообще автор молодец! Проект круто сделан. Посредством хака обновил среду разработки, заставил ее работать с png файлами.

Спасибо. Хорошо даже не это, а то что в скомпилированном файле также будут лежать PNG ресурсы с альфа каналом и EXE/DLL будет загружать их во время работы. Также данную библиотеку можно при желании использовать и в VBA (32bit) и вообще где угодно, где используются ActiveX контролы.
25 янв 19, 14:39    [21794325]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
Похоже еще один баг. Почему-то перестали добавляться PNG в контролы. Все время пишет Invalid Picture

К сообщению приложен файл. Размер - 138Kb
25 янв 19, 15:07    [21794354]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Eolt
Похоже еще один баг. Почему-то перестали добавляться PNG в контролы. Все время пишет Invalid Picture

После чего такое поведение проявилось? Dll обновил после последнего багфикса?
25 янв 19, 15:14    [21794365]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
Похоже дело в плохих PNG файлах в архиве. Они или испорчены, или в каком-то непонятном формате.

К сообщению приложен файл (PNGs.zip - 84Kb) cкачать
25 янв 19, 15:15    [21794366]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
ATM-TURBO 2
Member

Откуда:
Сообщений: 167
Eolt
Похоже дело в плохих PNG файлах в архиве. Они или испорчены, или в каком-то непонятном формате.

Я новичек в работе с гитхабом, поэтому полно ошибок в настройке. Обновил настройки, сейчас все должно правильно качаться. Просто я добавил в атрибуты *.png binary, а у некоторых файлов расширение с заглавной буквы было поэтому он заменял там перевод строки.
25 янв 19, 15:26    [21794379]     Ответить | Цитировать Сообщить модератору
 Re: PNG изображения в стандартных контролах VB6.  [new]
Eolt
Member

Откуда:
Сообщений: 1469
Вопрос про линковку файлов.

Можно ли делать свои obj файлы и линковать их к VB-экзешникам? И чтобы функции в OBJ были доступны из VB-кода (Не через секцию экспорта в EXE)

И еще допустим у меня проект использует много DLL библиотек. Я могу получить из них OBJ подобной утилитой. Смогу я слинковать эти OBJ с моим VB-экзешником, чтобы они были доступны из кода?
25 янв 19, 15:45    [21794395]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Visual Basic Ответить