已知BITMAP句柄,如何用CPaintDC画出?
要做一个显示音乐专辑封面的工作。我用的是libZplay,它里面提供了读取专辑封面的函数,但是现在显示有点问题。就是把图片缩小显示的时候不太正常(颜色加深了,貌似是重叠?)
现在通过libZplay能从音乐文件里获取专辑封面图片(BITMAP)的句柄。我想通过CPaintDC把它画出来。前两天貌似看到一个这样写的工程:
CPaintDC dc(this);
dc.SetStretchBltMode(HALFTONE);
图片缩小以后显示正常,不会发生那种颜色加深的情况。
但是具体该怎么用我不是很清楚,试了好多次一直没成功。
具体代码 (MFC工程,基于对话框)
……
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include ".\include\libzplay.h"
#pragma comment(lib,"mingw.lib")
using namespace libZPlay;
……
void ClibZ_test_playDlg::OnBnClickedOk()
{
//打开一首音乐
CFileDialog LoadDlg(TRUE,_T("mp3"),NULL,0,NULL,this);
CString strFilePath;
if (IDOK == LoadDlg.DoModal())
{
strFilePath = LoadDlg.GetPathName();
}
ZPlay *player = CreateZPlay();
//把专辑封面读到 id3_info 里
TID3InfoExW id3_info;
player->LoadFileID3ExW(strFilePath, sfAutodetect, &id3_info, 1);
//从这里往下不好使,我不清楚CPaintDC的用法
CPaintDC pdc(this);
pdc.SetStretchBltMode(HALFTONE);
CDC * dc;
dc = GetDC();
//id3_info.Picture.hBitmap好像是BITMAP句柄
dc->SelectObject(id3_info.Picture.hBitmap);
//显示原图缩小以后的结果,长宽各除2
pdc.BitBlt( 0, 0, id3_info.Picture.Width /2, id3_info.Picture.Height /2,dc,0,0,SRCCOPY);
dc->DeleteDC();
}
下面是里面几个结构体的声明,在libzplay.h里
typedef struct {
……………………前面都是音乐的其它信息
TID3PictureW Picture;
char reserved[128];
} TID3InfoExW;
typedef struct {
unsigned int PicturePresent;
unsigned int CanDrawPicture;
wchar_t *MIMEType;
int PictureType;
wchar_t *Description;
void *PictureData;
unsigned int PictureDataSize;
void *hBitmap;
unsigned int Width;
unsigned int Height;
char reserved[128];
} TID3PictureW;
创建工程需要的几个个文件 及下载:
libZplay.h libZplay.dll mingw.lib
Ethereal Wind.mp3(测试用音乐)
下载
http://pan.baidu.com/share/link?shareid=2344775969&uk=1191974850
其它:
libZplay里提供了显示专辑封面的函数,是DrawBitmapToHDC和DrawBitmapToHWND,但是用这两个函数缩小显示之后会出现我最开始说的那种颜色加深的情况,所以想用CPaintDC解决一下