INFO: Nesting Scalable Metafiles (107171)
The information in this article applies to:
- Microsoft Windows Software Development Kit (SDK) 3.1
This article was previously published under Q107171
3.10
WINDOWS
kbprg
SUMMARY
The ability to use a metafile Device Context (DC) as the destination
DC of a metafile playback is new in Windows 3.1. A metafile can now be
played into another metafile, and therefore you can easily place one
metafile inside another metafile or copy pieces of one metafile into
another.
It is sometimes common for an application to create a metafile that
will be passed to another application. In this case, it is likely that
the metafile will be scaled. Scalable metafiles can easily be created
by using the MM_ANISOTROPIC mapping mode, the SetWindowExt() function, and the SetViewportExt() function. The logical extent of a scalable metafile is defined by the parameters in the SetWindowExt() function. It can be complicated when playing one scalable metafile into another scalable metafile device context. The logical extents of the two
metafiles may be different and the desired location of the metafile
being played may be offset from the origin of the destination metafile
DC. The OffsetWindowOrg() and ScaleViewportExt() functions can be used to alter the metafile DC's attributes in order to play the source metafile correctly into the destination metafile DC. The
SaveDC/RestoreDC commands can be used to preserve the metafile DC's
attributes while playing the source metafile into it.
MORE INFORMATION
When creating a scalable metafile, you are responsible for setting the
logical extent of the metafile by calling SetWindowExt(). When playing back a scalable metafile, the application can set the mapping mode to MM_ANISOTROPIC and call SetViewportExt() to specify the desired size of the metafile. When playing a scalable metafile into another
scalable metafile, the ratio of the logical extents must be used to
determine how far to offset the window origin, so the metafile will be
played in the correct location. Also, the viewport must be scaled
accordingly so the metafile being played in the destination metafile
DC will be the correct size. Calling SaveDC() before playing the
metafile and RestoreDC() after playing the metafile will preserve the attributes of the destination metafile DC.
The following code can be used to play a scalable metafile into
another scalable metafile DC. Both the logical extents of the source
and destination are needed. The first parameter is the destination
metafile DC. The second parameter specifies the metafile that will be
played into the destination metafile DC. The next four parameters
specify a logical rectangle where the metafile will be played on the
destination metafile DC. The two parameters after that specify the
logical extents of the destination metafile DC, and the last two
parameters are the logical extents of the metafile being played.
Sample Code
void PlayInMetafile(HDC hdcMeta,HMETAFILE hmf,int nLeftRect,
int nTopRect,int nRightRect,int nBottomRect,
int xLogExt, int yLogExt, int xHmfLogExt,
int yHmfLogExt)
{
SaveDC(hdcMeta);
OffsetWindowOrg(hdcMeta,-MulDiv(nLeftRect, xHmfLogExt,
nRightRect-nLeftRect), -MulDiv(nTopRect,
yHmfLogExt, nBottomRect-nTopRect));
ScaleViewportExt(hdcMeta,nRightRect-nLeftRect,xLogExt,
nBottomRect-nTopRect,yLogExt);
PlayMetaFile(hdcMeta,hmf);
RestoreDC(hdcMeta,-1);
}
Modification Type: | Minor | Last Reviewed: | 3/7/2005 |
---|
Keywords: | kbinfo KB107171 |
---|
|