已知BITMAP句柄,如何用CPaintDC画出?

littlealone100 2013-09-14 02:25:30
要做一个显示音乐专辑封面的工作。我用的是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解决一下
...全文
238 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlealone100 2013-09-14
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
BitBlt 改为 StretchBlt
问题解决了。非常感谢你。
schlafenhamster 2013-09-14
  • 打赏
  • 举报
回复
BitBlt 改为 StretchBlt
littlealone100 2013-09-14
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
除了OnPaint 中 使用 CPaintDC dc(this); 其他地方 只能 用: CClientDC dc(this);
原来是这样。一开始的时候我用过 CClientDC ,但是有个问题,我不知道怎么用 CClientDC让图片缩小显示。 比如在onButtonClick 里这样写 CClientDC dc(this); dc.SetStretchBltMode(HALFTONE); CDC memdc; memdc.CreateCompatibleDC( &dc ); memdc.SelectObject(id3_info.Picture.hBitmap); dc.BitBlt( 0, 0, id3_info.Picture.Width /2, id3_info.Picture.Height /2, &memdc, 0, 0, SRCCOPY); //长和宽各除2 这样显示出来的只有图片的1/4,也就是左上部分,并没有缩小。 但是如果用CPaintDC的,到了BitBlt那步把长和宽各除2,就会变成把图片缩小显示,显示的仍然是整图。 CClientDC有办法那样缩小显示图片吗?
schlafenhamster 2013-09-14
  • 打赏
  • 举报
回复
除了OnPaint 中 使用 CPaintDC dc(this); 其他地方 只能 用: CClientDC dc(this);
littlealone100 2013-09-14
  • 打赏
  • 举报
回复
引用 3 楼 wshcdr 的回复:
SetBitmap((HGDIOBJ)XXX ) 强制转换一下
一方面你好像理解错我的意思了,这是函数原型。 SetBimap(HBITMAP hbitmap) SelectObject(HDC hdc,HGDIOBJ h) SetBimap 需要的是HBITMAP类型。 另一方面这样强制转换显示不了 m_static.SetBitmap((HBITMAP)(id3_info.Picture.hBitmap)); 还有就是,我现在遇到 的最关键的问题并不是显示出来图片,而是缩小显示之后的问题,所以才想要用CPaintDC。直接显示的,我用别的办法也能显示出来。
wshcdr 2013-09-14
  • 打赏
  • 举报
回复
SetBitmap((HGDIOBJ)XXX ) 强制转换一下
littlealone100 2013-09-14
  • 打赏
  • 举报
回复
引用 1 楼 Kaile 的回复:
用一个图片控件, m_static.SetBitmap(hbmp);
不行的 ,我那个得到的是void *型的句柄,只有使用 HGDIOBJ 为参数的函数(比如SelectObject)才能传进去。SetBitmap好像用不了。
Kaile 2013-09-14
  • 打赏
  • 举报
回复
用一个图片控件, m_static.SetBitmap(hbmp);

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧