Finding a Surface with a Device Context

You can retrieve a pointer to a surface's IDirectDrawSurface4 interface from the device context for the surface by calling the IDirectDraw4::GetSurfaceFromDC method. This feature might be very useful for component applications or ActiveX® controls, that are commonly given a device context to draw into at run-time, but could benefit by exploiting the features exposed by the IDirectDrawSurface4 interface.

A device context might identify memory that isn't associated with a DirectDraw object, or the device context might identify a surface for another DirectDraw object entirely. The latter case is most likely to occur on a system with multiple monitors. If the device context doesn't identify a surface that wasn't created by that DirectDraw object, the method fails, returning DDERR_NOTFOUND.

The following sample code shows what a very simple scenario might look like:

    // For this example, the hdc variable is a valid 
    // handle to a video memory device context, and the 
    // lpDD4 variable is a valid IDirectDraw4 interface pointer.
 
    LPDIRECTDRAWSURFACE4 lpDDS4;
    HRESULT hr;
 
    hr = lpDD4->GetSurfaceFromDC(hdc, &lpDDS4);
    if(SUCCEEDED(hr)) {
        // Use the surface interface.
    }
    else if(DDERR_NOTFOUND == hr) {
        OutputDebugString("HDC not from this DirectDraw surface\n");
    }