|
|
发表于 2007-3-5 18:29:00
|
显示全部楼层
Re:关于透明色问题
dx中的色彩和gdi不同
先贴个VB的:
Private Declare Function SetPixel Lib "GDI32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal val As Long) As Long
Public Function ConvertColor(GDIColor As Long) As Long
Dim pdds As DirectDrawSurface7
Dim ddsd As DDSURFACEDESC2
Dim hdc&
ddsd.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
ddsd.ddsCaps.lCaps = DDSCAPS_VIDEOMEMORY Or DDSCAPS_OFFSCREENPLAIN
ddsd.lWidth = 10
ddsd.lHeight = 10
Set pdds = dd.CreateSurface(ddsd) '//dd是direct draw
hdc = pdds.GetDC
SetPixel hdc, 0, 0, GDIColor
pdds.ReleaseDC hdc
pdds.GetSurfaceDesc ddsd
pdds.Lock vbRectEx(0, 0, 10, 10), ddsd, DDLOCK_WAIT, 0
ConvertColor = pdds.GetLockedPixel(0, 0)
pdds.Unlock vbRectEx(0, 0, 10, 10)
End Function
一般来说,同一显示模式下,各种surface的color格式是一样的(试验过N次不同的caps~~)。
但是,有关资料表明,我们不能这么肯定。(就是说两个不同surface上的color格式可能不同!)
那么,保险一点,你需要再为ConvertColor传入一个surface。555~
//C++的:
DWORD ConvertColorEx(LPDIRECTDRAWSURFACE7 pdds,DWORD GDIColor)
{
DDSURFACEDESC2 ddsd;
DWORD oldColor;
HDC hdc;
DWORD ret;
pdds->GetDC(&hdc);
oldColor=GetPixel(hdc,0,0);
SetPixel(hdc,0,0,GDIColor);
pdds->ReleaseDC(hdc);
ddsd.dwSize=sizeof(ddsd);
pdds->Lock(0,&ddsd,DDLOCK_WAIT,0);
ret=(DWORD*)ddsd.lpSurface[0];
if(ddsd.ddpfPixelFormat.dwRGBBitCount<32)
ret&=(1<<ddsd.ddpfPixelFormat.dwRGBBitCount)-1;
pdds->Unlock(0);
pdds->GetDC(&hdc);
SetPixel(hdc,0,0,oldColor);
pdds->ReleaseDC(hdc);
return ret;
}
'//VB的:
Public Function ConvertColorEx(pdds As DirectDrawSurface7, GDIColor As Long) As Long
Dim ddsd As DDSURFACEDESC2
Dim hdc As Long
Dim oldColor As Long
Dim rc As RECT
hdc = pdds.GetDC
oldColor = GetPixel(hdc, 0, 0)
SetPixel hdc, 0, 0, GDIColor
pdds.ReleaseDC hdc
pdds.Lock rc, ddsd, DDLOCK_WAIT, 0
ConvertColorEx = pdds.GetLockedPixel(0, 0)
pdds.Unlock rc
hdc = pdds.GetDC
SetPixel hdc, 0, 0, oldColor
pdds.ReleaseDC hdc
End Function
以上代码调试通过.
|
|