IOleInPlaceSiteWindowless::GetDC
Provides an
object with a handle to a device context for a screen or compatible device from
its container.
HRESULT GetDC(
LPCRECT pRect, |
//Pointer to
rectangle |
DWORD grfFlags, |
//OLEDCFLAGS
value |
HDC* phDC |
//Pointer to
device context |
); |
|
Parameters
pRect
[in] Pointer
to the rectangle that the object wants to redraw, in client coordinates of the
containing window. If this parameter is NULL, the object s full extent is
redrawn.
grfFlags
[in] A
combination of values from the OLEDCFLAGS
phDC
[out] Pointer
to a returned device context.
Return Values
S_OK
A device
context was successfully returned.
OLE_E_NESTEDPAINT
The container
is already in the middle of a paint session. That is, this method has already
been called, and the ReleaseDC method has not yet been called.
Remarks
A device
context obtained by this method should be released by calling IOleInPlaceSiteWindowless::ReleaseDC.
Like other
methods in this interface, rectangles are specified in client coordinates of
the containing window. The container is expected to intersect this rectangle
with the object s site rectangle and clip out everything outside the resulting
rectangle. This prevents objects from inadvertently drawing where they are not
supposed to.
Containers
are also expected to map the device context origin so the object can draw in
client coordinates of the containing window, usually the container s window. If
the container is merely passing its window device context, this occurs
automatically. If it is returning another device context, for example, an
offscreen memory device context, then the viewport origin should be set
appropriately.
Notes to Implementers
Depending
whether it is returning an on-screen or off-screen device context and depending
on how sophisticated it is, container can use one of the following algorithms:
1. On-screen, one pass drawing
In the GetDC
method, the container should:
Get the window device context.
If OLEDC_PAINTBKGND is set, draw the
DVASPECT_CONTENT aspect of every object behind the object requesting the device
context.
Return the device context.
In the ReleaseDC
method, the container should:
Draw the DVASPECT_CONTENT of every
overlapping object.
Release the device context.
2. On-screen, two pass drawing
In the GetDC
method, the container should:
Get the window device context.
Clip out the opaque regions of any
overlapping object. These regions do not need to be redrawn since they are
already correct on the screen.
If OLEDC_PAINTBKGND is not set, return the
device context.
Otherwise, clip out the opaque parts of the
object requesting the device context and draw the opaque parts of every object
behind it going front to back.
Draw the transparent aspects of every object
behind going back to front, setting the clipping region appropriately each
time.
Finally return the device context.
In the ReleaseDC
method, the container should:
Draw the transparent parts of every
overlapping object.
Release the device context.
3. Off-screen drawing
In the GetDC
method, the container should:
Create a screen compatible memory device
context, containing a compatible bitmap of appropriate size.
Map the viewport origin of the device context
to ensure that the calling object can draw using client area coordinates of the
containing window.
If OLEDC_PAINTBKGND is set, draw the
DVASPECT_CONTENT of every object behind the calling object.
Return the device context.
In the ReleaseDC
method, the container should:
Draw the DVASPECT_CONTENT aspect of every
overlapping object.
Copy the off-screen bitmap to the screen at
the location the calling object originally requested in GetDC.
Delete and release the memory device context.
When this
method returns, the clipping region in the device context should be set so that
the object can t paint in any area it is not supposed to. If the object is not
opaque, the background should have been painted. If the device context is a
screen, any overlapping opaque areas should be clipped out.
See Also