因为美工做出来的图是PNG24,带alpha通道透明的图片,用传统的BITBLT方法没有办法显示(可能是本人比较笨啦,哈哈),所以采用了IIMAGE的方法来进行画图。
使用IIMAGE的DRAW的方法时,要画局部图片是发现总是不对,查了一下MSDN,发现是如下的问题。
OPTIONAL const RECT* srcRect:[in] An optional pointer to a RECT that specifies, in 0.01mm units, the portion of the image to be drawn in dstRect. To display the entire image, set this value to NULL.
它是采用0.01mm的单位来画的,所以要进行转换。
// 得到图片信息
ImageInfo imageInfo;
pImage->GetImageInfo( &imageInfo );
double dDotPermmX = imageInfo.Xdpi / 25.4;
double dDotPermmY = imageInfo.Ydpi / 25.4;
RECT rcSrc = { ( LONG )( rectSrc->left/dDotPermmX/0.01 ),
( LONG )( rectSrc->top/dDotPermmY/0.01 ),
( LONG )( rectSrc->right/dDotPermmX/0.01 ),
( LONG )( rectSrc->bottom/dDotPermmY/0.01 ) };
// rcSrc in 0.01mm units
pImage->Draw( hdc, &rectDstTemp, &rcSrc );//HDC hdc为绘制目标句柄
对于大图片,使用SHLOADIMAGEFILE是无法得到HBITMAP的,但是用DRAW经常刷屏又会比较慢,此时可以采用一下两种方法:
1.得到缩略图IImage->GetThumbnail
2.在初始化的时候把IImage贴在一块内存HDC上,在wm_paint的时候直接把这块HDC往屏幕HDC贴就可以了