[使用][DirectDraw][显示]如何使用DirectDraw 显示图象序列

09月 17th, 2008 by admin
栏目类 VC/MFC |

我正做一个图象序列显示程序,图象序列是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    
 
哪位大哥能告诉我原因啊?谢谢了      

我的邮箱:jiaqicx@163.com

大家帮帮忙啊   谢谢了

自己顶

Tags: , , ,