VBCommons/api/z_LoadPictureAPI.bas

98 lines
3.1 KiB
QBasic
Raw Permalink Normal View History

2024-06-07 20:46:40 +03:00
Attribute VB_Name = "z_LoadPictureAPI"
'================ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> GDI =============
' Shared module version: 20210228
' Required reference:
Option Private Module
Option Explicit
'Declare a UDT to store a GUID for the IPicture OLE Interface
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
'Declare a UDT to store the bitmap information
Private Type PictDescriptor
size_ As LongLong
type_ As LongLong
hPic_ As LongPtr
hPal_ As LongLong
End Type
'Declare a UDT to store the GDI+ Startup information
Private Type GdiplusStartupInput
version_ As Long
callback_ As LongPtr
suppBgThread_ As LongLong
suppExtCodecs_ As LongLong
End Type
'Windows API calls into the GDI+ library
Private Declare PtrSafe Function GdiplusStartup Lib "GDIPlus" (pToken As LongPtr, pInputBuf As GdiplusStartupInput, Optional ByVal pOutputBuf As LongPtr = 0) As Long
Private Declare PtrSafe Function GdipCreateBitmapFromFile Lib "GDIPlus" (ByVal pFile As LongPtr, pBitmap As LongPtr) As Long
Private Declare PtrSafe Function GdipCreateHBITMAPFromBitmap Lib "GDIPlus" (ByVal pBitmap As LongPtr, hbmReturn As LongPtr, ByVal pBackground As LongPtr) As Long
Private Declare PtrSafe Function GdipDisposeImage Lib "GDIPlus" (ByVal pImage As LongPtr) As Long
Private Declare PtrSafe Function GdiplusShutdown Lib "GDIPlus" (ByVal pToken As LongPtr) As Long
Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" (PicDesc As PictDescriptor, RefIID As GUID, ByVal fPictureOwnsHandle As LongPtr, iPic As IPicture) As LongPtr
Private Const PICTYPE_BITMAP = 1
' Procedure: LoadPictureGDI
' Purpose: Loads an image using GDI+
' Returns: The image as an IPicture Object
Public Function LoadPictureGDI(ByVal sFileName$) As IPicture
'Initialize GDI+
Dim uGdiInput As GdiplusStartupInput
uGdiInput.version_ = 1
Dim hGdiPlus As LongPtr
Dim lResult&: lResult = GdiplusStartup(hGdiPlus, uGdiInput)
If lResult <> 0 Then _
Exit Function
Dim hGdiImage As LongPtr
If GdipCreateBitmapFromFile(StrPtr(sFileName), hGdiImage) = 0 Then
Dim hBitmap As LongPtr
Call GdipCreateHBITMAPFromBitmap(hGdiImage, hBitmap, 0)
Set LoadPictureGDI = CreateIPicture(hBitmap)
Call GdipDisposeImage(hGdiImage)
End If
Call GdiplusShutdown(hGdiPlus)
End Function
' Procedure: CreateIPicture
' Purpose: Converts a image handle into an IPicture object.
' Returns: The IPicture object
Private Function CreateIPicture(ByVal hPic As LongPtr) As IPicture
Dim IID_IDispatch As GUID
With IID_IDispatch
.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
Dim uPicInfo As PictDescriptor
With uPicInfo
.size_ = Len(uPicInfo)
.type_ = PICTYPE_BITMAP
.hPic_ = hPic
.hPal_ = 0
End With
Dim iPic As IPicture
Call OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, iPic)
Set CreateIPicture = iPic
End Function