我正做一个图象序列显示程序,图象序列是352*288分辨率的,是用directshow捕获的,用StretchDIBits 定时显示图象序列,但是如果要在上面添加文字什么的,闪烁感比较强,所以想采用DirectDraw来实现,我看了CSDN上老的帖子,http://topic.csdn.net/t/20020522/17/744153.html 上面xzhangjie(飞天狐狸)发了一个类
#include "DDraw.h"
class CDDraw
{
public:
void CleanUp();
void DrawDIB(BITMAPINFOHEADER* pBI,char* pData,RECT*rt);
BOOL Init(HWND hWnd,int nWidth,int nHeight);
CDDraw();
virtual ~CDDraw();
private:
HWND m_hDrawWnd;
LPDIRECTDRAW lpDD; // DirectDraw 对象
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw 主页面
LPDIRECTDRAWSURFACE lpBackdds;
LPDIRECTDRAWCLIPPER lpClipperBack;
};
CDDraw::CDDraw()
{
lpDD=NULL;
lpDDSPrimary=NULL;
lpBackdds=NULL;
lpClipperBack=NULL;
}
CDDraw::~CDDraw()
{
if(lpDD!=NULL)CleanUp();
}
BOOL CDDraw::Init(HWND hWnd,int nWidth,int nHeight)
{
if(hWnd==NULL) return FALSE;
m_hDrawWnd=hWnd;
if(DirectDrawCreate(NULL,&lpDD,NULL)!=DD_OK)return FALSE;
lpDD->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
DDSURFACEDESC ddsd;
ddsd.dwSize = sizeof( ddsd ); //结构的大小
ddsd.dwFlags = DDSD_CAPS; //指定DDSURFACEDESC结构的ddsCaps成员为可用
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; //指定要创建的是主页面
//创建主页面对象
if ( lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK) return FALSE;
if(lpDD->CreateClipper(NULL,&lpClipperBack,NULL)!=DD_OK) return FALSE;
lpClipperBack->SetHWnd(0,hWnd);
lpDDSPrimary->SetClipper(lpClipperBack);
lpClipperBack->Release();
lpClipperBack=NULL;
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = nHeight;
ddsd.dwWidth = nWidth;
if(lpDD->CreateSurface(&ddsd, &lpBackdds, NULL)!=DD_OK) return FALSE;
return TRUE;
}
void CDDraw::DrawDIB(BITMAPINFOHEADER *pBI, char *pData, RECT *rt)
{
RECT srt;
srt.left=0;
srt.top=0;
srt.right=pBI->biWidth;
srt.bottom=pBI->biHeight;
HDC hDC;
lpBackdds->GetDC(&hDC);
SetDIBitsToDevice(
hDC,
0,
0,
pBI->biWidth, // source rectangle width
pBI->biHeight, // source rectangle height
0, // x-coord of source lower-left corner
0, // y-coord of source lower-left corner
0, // first scan line in array
pBI->biHeight, // number of scan lines
pData, // array of DIB bits
(const struct tagBITMAPINFO*)pBI, // bitmap information
DIB_RGB_COLORS // RGB or palette indexes
);
lpBackdds->ReleaseDC(hDC);
lpDDSPrimary->Blt(rt,lpBackdds,&srt,0,NULL);
}
void CDDraw::CleanUp()
{
if(lpDD!=NULL)
{
if(lpClipperBack!=NULL)
{
lpClipperBack->Release();
lpClipperBack=NULL;
}
if(lpDDSPrimary!=NULL)
{
lpDDSPrimary->Release();
lpDDSPrimary=NULL;
}
if(lpBackdds!=NULL)
{
lpBackdds->Release();
lpBackdds=NULL;
}
lpDD->Release();
lpDD=NULL;
}
}
但是无法显示图象序列,序列已从32位转成24位RGB
哪位大哥能告诉我原因啊?谢谢了
#include "DDraw.h"
class CDDraw
{
public:
void CleanUp();
void DrawDIB(BITMAPINFOHEADER* pBI,char* pData,RECT*rt);
BOOL Init(HWND hWnd,int nWidth,int nHeight);
CDDraw();
virtual ~CDDraw();
private:
HWND m_hDrawWnd;
LPDIRECTDRAW lpDD; // DirectDraw 对象
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw 主页面
LPDIRECTDRAWSURFACE lpBackdds;
LPDIRECTDRAWCLIPPER lpClipperBack;
};
CDDraw::CDDraw()
{
lpDD=NULL;
lpDDSPrimary=NULL;
lpBackdds=NULL;
lpClipperBack=NULL;
}
CDDraw::~CDDraw()
{
if(lpDD!=NULL)CleanUp();
}
BOOL CDDraw::Init(HWND hWnd,int nWidth,int nHeight)
{
if(hWnd==NULL) return FALSE;
m_hDrawWnd=hWnd;
if(DirectDrawCreate(NULL,&lpDD,NULL)!=DD_OK)return FALSE;
lpDD->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
DDSURFACEDESC ddsd;
ddsd.dwSize = sizeof( ddsd ); //结构的大小
ddsd.dwFlags = DDSD_CAPS; //指定DDSURFACEDESC结构的ddsCaps成员为可用
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; //指定要创建的是主页面
//创建主页面对象
if ( lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK) return FALSE;
if(lpDD->CreateClipper(NULL,&lpClipperBack,NULL)!=DD_OK) return FALSE;
lpClipperBack->SetHWnd(0,hWnd);
lpDDSPrimary->SetClipper(lpClipperBack);
lpClipperBack->Release();
lpClipperBack=NULL;
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = nHeight;
ddsd.dwWidth = nWidth;
if(lpDD->CreateSurface(&ddsd, &lpBackdds, NULL)!=DD_OK) return FALSE;
return TRUE;
}
void CDDraw::DrawDIB(BITMAPINFOHEADER *pBI, char *pData, RECT *rt)
{
RECT srt;
srt.left=0;
srt.top=0;
srt.right=pBI->biWidth;
srt.bottom=pBI->biHeight;
HDC hDC;
lpBackdds->GetDC(&hDC);
SetDIBitsToDevice(
hDC,
0,
0,
pBI->biWidth, // source rectangle width
pBI->biHeight, // source rectangle height
0, // x-coord of source lower-left corner
0, // y-coord of source lower-left corner
0, // first scan line in array
pBI->biHeight, // number of scan lines
pData, // array of DIB bits
(const struct tagBITMAPINFO*)pBI, // bitmap information
DIB_RGB_COLORS // RGB or palette indexes
);
lpBackdds->ReleaseDC(hDC);
lpDDSPrimary->Blt(rt,lpBackdds,&srt,0,NULL);
}
void CDDraw::CleanUp()
{
if(lpDD!=NULL)
{
if(lpClipperBack!=NULL)
{
lpClipperBack->Release();
lpClipperBack=NULL;
}
if(lpDDSPrimary!=NULL)
{
lpDDSPrimary->Release();
lpDDSPrimary=NULL;
}
if(lpBackdds!=NULL)
{
lpBackdds->Release();
lpBackdds=NULL;
}
lpDD->Release();
lpDD=NULL;
}
}
但是无法显示图象序列,序列已从32位转成24位RGB
哪位大哥能告诉我原因啊?谢谢了
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货