Redrawing on Window Resizing

static LRESULT

OnSize(HWND hwnd, int w, int h)

{

HRESULT hRes;

DDSURFACEDESC ddsd;

// Nothing to do if we are suspended.

if (!fSuspended)

{

// Update the source and destination rectangles (used by the

// blit that shows the rendering in the client area).

rDstRect.right = rDstRect.left + w;

rDstRect.bottom = rDstRect.top + h;

rSrcRect.right = w;

rSrcRect.bottom = h;

if (NULL != lpd3dDevice)

{

// Although we already have a device, we need to be sure it

// is big enough for the new window client size.

// Because the window in this sample has a fixed size, it

// should never be necessary to handle this case. This code

// will be useful when we make the application resizable.

ZeroMemory(&ddsd, sizeof(ddsd));

ddsd.dwSize = sizeof(ddsd);

hRes = lpddDevice->lpVtbl->GetSurfaceDesc(lpddDevice,

&ddsd);

if (FAILED(hRes))

{

FatalError(hwnd, IDS_ERRMSG_DEVICESIZE, hRes);

return 0L;

}

if ((w > (int)ddsd.dwWidth) || (h > (int)ddsd.dwHeight))

{

// The device is too small. We need to shut it down

// and rebuild it.

// Execute buffers are bound to devices, so when

// we release the device we must release the execute

// buffer.

ReleaseScene();

ReleaseDevice();

}

}

if (NULL == lpd3dDevice)

{

// No Direct3D device yet. This is either because this is

// the first time through the loop or because we discarded

// the existing device because it was not big enough for the

// new window client size.

hRes = CreateDevice((DWORD)w, (DWORD)h);

if (FAILED(hRes))

{

FatalError(hwnd, IDS_ERRMSG_CREATEDEVICE, hRes);

return 0L;

}

hRes = CreateScene();

if (FAILED(hRes))

{

FatalError(hwnd, IDS_ERRMSG_BUILDSCENE, hRes);

return 0L;

}

}

hRes = UpdateViewport();

if (FAILED(hRes))

{

FatalError(hwnd, IDS_ERRMSG_UPDATEVIEWPORT, hRes);

return 0L;

}

// Render at the new size and show the results in the window's

// client area.

hRes = DoFrame();

if (FAILED(hRes))

{

FatalError(hwnd, IDS_ERRMSG_RENDERSCENE, hRes);

return 0L;

}

}

return 0L;

}