经过如下代码后,或者显卡支持的pixelformat类型。
DDPIXELFORMAT       ddpf;
ddpf.dwSize = sizeof( ddpf );
if ( FAILED( lpDDSPrimary_CG_DaHeng->GetPixelFormat( &ddpf ) ) )
{
    return Fail( "Couldn't get pixel format.\n" );
}
获知: 
ddpf.flags == 0x00000040; //DDPF_RGB 也是0x00000040
ddpf.dwRGBBitCount == 32; 但是,在执行如下代码时,失败了,
    DDSURFACEDESC       ddsd;
    IDirectDrawSurface *pdds;
    //
    // create a DirectDrawSurface for this bitmap
    //
    ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize         = sizeof(ddsd);
    ddsd.dwFlags        = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
    ddsd.dwWidth        = wid;
    ddsd.dwHeight       = hei;    ddsd.ddpfPixelFormat.dwSize         = sizeof(DDPIXELFORMAT);
    ddsd.ddpfPixelFormat.dwFlags        = DDPF_RGB ;
    ddsd.ddpfPixelFormat.dwRGBBitCount  = 32;
    HRESULT hr = pdd->CreateSurface(&ddsd, &pdds, NULL);
    if ( hr != DD_OK)
    {
        const TCHAR *pSz = DXGetErrorDescription9(hr);        return NULL;
    }这是为啥, 求指点。

解决方案 »

  1.   


    DDSURFACEDESC       ddsd;
        IDirectDrawSurface *pdds;
        //
        // create a DirectDrawSurface for this bitmap
        //
        ZeroMemory(&ddsd, sizeof(ddsd));
        ddsd.dwSize         = sizeof(ddsd);
        ddsd.dwFlags        = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
        ddsd.dwWidth        = wid;
        ddsd.dwHeight       = hei;
     
        HRESULT hr = pdd->CreateSurface(&ddsd, &pdds, NULL);
        if ( hr != DD_OK)
        {
            const TCHAR *pSz = DXGetErrorDescription9(hr);
     
            return NULL;
        }
      

  2.   


    可是,我要显示RGB格式的图像,不指定这些的话, 彩色图显示的是黑白的,而且,lPitch的值是我像素宽度的4倍, 我是这么放到RAM中的
       WORD nStep = 3;//(nBits/8);
        DWORD dLen = ddsd.dwWidth* ddsd.dwHeight * nStep;
        BYTE* pDst = (BYTE*)ddsd.lpSurface;
        BYTE* pSrc = p_src/* + dLen*/;    for (int i = 0; i < ddsd.dwHeight; ++i){
            CopyMemory(pDst + i * ddsd.lPitch, pSrc +  i * ddsd.dwWidth * nStep, ddsd.dwWidth * nStep);
        }
      

  3.   

    你直接调用GetPixelFormat来填充下pixelformat,然后再改标志位看看能行不
      

  4.   


    按照你说的修改,没有问题。 如下是代码。
      DDSURFACEDESC       ddsd;
        IDirectDrawSurface *pdds;
       
        DDPIXELFORMAT       ddpf;
        ddpf.dwSize = sizeof( ddpf );
        if ( FAILED( lpDDSPrimary_CG_DaHeng->GetPixelFormat( &ddpf ) ) )
        {
            return NULL;
        }    ZeroMemory(&ddsd, sizeof(ddsd));
        ddsd.dwSize         = sizeof(ddsd);
        ddsd.dwFlags        = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
        ddsd.dwWidth        = wid;
        ddsd.dwHeight       = hei;    ddsd.ddpfPixelFormat = ddpf;    HRESULT hr = pdd->CreateSurface(&ddsd, &pdds, NULL);
        if ( hr != DD_OK)
        {
            const TCHAR *pSz = DXGetErrorDescription9(hr);        return NULL;
        }
        return pdds;
      

  5.   

    那就是2楼的复制图像的代码有问题了。帮看看吧。我直接将RGB复制到ddsd.lpSurface里面了。我图像时24位的RGB, 而DDSD中RGBBITCOUNT是32。难道是因为这个?
      

  6.   

    不应该直接复制,应该把bitmap bitblt到surface上,然后再 surface执行blt。