关于VB6中代码显示PNG图片的问题

关于VB6中代码显示PNG图片的问题,第1张

概述vb6中显示png图片,主要代码来自于帖子 http://www.vbforums.com/showthread.php?509292-RESOLVED-png-files-in-Visual-Basic中的【Using_Ping_In_VB.ZIP】例子。 本人对【Using_Ping_In_VB.ZIP】的代码做了相关修改以适应本人要求。具体代码见下面 1. modGDIPlusResize.

vb6中显示png图片,主要代码来自于帖子

http://www.vbforums.com/showthread.php?509292-RESOLVED-png-files-in-Visual-Basic中的【Using_Ping_In_VB.ZIP】例子。

本人对【Using_Ping_In_VB.ZIP】的代码做了相关修改以适应本人要求。具体代码见下面

1.modGDIPlusResize.bas

Option ExplicitPrivate Type GUID   Data1    As Long   Data2    As Integer   Data3    As Integer   Data4(7) As ByteEnd TypePrivate Type PICTDESC   size     As Long   Type     As Long   hBmp     As Long   hPal     As Long   Reserved As LongEnd TypePrivate Type Gdiplusstartupinput    Gdiplusversion           As Long    DeBUGEventCallback       As Long    SuppressBackgroundThread As Long    SuppressExternalCodecs   As LongEnd TypePrivate Type PWMFRect16    left   As Integer    top    As Integer    Right  As Integer    Bottom As IntegerEnd TypePrivate Type wmfplaceablefileheader    Key         As Long    hMf         As Integer    BoundingBox As PWMFRect16    Inch        As Integer    Reserved    As Long    CheckSum    As IntegerEnd Type' GDI FunctionsPrivate Declare Function CreateCompatibleDC lib "gdi32" (ByVal hDC As Long) As LongPrivate Declare Function oleCreatePictureIndirect lib "olepro32.dll" (PicDesc As PICTDESC,RefIID As GUID,ByVal fPictureOwnsHandle As Long,IPic As IPicture) As LongPrivate Declare Function CreateCompatibleBitmap lib "gdi32" (ByVal hDC As Long,ByVal nWIDth As Long,ByVal nHeight As Long) As LongPrivate Declare Function GetDeviceCaps lib "gdi32" (ByVal hDC As Long,ByVal nIndex As Long) As LongPrivate Declare Function PatBlt lib "gdi32" (ByVal hDC As Long,ByVal x As Long,ByVal y As Long,ByVal nHeight As Long,ByVal DWRop As Long) As LongPrivate Declare Function CreateBitmap lib "gdi32" (ByVal nWIDth As Long,ByVal nPlanes As Long,ByVal nBitCount As Long,lpBits As Any) As LongPrivate Declare Function SelectObject lib "gdi32" (ByVal hDC As Long,ByVal hObject As Long) As LongPrivate Declare Function CreateSolIDBrush lib "gdi32" (ByVal crcolor As Long) As LongPrivate Declare Function DeleteObject lib "gdi32" (ByVal hObject As Long) As LongPrivate Declare Function DeleteDC lib "gdi32" (ByVal hDC As Long) As Long' GDI+ functionsPrivate Declare Function GdipLoadImageFromfile lib "gdiplus.dll" (ByVal filename As Long,GpImage As Long) As LongPrivate Declare Function Gdiplusstartup lib "gdiplus.dll" (Token As Long,gdipinput As Gdiplusstartupinput,GdiplusstartupOutput As Long) As LongPrivate Declare Function GdipCreateFromHDC lib "gdiplus.dll" (ByVal hDC As Long,GpGraphics As Long) As LongPrivate Declare Function GdipSetInterpolationMode lib "gdiplus.dll" (ByVal Graphics As Long,ByVal InterMode As Long) As LongPrivate Declare Function GdipDrawImageRectI lib "gdiplus.dll" (ByVal Graphics As Long,ByVal img As Long,ByVal WIDth As Long,ByVal Height As Long) As LongPrivate Declare Function GdipDeleteGraphics lib "gdiplus.dll" (ByVal Graphics As Long) As LongPrivate Declare Function GdipdisposeImage lib "gdiplus.dll" (ByVal Image As Long) As LongPrivate Declare Function GdipCreateBitmapFromHBITMAP lib "gdiplus.dll" (ByVal hBmp As Long,ByVal hPal As Long,GpBitmap As Long) As LongPrivate Declare Function GdipGetimageWIDth lib "gdiplus.dll" (ByVal Image As Long,WIDth As Long) As LongPrivate Declare Function GdipGetimageHeight lib "gdiplus.dll" (ByVal Image As Long,Height As Long) As LongPrivate Declare Function GdipCreateMetafileFromWmf lib "gdiplus.dll" (ByVal hWmf As Long,ByVal deleteWmf As Long,Wmfheader As wmfplaceablefileheader,Metafile As Long) As LongPrivate Declare Function GdipCreateMetafileFromEmf lib "gdiplus.dll" (ByVal hEmf As Long,ByVal deleteEmf As Long,Metafile As Long) As LongPrivate Declare Function GdipCreateBitmapFromHICON lib "gdiplus.dll" (ByVal hIcon As Long,GpBitmap As Long) As LongPrivate Declare Function GdipDrawImageRectRectI lib "gdiplus.dll" (ByVal Graphics As Long,ByVal GpImage As Long,ByVal dstx As Long,ByVal dsty As Long,ByVal dstwIDth As Long,ByVal dstheight As Long,ByVal srcx As Long,ByVal srcy As Long,ByVal srcwIDth As Long,ByVal srcheight As Long,ByVal srcUnit As Long,ByVal imageAttributes As Long,ByVal callback As Long,ByVal callbackData As Long) As LongPrivate Declare Sub GdiplusShutdown lib "gdiplus.dll" (ByVal Token As Long)' GDI and GDI+ constantsPrivate Const PLAnes = 14            '  Number of planesPrivate Const BITSPIXEL = 12         '  Number of bits per pixelPrivate Const PATcopY = &HF00021     ' (DWORD) dest = patternPrivate Const PICTYPE_BITMAP = 1     ' Bitmap typePrivate Const InterpolationModeHighQualityBicubic = 7Private Const GDIP_WMF_PLACEABLEKEY = &H9AC6CDD7Private Const UnitPixel = 2' Initialises GDI PlusPublic Function InitGDIPlus() As Long    Dim Token    As Long    Dim gdipInit As Gdiplusstartupinput        gdipInit.Gdiplusversion = 1    Gdiplusstartup Token,gdipInit,ByVal 0&    InitGDIPlus = TokenEnd Function' Frees GDI PlusPublic Sub FreeGDIPlus(Token As Long)    GdiplusShutdown TokenEnd Sub' Loads the picture (optionally resized)Public Function LoadPictureGDIPlus(Picfile As String,Optional WIDth As Long = -1,Optional Height As Long = -1,Optional ByVal Backcolor As Long = vbWhite,Optional RetainRatio As Boolean = False) As IPicture    Dim hDC     As Long    Dim hBitmap As Long    Dim img     As Long            ' Load the image    If GdipLoadImageFromfile(StrPtr(Picfile),img) <> 0 Then        Err.Raise 999,"GDI+ Module","Error loading picture " & Picfile        Exit Function    End If        ' Calculate picture's wIDth and height if not specifIEd    If WIDth = -1 Or Height = -1 Then        GdipGetimageWIDth img,WIDth        GdipGetimageHeight img,Height    End If        ' Initialise the hDC    InitDC hDC,hBitmap,Backcolor,WIDth,Height    ' Resize the picture    gdipResize img,hDC,Height,RetainRatio    GdipdisposeImage img        ' Get the bitmap back    GetBitmap hDC,hBitmap    ' Create the picture    Set LoadPictureGDIPlus = CreatePicture(hBitmap)End Function' Initialises the hDC to drawPrivate Sub InitDC(hDC As Long,hBitmap As Long,Backcolor As Long,WIDth As Long,Height As Long)    Dim hBrush As Long            ' Create a memory DC and select a bitmap into it,fill it in with the backcolor    hDC = CreateCompatibleDC(ByVal 0&)    hBitmap = CreateBitmap(WIDth,GetDeviceCaps(hDC,PLAnes),BITSPIXEL),ByVal 0&)    hBitmap = SelectObject(hDC,hBitmap)    hBrush = CreateSolIDBrush(Backcolor)    hBrush = SelectObject(hDC,hBrush)    PatBlt hDC,PATcopY    DeleteObject SelectObject(hDC,hBrush)End Sub' Resize the picture using GDI plusPrivate Sub gdipResize(img As Long,hDC As Long,Height As Long,Optional RetainRatio As Boolean = False)    Dim Graphics   As Long      ' Graphics Object Pointer    Dim OrWIDth    As Long      ' Original Image WIDth    Dim OrHeight   As Long      ' Original Image Height    Dim OrRatio    As Double    ' Original Image Ratio    Dim DesRatio   As Double    ' Destination rect Ratio    Dim DestX      As Long      ' Destination image X    Dim DestY      As Long      ' Destination image Y    Dim DestWIDth  As Long      ' Destination image WIDth    Dim DestHeight As Long      ' Destination image Height        GdipCreateFromHDC hDC,Graphics    GdipSetInterpolationMode Graphics,InterpolationModeHighQualityBicubic        If RetainRatio Then        GdipGetimageWIDth img,OrWIDth        GdipGetimageHeight img,OrHeight                OrRatio = OrWIDth / OrHeight        DesRatio = WIDth / Height                ' Calculate destination coordinates        DestWIDth = IIf(DesRatio < OrRatio,Height * OrRatio)        DestHeight = IIf(DesRatio < OrRatio,WIDth / OrRatio,Height)'        DestX = (WIDth - DestWIDth) / 2'        DestY = (Height - DestHeight) / 2        DestX = 0        DestY = 0        GdipDrawImageRectRectI Graphics,img,DestX,DestY,DestWIDth,DestHeight,OrWIDth,OrHeight,UnitPixel,0    Else        GdipDrawImageRectI Graphics,Height    End If    GdipDeleteGraphics GraphicsEnd Sub' Replaces the old bitmap of the hDC,Returns the bitmap and Deletes the hDCPrivate Sub GetBitmap(hDC As Long,hBitmap As Long)    hBitmap = SelectObject(hDC,hBitmap)    DeleteDC hDCEnd Sub' Creates a Picture Object from a handle to a bitmapPrivate Function CreatePicture(hBitmap As Long) As IPicture    Dim IID_Idispatch As GUID    Dim Pic           As PICTDESC    Dim IPic          As IPicture        ' Fill in olE Idispatch Interface ID    IID_Idispatch.Data1 = &H20400    IID_Idispatch.Data4(0) = &HC0    IID_Idispatch.Data4(7) = &H46            ' Fill Pic with necessary parts    Pic.size = Len(Pic)        ' Length of structure    Pic.Type = PICTYPE_BITMAP  ' Type of Picture (bitmap)    Pic.hBmp = hBitmap         ' Handle to bitmap    ' Create the picture    oleCreatePictureIndirect Pic,IID_Idispatch,True,IPic    Set CreatePicture = IPicEnd Function' Returns a resized version of the picturePublic Function Resize(Handle As Long,PicType As PictureTypeConstants,Optional Backcolor As Long = vbWhite,Optional RetainRatio As Boolean = False) As IPicture    Dim img       As Long    Dim hDC       As Long    Dim hBitmap   As Long    Dim Wmfheader As wmfplaceablefileheader        ' Determine pictyre type    Select Case PicType    Case vbPicTypeBitmap         GdipCreateBitmapFromHBITMAP Handle,ByVal 0&,img    Case vbPicTypeMetafile         FillinWmfheader Wmfheader,Height         GdipCreateMetafileFromWmf Handle,False,Wmfheader,img    Case vbPicTypeEMetafile         GdipCreateMetafileFromEmf Handle,img    Case vbPicTypeIcon         ' Does not return a valID Image object         GdipCreateBitmapFromHICON Handle,img    End Select        ' Continue with resizing only if we have a valID image object    If img Then        InitDC hDC,Height        gdipResize img,RetainRatio        GdipdisposeImage img        GetBitmap hDC,hBitmap        Set Resize = CreatePicture(hBitmap)    End IfEnd Function' Fills in the wmfplacable headerPrivate Sub FillinWmfheader(Wmfheader As wmfplaceablefileheader,Height As Long)    Wmfheader.BoundingBox.Right = WIDth    Wmfheader.BoundingBox.Bottom = Height    Wmfheader.Inch = 1440    Wmfheader.Key = GDIP_WMF_PLACEABLEKEYEnd Sub

2. 调用Form1.frm

Private Declare Function GetSyscolor lib "user32" (ByVal nIndex As Long) As LongPrivate Sub Command1_Click() Dim Token As Long Dim C As Double  Dim i As Integer     C = Me.Backcolor If C < 0 Then C = GetSyscolor(C - &H80000000) Token = InitGDIPlus  Picture1(0).Picture = LoadPictureGDIPlus(App.Path & ".png",vbWhite) Picture1(1).Picture = LoadPictureGDIPlus(App.Path & ".png",vbCyan) Picture1(2).Picture = LoadPictureGDIPlus(App.Path & ".png",vbGreen) Picture1(3).Picture = LoadPictureGDIPlus(App.Path & ".png",C) FreeGDIPlus TokenEnd Sub

主要代码改动说明

1.Dim C As Long 修改为Dim C As Double (因Long类型数据范围不能满足存储color数据的需要,所以将变量C的数据类型改为Double,以便于存储color数据,如果不做修改,程序在调试时可正常运行,但在编译后运行会出现数据溢出的问题),long类型与double类型的数据范围可自行查找vb数据类型资料来进行相关比较。

2. Picture1(0).autoSize 属性设计时改为True,当然也可在运行时通过代码实现。(因LoadPictureGDIPlus函数根据png图片的大小来进行透明处理,如果png图片大小比Picture1控件小,那么png图片与Picture1控件之间的区域将不能被透明处理)。有兴趣的朋友可进行相关测试查看效果。


下面为效果图

总结

以上是内存溢出为你收集整理的关于VB6中代码显示PNG图片的问题全部内容,希望文章能够帮你解决关于VB6中代码显示PNG图片的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1276688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存