如题,在程序中取得的屏幕宽是1024 高是768,像素位是16位,
可怎么程序显示的是单色啊?谁能给我看一下代码啊? 先谢谢了!MYQQ :21915345
代码全部写在了一个按钮消息中了,可以直接运行,哪位大虾给我看看啊?是哪不会啊void CDxDemoDlg::OnBtnDx() 
{
// TODO: Add your control notification handler code here // 1. Create a DirectDraw Object  
IDirectDraw7 * lpDD = NULL;
HRESULT hr = DirectDrawCreateEx(NULL, (void**)&lpDD, IID_IDirectDraw7, NULL);
if(hr != DD_OK)
{
TRACE("Failed to Create DirectDraw Object! \n");
return;
} // 2. Set cooperative level
// DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_NORMAL
// hr = lpDD->SetCooperativeLevel(this->GetSafeHwnd(), DDSCL_EXCLUSIVE |DDSCL_NORMAL| DDSCL_FULLSCREEN | DDSCL_MULTITHREADED);
hr = lpDD->SetCooperativeLevel(this->GetSafeHwnd(), DDSCL_NORMAL|DDSCL_MULTITHREADED); if(hr != DD_OK)
{
TRACE("Failed to set Cooperative Level! \n");
return;
} // Create the primary surface with one back buffer. 
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; IDirectDrawSurface7 * pDDSPrimary = NULL;
hr = lpDD->CreateSurface(&ddsd, &pDDSPrimary, NULL);
if (hr != DD_OK)

return;
}  // Get the RECT and Pixel Format of the primary surface.
memset( &ddsd, 0, sizeof( ddsd ));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_LINEARSIZE; hr = pDDSPrimary->GetSurfaceDesc(&ddsd);
if(FAILED(hr))
{
return;
} // 图像显示格式式信息
ULONG uPrimaryWidth = ddsd.dwWidth;
ULONG uPrimaryHeight = ddsd.dwHeight;
ULONG uPrimaryMemPitch = ddsd.dwLinearSize; DDPIXELFORMAT ddpixel;
memset(&ddpixel, 0, sizeof(DDPIXELFORMAT));
ddpixel.dwSize = sizeof(DDPIXELFORMAT); hr = pDDSPrimary->GetPixelFormat(&ddpixel);
if(FAILED(hr))
{
return;
} ULONG uRTBBitCount = ddpixel.dwRGBBitCount;
// 建立离屏表面
memset( &ddsd, 0, sizeof( ddsd ));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.dwWidth = uPrimaryWidth;
ddsd.dwHeight = uPrimaryHeight;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;

IDirectDrawSurface7 * pDDSBack = NULL;
hr = lpDD->CreateSurface(&ddsd, &pDDSBack, NULL);
if(hr == DDERR_OUTOFVIDEOMEMORY)
{
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
hr = lpDD->CreateSurface(&ddsd, &pDDSBack, NULL);
if(FAILED(hr))
{
return;
}
} // Get the RECT and Pixel Format of the primary surface.
memset( &ddsd, 0, sizeof( ddsd ));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_LINEARSIZE; hr = pDDSBack->GetSurfaceDesc(&ddsd);
if(FAILED(hr))
{
return;
} // 图像显示格式式信息
ULONG uBackWidth = ddsd.dwWidth;
ULONG uBackHeight = ddsd.dwHeight;
ULONG uBackMemPitch = ddsd.dwLinearSize; memset(&ddpixel, 0, sizeof(DDPIXELFORMAT));
ddpixel.dwSize = sizeof(DDPIXELFORMAT); hr = pDDSBack->GetPixelFormat(&ddpixel);
if(FAILED(hr))
{
return;
} ULONG uBackRTBBitCount = ddpixel.dwRGBBitCount; //建立窗口剪裁对象
LPDIRECTDRAWCLIPPER lpDDCliper;
hr = lpDD->CreateClipper( 0, &lpDDCliper, NULL);
if(FAILED(hr))
{
return;
}

hr = lpDDCliper->SetHWnd(0, this->GetSafeHwnd());
if(FAILED(hr))
{
return;
} pDDSPrimary->SetClipper(NULL);
pDDSPrimary->SetClipper(lpDDCliper); char * pBuff = new char[uPrimaryWidth*uPrimaryHeight*uRTBBitCount/8];
short * ptr = (short*)pBuff; for(LONG i=0;i<32;i++)
{
for(LONG j=0;j<24;j++)
{
LONG rv = j % 3;
LONG rh = i % 3;
rv += rh;
rv %= 3;
switch(rv)
{
case 0:
{
for(LONG l=0;l<32;l++)
for(LONG k=0;k<32;k++)
*(ptr+(i*32+l) + j*32+k) = 0x03E0;
break;
}
case 1:
{
for(LONG l=0;l<32;l++)
for(LONG k=0;k<32;k++)
*(ptr+(i*32+l) + j*32+k) = 0x001F;
break;
}
case 2:
{
for(LONG l=0;l<32;l++)
for(LONG k=0;k<32;k++)
*(ptr+(i*32+l) + j*32+k) = 0x7C00;
break;
}
}
}
} // 刷新离屏表面
memset( &ddsd, 0, sizeof( ddsd ));
ddsd.dwSize = sizeof( ddsd );
hr = pDDSBack->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
if(FAILED(hr))
{
return;
} PUCHAR pBackVBuffer = (PUCHAR)ddsd.lpSurface;
if(pBackVBuffer == NULL)
{
return;
} memcpy(pBackVBuffer, pBuff, uPrimaryWidth*uPrimaryHeight*uRTBBitCount/8); hr = pDDSBack->Unlock(NULL);
if(FAILED(hr))
{
return;
} CRect rcDestination, rcSource; rcSource.left = 0;
rcSource.top = 0;
rcSource.right = uPrimaryWidth - 1;
rcSource.bottom = uPrimaryHeight - 1; rcDestination.left = 0;
rcDestination.top = 0;
rcDestination.right = uPrimaryWidth - 1;
rcDestination.bottom = uPrimaryHeight - 1; if( SUCCEEDED(hr = pDDSPrimary->Blt(&rcDestination, pDDSBack,
  &rcSource, DDBLT_WAIT, NULL))) if( lpDDCliper != NULL )
{
lpDDCliper->Release();
lpDDCliper = NULL;
} if( pDDSBack != NULL )
{
pDDSBack->Release();
pDDSBack = NULL; } if( pDDSPrimary != NULL )
{
pDDSPrimary->Release();
pDDSPrimary = NULL;
} if( lpDD != NULL )
{
lpDD->Release();
lpDD = NULL;
}
}

解决方案 »

  1.   

    你的ptr赋值地址计算不对i,j控制的是32×24个块,每个块大小是32×32的
    k,l控制的是每个块内的位置从代码看i(32),k(32)是水平的, j(24),l(32)是垂直方向的因此,对于一组i,j,k,l来说,ptr偏移量应该是ptr +  (j*32 + k ) * lPitch    +  (i*32+l)
           第几行        每行宽度     第几列:行内偏移量lPitch是每行多少个short长度
      

  2.   

    lPitch = uBackMemPitch  / sizeof(short);uBackMemPitch单位是字节
    你是16位色深, 转换成ptr指针宽度就是 /2 才对
      

  3.   

    开始我也乘了个lPitch,可程序要出异常,没仔细想就去掉了,我再仔细看看,谢谢