使用GDI+显示PNG图象,以及显示PNG图象时大小不正常的解决方案(VB6.0代码)

正在赶代码中.

其中一段界面效果里需要显示一个半透明的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


就这几句,问题是,图象死活要大,非常非常之不解......

使用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


这下总算正常了,感谢一下作者rewarddiy:)

继续折腾代码去,哎~~~~~~~~~

模块与示例工程在此下载:

下载文件 点击下载此文件(RAR,240K)

评论: 2 | 引用: 0 | 查看次数: 2432
admin
admin[2010-01-18 01:13 AM | ]
幸会幸会!!
rewarddiy
rewarddiy[2010-01-16 10:59 PM | ]
谢谢...拿去用了...这么巧,我又搜到你这里来了。很以前在百度VB吧发代码,很高兴能帮上忙呢...