使用GDI+显示PNG图象,以及显示PNG图象时大小不正常的解决方案(VB6.0代码)
作者:admin 日期:2010-01-06
正在赶代码中.
其中一段界面效果里需要显示一个半透明的PNG图象,于是使用之前在网上搜索的一段代码,是封装为一个模块的.
结果发现一个怪异的事情,就是显示出来的PNG图象始终比它属性里的大小要大一定比例,约1.5倍左右...
真是怪哉.....
其显示部分的代码片段:
就这几句,问题是,图象死活要大,非常非常之不解......
使用PS做了N个新的PNG图象,结果一样,不得不怀疑代码了.
然后又下载了另几个版本的代码,发现有一个代码可以正常显示同一PNG图象(下载地址: http://tieba.baidu.com/f?kz=669546344)
一分析,发现显示所用的API不是GdipDrawImage,而是GdipDrawImageRect,后者除了指定了一个左上角坐标外,还有两个参数是指定宽与高的.
当下就改了一下封装,测试通过,PNG图象以其原大小显示出来了,代码如下:
这下总算正常了,感谢一下作者rewarddiy:)
继续折腾代码去,哎~~~~~~~~~
模块与示例工程在此下载:
点击下载此文件(RAR,240K)
其中一段界面效果里需要显示一个半透明的PNG图象,于是使用之前在网上搜索的一段代码,是封装为一个模块的.
结果发现一个怪异的事情,就是显示出来的PNG图象始终比它属性里的大小要大一定比例,约1.5倍左右...
真是怪哉.....
其显示部分的代码片段:
复制内容到剪贴板
程序代码

Public Sub PaintPng(ByVal sFileName As String, ByVal hdc As Long, ByVal mX As Long, ByVal mY As Long)
Call GDI_Initialize
If GdipCreateFromHDC(hdc, gdip_Graphics) <> Ok Then
GdiplusShutdown gdip_Token
Else
Call GdipLoadImageFromFile(StrConv(GetShortName(sFileName), vbUnicode), gdip_pngImage)
Call GdipDrawImage(gdip_Graphics, gdip_pngImage, mX, mY)
End If
Call GDI_Terminate
End Sub
Call GDI_Initialize
If GdipCreateFromHDC(hdc, gdip_Graphics) <> Ok Then
GdiplusShutdown gdip_Token
Else
Call GdipLoadImageFromFile(StrConv(GetShortName(sFileName), vbUnicode), gdip_pngImage)
Call GdipDrawImage(gdip_Graphics, gdip_pngImage, mX, mY)
End If
Call GDI_Terminate
End Sub
就这几句,问题是,图象死活要大,非常非常之不解......
使用PS做了N个新的PNG图象,结果一样,不得不怀疑代码了.
然后又下载了另几个版本的代码,发现有一个代码可以正常显示同一PNG图象(下载地址: http://tieba.baidu.com/f?kz=669546344)
一分析,发现显示所用的API不是GdipDrawImage,而是GdipDrawImageRect,后者除了指定了一个左上角坐标外,还有两个参数是指定宽与高的.
当下就改了一下封装,测试通过,PNG图象以其原大小显示出来了,代码如下:
复制内容到剪贴板
程序代码

Public Sub PaintPng(ByVal sFileName As String, ByVal hdc As Long, ByVal mX As Long, ByVal mY As Long)
Dim lngHeight As Long, lngWidth As Long
Call GDI_Initialize
If GdipCreateFromHDC(hdc, gdip_Graphics) <> Ok Then
GdiplusShutdown gdip_Token
Else
Call GdipLoadImageFromFile(StrConv(GetShortName(sFileName), vbUnicode), gdip_pngImage)
Call GdipGetImageHeight(gdip_pngImage, lngHeight) '
Call GdipGetImageWidth(gdip_pngImage, lngWidth)
Call GdipDrawImageRect(gdip_Graphics, gdip_pngImage, mX, mY, lngWidth, lngHeight)
End If
Call GDI_Terminate
End Sub
Dim lngHeight As Long, lngWidth As Long
Call GDI_Initialize
If GdipCreateFromHDC(hdc, gdip_Graphics) <> Ok Then
GdiplusShutdown gdip_Token
Else
Call GdipLoadImageFromFile(StrConv(GetShortName(sFileName), vbUnicode), gdip_pngImage)
Call GdipGetImageHeight(gdip_pngImage, lngHeight) '
Call GdipGetImageWidth(gdip_pngImage, lngWidth)
Call GdipDrawImageRect(gdip_Graphics, gdip_pngImage, mX, mY, lngWidth, lngHeight)
End If
Call GDI_Terminate
End Sub
这下总算正常了,感谢一下作者rewarddiy:)
继续折腾代码去,哎~~~~~~~~~
模块与示例工程在此下载:

评论: 2 | 引用: 0 | 查看次数: 2432





谢谢...拿去用了...这么巧,我又搜到你这里来了。很以前在百度VB吧发代码,很高兴能帮上忙呢...