DDCOLORKEY colorkey;

//设置色彩键码
colorkey.dwColorSpaceLowValue=0;
colorkey.dwColorSpaceHighValue=100;
if(FAILED(lpDDopl->SetColorKey(DDCKEY_COLORSPACE,&colorkey)))
{
MessageBox(windHwnd,"设置色彩键失败!","警告",MB_OK);
return false;
}
         其中:lpDDopl为一个指向后备区的指针(已经成功创建)
         为什么运行后总是设置失败??????
          如把colorkey的两个属性都设为黑色或白色,DDCKEY_COLORSPACE改为DDCKEY_SRCBLT则设置成功,但如不设为非黑白色则都会失败
         请指教

解决方案 »

  1.   

    具体什么错误?DXGetErrorString9/DXGetErrorDescription9
      

  2.   

    BOOL CDispOverlay::SetKeyColor(COLORREF keycolor)
    {
    CTRY;
    m_colorKey = keycolor; CHECK_BOOL(m_pPrimary); DDPIXELFORMAT ddpf;
    ZeroMemory(&ddpf, sizeof ddpf);
    ddpf.dwSize = sizeof ddpf;
    CHECK_DDERR(m_pPrimary->GetPixelFormat(&ddpf));
    HDC hdc;
    CHECK_DDERR(m_pPrimary->GetDC(&hdc));
    COLORREF colorSave = ::GetPixel(hdc, 0, 0);
    ::SetPixel(hdc, 0, 0, m_colorKey);
    m_pPrimary->ReleaseDC(hdc); DDSURFACEDESC ddsd;
    ZeroMemory(&ddsd, sizeof ddsd);
    ddsd.dwSize = sizeof ddsd;
    DDCOLORKEY ddck;
    CHECK_DDERR(m_pPrimary->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_READONLY | DDLOCK_SURFACEMEMORYPTR, 0));
    DWORD dwMask = (ddpf.dwRGBBitCount == 16) ? 0x0000ffff : 
    ((ddpf.dwRGBBitCount == 24) ? 0x00ffffff : 0xffffffff);
    m_dwKeyColor = dwMask & *((DWORD*) ddsd.lpSurface);
    ddck.dwColorSpaceLowValue = ddck.dwColorSpaceHighValue = m_dwKeyColor;
    m_pPrimary->Unlock(NULL); m_pPrimary->GetDC(&hdc);
    ::SetPixel(hdc, 0, 0, colorSave);
    m_pPrimary->ReleaseDC(hdc);
    CHECK_DDERR(m_pPrimary->SetColorKey(DDCKEY_DESTOVERLAY, &ddck)); if (IsWindow(m_hWnd))
    Invalidate();
    CCATCH;
    return TRUE;
    }
      

  3.   

    就是弹出设置失败的对话框。
    第二种情况下,不设区间,只设一个值(非黑白色,黑白色可以),不会报错,但后面用BltFast复制后,整个图、像都复制过去了,没变一点。
    上面的代码没看懂,m_dwKeyColor = dwMask & *((DWORD*) ddsd.lpSurface);作用是什么
      

  4.   

    DXGetErrorString9/DXGetErrorDescription9看看具体的错误信息。
    HRESULT hr= lpDDopl->SetColorKey(DDCKEY_COLORSPACE,&colorkey);
    if(FAILED(hr))
    {
    const TCHAR* strHRESULT=DXGetErrorString9(x);
    const TCHAR* strDescription= DXGetErrorDescription9( x );
    }
      

  5.   

    const TCHAR* strHRESULT=DXGetErrorString9(x);
    const TCHAR* strDescription= DXGetErrorDescription9( x );
    ==>
    const TCHAR* strHRESULT=DXGetErrorString9(hr);
    const TCHAR* strDescription= DXGetErrorDescription9( hr );
      

  6.   


    再请问你一下:*((DWORD*) ddsd.lpSurface取出的是什么?我的理解是取出了第一点的色彩.但如是这样的话那跟COLORREF colorSave = ::GetPixel(hdc, 0, 0);取出的有什么不同???
         谢谢啦