M8中DDraw关键色的处理方法

 
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,哎,很慢啊,没办法

你可能感兴趣的:(null,WinCE)