Step 1: Creating the Off-Screen Surfaces

The following code is added to the doInit sample function in DDEX3 to create the two off-screen buffers:

// Create an offscreen bitmap. 
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 
ddsd.dwHeight = 480; 
ddsd.dwWidth = 640; 
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSOne, NULL); 
if(ddrval != DD_OK) 
{ 
    return initFail(hwnd); 
} 
 
// Create another offscreen bitmap. 
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSTwo, NULL); 
if(ddrval != DD_OK) 
{ 
    return initFail(hwnd); 
} 
 

The dwFlags member specifies that the application will use the DDSCAPS structure, and it will set the height and width of the buffer. The surface will be an off-screen plain buffer, as indicated by the DDSCAPS_OFFSCREEN flag set in the DDSCAPS structure. The height and the width are set as 480 and 640, respectively, in the DDSURFACEDESC structure. The surface is then created by using the IDirectDraw2::CreateSurface method.

Because both of the off-screen plain buffers are the same size, the only requirement for creating the second buffer is to call IDirectDraw2::CreateSurface again with a different pointer name.

You can also specifically request that the off-screen buffer be placed in system memory or display memory by setting either the DDSCAPS_SYSTEMMEMORY or DDSCAPS_VIDEOMEMORY capability in the DDSCAPS structure. By saving the bitmaps in display memory, you can increase the speed of the transfers between the off-screen surfaces and the back buffer. This will become more important when using bitmap animation. However, if you specify DDSCAPS_VIDEOMEMORY for the off-screen buffer and not enough display memory is available to hold the entire bitmap, a DDERR_OUTOFVIDEOMEMORY error value will be returned when you attempt to create the surface.