DWORD DDColorMatch(IDirectDrawSurface* pdds, COLORREF rgb)
{
COLORREF rgbT;
HDC hdc;
DWORD dw = CLR_INVALID;
DDSURFACEDESC ddsd;
HRESULT hres;
//
// Use GDI SetPixel to color match for us
//
if(rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
{
rgbT = GetPixel(hdc, 0, 0); // Save current pixel value
SetPixel(hdc, 0, 0, rgb); // Set our value
pdds->ReleaseDC(hdc);
}
//
// Now lock the surface so we can read back the converted color
//
ddsd.dwSize = sizeof(ddsd);
while((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)
;
if (hres == DD_OK)
{
dw = *(DWORD *) ddsd.lpSurface; // Get DWORD
if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1; // Mask it to bpp
pdds->Unlock(NULL);
}
//
// Now put the color that was there back.
//
if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
{
SetPixel(hdc, 0, 0, rgbT);
pdds->ReleaseDC(hdc);
}
return dw;
}
HRESULT CCommon::DDSetColorKey(IDirectDrawSurface* pdds, COLORREF rgb)
{
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = DDColorMatch(pdds, rgb);
ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
return pdds->SetColorKey(DDCKEY_SRCBLT, &ddck);
}
主要因为wince6.0的DDraw不支持关键色,因此只能lock表面了,这段代码是M8SDN的老大示例里面的,使用时首先
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
ddsd.dwWidth = imageStart_Down.GetImageWidth();
ddsd.dwHeight = imageStart_Down.GetImageHeight();
hRet = theAPP.m_MainWnd.GetDDrawObject()->CreateSurface( &ddsd, &m_pDDSButtonDown, NULL );
CCommon::DDSetColorKey(m_pDDSButtonDown,SPRITE_COLOR_KEY);
然后在画的时候
m_pDDSBackground->Blt(rSrcBD, m_pDDSButtonDown, NULL, DDBLT_WAITNOTBUSY | DDBLT_KEYSRC, NULL);
加上粉色位置,这样就可以透明掉,网友说大约处理一次80MS,哎,很慢啊,没办法