VB6使用GDI+显示缩略图关键疑难点,请教大侠。
使用VB6写了一个显示缩略图的模块文件,模块文件中声明了一下函数:
Private Declare Function GdiplusStartup Lib "gdiplus" (token As Long, inputbuf As GdiPlusStartupInput, Optional ByVal outputbuf As Long = 0) As GpStatus
Private Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As GpStatus
Private Declare Function GdipDrawImage Lib "gdiplus" (ByVal graphics As Long, ByVal Image As Long, ByVal X As Single, ByVal Y As Single) As GpStatus
Private Declare Function GdipDrawImageRect Lib "gdiplus" (ByVal graphics As Long, ByVal Image As Long, ByVal X As Single, ByVal Y As Single, ByVal Width As Single, ByVal Height As Single) As GpStatus
Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hDC As Long, graphics As Long) As GpStatus
Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As GpStatus
Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal filename As String, Image As Long) As GpStatus
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As GpStatus
Private Declare Function GdipGetImageWidth Lib "gdiplus" (ByVal Image As Long, Width As Long) As GpStatus
Private Declare Function GdipGetImageHeight Lib "gdiplus" (ByVal Image As Long, Height As Long) As GpStatus
Private Declare Function GdipDrawImageRectI Lib "gdiplus" (ByVal graphics As Long, ByVal Image As Long, ByVal X As Long, ByVal Y As Long, ByVal Width As Long, ByVal Height As Long) As GpStatus
程序中需要调用一个函数,把原图片加载到内存。
这个函数:GdipLoadImageFromFile StrConv(ImagePath, vbUnicode), gdip_Image
就是上面这个函数,有时候可以成功调用,有时候却不可以。后来自己仔细查了一下资料,说是跟调用StrConv()函数返回的字符串有关,还有一个类似StrConv()的函数是StrPrt(),用了以后跟使用StrConv()出现的情况一样,甚至我直接在GdipLoadImageFromFile 中使用图片文件路径作为第一个参数也不行,总之,GdipLoadImageFromFile 这个函数有时候返回成功可以显示缩略图,有时却调用失败。关键是StrConv函数的返回值跟GdipLoadImageFromFile 的调用成功与否关系始终没搞清楚。
希望有过类似经历并且已经解决问题的大侠给以指点,谢谢。
[解决办法]
是不是该用:
StrConv(ImagePath, vbFromUnicode)
[解决办法]
有日文、韩文这类东西?
[解决办法]
StrConv 加上 $
分别试一下:
StrConv$(ImagePath, vbFromUnicode)
StrConv$(ImagePath, vbnicode)
[解决办法]
StrConv 加上 $
分别试一下:
StrConv$(ImagePath, vbFromUnicode)
StrConv$(ImagePath, vbUnicode)
[解决办法]
以下代码没发现问题
Option ExplicitPrivate Type GdiplusStartupInput GdiplusVersion As Long DebugEventCallback As Long SuppressBackgroundThread As Long SuppressExternalCodecs As LongEnd TypePrivate Enum GpStatus 'Status Ok = 0 GenericError = 1 InvalidParameter = 2 OutOfMemory = 3 ObjectBusy = 4 InsufficientBuffer = 5 NotImplemented = 6 Win32Error = 7 WrongState = 8 Aborted = 9 FileNotFound = 10 ValueOverflow = 11 AccessDenied = 12 UnknownImageFormat = 13 FontFamilyNotFound = 14 FontStyleNotFound = 15 NotTrueTypeFont = 16 UnsupportedGdiplusVersion = 17 GdiplusNotInitialized = 18 PropertyNotFound = 19 PropertyNotSupported = 20End EnumPrivate Declare Function GdiplusStartup Lib "gdiplus" (token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As GpStatusPrivate Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As GpStatusPrivate Declare Function GdipDrawImageRect Lib "gdiplus" (ByVal graphics As Long, ByVal Image As Long, ByVal X As Single, ByVal Y As Single, ByVal Width As Single, ByVal Height As Single) As GpStatusPrivate Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hDC As Long, graphics As Long) As GpStatusPrivate Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As GpStatusPrivate Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal filename As String, Image As Long) As GpStatusPrivate Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As GpStatusDim gdip_Token As LongDim gdip_Image As LongDim gdip_Graphics As Long'-------------缩略图函数-----------Public Sub ShowTNImg(PBox As Object, ImagePath As String, WidthMax As Long, HeightMax As Long) LoadGDIP If GdipCreateFromHDC(PBox.hDC, gdip_Graphics) <> 0 Then MsgBox "出现错误!", vbCritical, "错误" GdiplusShutdown gdip_Token End End If '载入图片到内存中 GdipLoadImageFromFile StrConv(ImagePath, vbUnicode), gdip_Image '使用GDI+直接从内存中缩略并绘图,GDI+有很好的反锯齿能力 If GdipDrawImageRect(gdip_Graphics, gdip_Image, 0, 0, WidthMax, HeightMax) <> Ok Then Debug.Print "显示失败。。。" DisposeGDIPEnd SubPublic Sub LoadGDIP() Dim GpInput As GdiplusStartupInput GpInput.GdiplusVersion = 1 If GdiplusStartup(gdip_Token, GpInput) <> 0 Then MsgBox "加载GDI+失败!", vbCritical, "加载错误" End End IfEnd SubPublic Sub DisposeGDIP() GdipDisposeImage gdip_Image GdipDeleteGraphics gdip_Graphics GdiplusShutdown gdip_TokenEnd Sub
[解决办法]
参考
向大家求助一个GDI绘文字中文乱码问题
[解决办法]
顶