|
|
/*
* OLEUTL.C * * Miscellaneous utility functions for OLE 2.0 Applications: * * Function Purpose * ------------------------------------------------------------------- * SetDCToDrawInHimetricRect Sets up an HIMETRIC mapping mode in a DC. * ResetOrigDC Performs the opposite of * SetDCToDrawInHimetricRect * XformWidthInPixelsToHimetric Converts an int width into HiMetric units * XformWidthInHimetricToPixels Converts an int width from HiMetric units * XformHeightInPixelsToHimetric Converts an int height into HiMetric units * XformHeightInHimetricToPixels Converts an int height from HiMetric units * XformRectInPixelsToHimetric Converts a rect into HiMetric units * XformRectInHimetricToPixels Converts a rect from HiMetric units * XformSizeInPixelsToHimetric Converts a SIZEL into HiMetric units * XformSizeInHimetricToPixels Converts a SIZEL from HiMetric units * AreRectsEqual Compares to Rect's * * ParseCmdLine Determines if -Embedding exists * OpenOrCreateRootStorage Creates a root docfile for OLE storage * CommitStorage Commits all changes in a docfile * CreateChildStorage Creates child storage in another storage * OpenChildStorage Opens child storage in another storage * * * Copyright (c)1992 Microsoft Corporation, All Right Reserved */
#define STRICT 1
#include "ole2ui.h"
#include <stdlib.h>
#include <ctype.h>
//Internal function to this module. No need for UNICODE in this function
static LPSTR GetWord(LPSTR lpszSrc, LPSTR lpszDst);
/*
* SetDCToAnisotropic * * Purpose: * Setup the correspondence between the rect in device unit (Viewport) and * the rect in logical unit (Window) so that the proper scaling of * coordinate systems will be calculated. set up both the Viewport and * the window as follows: * * 1) ------------------ ( 2 * | | * | | * | | * | | * | | * 3) ------------------ ( 4 * * Origin = P3 * X extent = P2x - P3x * Y extent = P2y - P3y * * Parameters: * hDC HDC to affect * lprcPhysical LPRECT containing the physical (device) extents of DC * lprcLogical LPRECT containing the logical extents * lprcWindowOld LPRECT in which to preserve the window for ResetOrigDC * lprcViewportOld LPRECT in which to preserver the viewport for ResetOrigDC * * Return Value: * int The original mapping mode of the DC. */
STDAPI_(int) SetDCToAnisotropic( HDC hDC, LPRECT lprcPhysical, LPRECT lprcLogical, LPRECT lprcWindowOld, LPRECT lprcViewportOld) { int nMapModeOld=SetMapMode(hDC, MM_ANISOTROPIC);
SetWindowOrgEx(hDC, lprcLogical->left, lprcLogical->bottom, (LPPOINT)&lprcWindowOld->left); SetWindowExtEx(hDC, (lprcLogical->right-lprcLogical->left), (lprcLogical->top-lprcLogical->bottom), (LPSIZE)&lprcWindowOld->right); SetViewportOrgEx(hDC, lprcPhysical->left, lprcPhysical->bottom, (LPPOINT)&lprcViewportOld->left); SetViewportExtEx(hDC, (lprcPhysical->right-lprcPhysical->left), (lprcPhysical->top-lprcPhysical->bottom), (LPSIZE)&lprcViewportOld->right);
return nMapModeOld; }
/*
* SetDCToDrawInHimetricRect * * Purpose: * Setup the correspondence between the rect in pixels (Viewport) and * the rect in HIMETRIC (Window) so that the proper scaling of * coordinate systems will be calculated. set up both the Viewport and * the window as follows: * * 1) ------------------ ( 2 * | | * | | * | | * | | * | | * 3) ------------------ ( 4 * * Origin = P3 * X extent = P2x - P3x * Y extent = P2y - P3y * * Parameters: * hDC HDC to affect * lprcPix LPRECT containing the pixel extents of DC * lprcHiMetric LPRECT to receive the himetric extents * lprcWindowOld LPRECT in which to preserve the window for ResetOrigDC * lprcViewportOld LPRECT in which to preserver the viewport for ResetOrigDC * * Return Value: * int The original mapping mode of the DC. */ STDAPI_(int) SetDCToDrawInHimetricRect( HDC hDC, LPRECT lprcPix, LPRECT lprcHiMetric, LPRECT lprcWindowOld, LPRECT lprcViewportOld) { int nMapModeOld=SetMapMode(hDC, MM_ANISOTROPIC); BOOL fSystemDC =FALSE;
if (NULL==hDC) { hDC=GetDC(NULL); fSystemDC=TRUE; }
XformRectInPixelsToHimetric(hDC, lprcPix, lprcHiMetric);
SetWindowOrgEx(hDC, lprcHiMetric->left, lprcHiMetric->bottom, (LPPOINT)&lprcWindowOld->left); SetWindowExtEx(hDC, (lprcHiMetric->right-lprcHiMetric->left), (lprcHiMetric->top-lprcHiMetric->bottom), (LPSIZE)&lprcWindowOld->right); SetViewportOrgEx(hDC, lprcPix->left, lprcPix->bottom, (LPPOINT)&lprcViewportOld->left); SetViewportExtEx(hDC, (lprcPix->right-lprcPix->left), (lprcPix->top-lprcPix->bottom), (LPSIZE)&lprcViewportOld->right);
if (fSystemDC) ReleaseDC(NULL, hDC);
return nMapModeOld; }
/*
* ResetOrigDC * * Purpose: * Restores a DC set to draw in himetric from SetDCToDrawInHimetricRect. * * Parameters: * hDC HDC to restore * nMapModeOld int original mapping mode of hDC * lprcWindowOld LPRECT filled in SetDCToDrawInHimetricRect * lprcViewportOld LPRECT filled in SetDCToDrawInHimetricRect * * Return Value: * int Same as nMapModeOld. */
STDAPI_(int) ResetOrigDC( HDC hDC, int nMapModeOld, LPRECT lprcWindowOld, LPRECT lprcViewportOld) { POINT pOld;
SetMapMode(hDC, nMapModeOld);
SetWindowOrgEx(hDC, lprcWindowOld->left, lprcWindowOld->top, (LPPOINT)&pOld); SetWindowExtEx(hDC, lprcWindowOld->right, lprcWindowOld->bottom, (LPSIZE)&pOld); SetViewportOrgEx(hDC, lprcViewportOld->left, lprcViewportOld->top, (LPPOINT)&pOld); SetViewportExtEx(hDC, lprcViewportOld->right, lprcViewportOld->bottom, (LPSIZE)&pOld);
return nMapModeOld; }
/*
* XformWidthInPixelsToHimetric * XformWidthInHimetricToPixels * XformHeightInPixelsToHimetric * XformHeightInHimetricToPixels * * Functions to convert an int between a device coordinate system and * logical HiMetric units. * * Parameters: * hDC HDC providing reference to the pixel mapping. If * NULL, a screen DC is used. * * Size Functions: * lpSizeSrc LPSIZEL providing the structure to convert. This * contains pixels in XformSizeInPixelsToHimetric and * logical HiMetric units in the complement function. * lpSizeDst LPSIZEL providing the structure to receive converted * units. This contains pixels in * XformSizeInPixelsToHimetric and logical HiMetric * units in the complement function. * * Width Functions: * iWidth int containing the value to convert. * * Return Value: * Size Functions: None * Width Functions: Converted value of the input parameters. * * NOTE: * When displaying on the screen, Window apps display everything enlarged * from its actual size so that it is easier to read. For example, if an * app wants to display a 1in. horizontal line, that when printed is * actually a 1in. line on the printed page, then it will display the line * on the screen physically larger than 1in. This is described as a line * that is "logically" 1in. along the display width. Windows maintains as * part of the device-specific information about a given display device: * LOGPIXELSX -- no. of pixels per logical in along the display width * LOGPIXELSY -- no. of pixels per logical in along the display height * * The following formula converts a distance in pixels into its equivalent * logical HIMETRIC units: * * DistInHiMetric = (HIMETRIC_PER_INCH * DistInPix) * ------------------------------- * PIXELS_PER_LOGICAL_IN * */ STDAPI_(int) XformWidthInPixelsToHimetric(HDC hDC, int iWidthInPix) { int iXppli; //Pixels per logical inch along width
int iWidthInHiMetric; BOOL fSystemDC=FALSE;
if (NULL==hDC) { hDC=GetDC(NULL); fSystemDC=TRUE; }
iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
//We got pixel units, convert them to logical HIMETRIC along the display
iWidthInHiMetric = MAP_PIX_TO_LOGHIM(iWidthInPix, iXppli);
if (fSystemDC) ReleaseDC(NULL, hDC);
return iWidthInHiMetric; }
STDAPI_(int) XformWidthInHimetricToPixels(HDC hDC, int iWidthInHiMetric) { int iXppli; //Pixels per logical inch along width
int iWidthInPix; BOOL fSystemDC=FALSE;
if (NULL==hDC) { hDC=GetDC(NULL); fSystemDC=TRUE; }
iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
//We got logical HIMETRIC along the display, convert them to pixel units
iWidthInPix = MAP_LOGHIM_TO_PIX(iWidthInHiMetric, iXppli);
if (fSystemDC) ReleaseDC(NULL, hDC);
return iWidthInPix; }
STDAPI_(int) XformHeightInPixelsToHimetric(HDC hDC, int iHeightInPix) { int iYppli; //Pixels per logical inch along height
int iHeightInHiMetric; BOOL fSystemDC=FALSE;
if (NULL==hDC) { hDC=GetDC(NULL); fSystemDC=TRUE; }
iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
//* We got pixel units, convert them to logical HIMETRIC along the display
iHeightInHiMetric = MAP_PIX_TO_LOGHIM(iHeightInPix, iYppli);
if (fSystemDC) ReleaseDC(NULL, hDC);
return iHeightInHiMetric; }
STDAPI_(int) XformHeightInHimetricToPixels(HDC hDC, int iHeightInHiMetric) { int iYppli; //Pixels per logical inch along height
int iHeightInPix; BOOL fSystemDC=FALSE;
if (NULL==hDC) { hDC=GetDC(NULL); fSystemDC=TRUE; }
iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
//* We got logical HIMETRIC along the display, convert them to pixel units
iHeightInPix = MAP_LOGHIM_TO_PIX(iHeightInHiMetric, iYppli);
if (fSystemDC) ReleaseDC(NULL, hDC);
return iHeightInPix; }
/*
* XformRectInPixelsToHimetric * XformRectInHimetricToPixels * * Purpose: * Convert a rectangle between pixels of a given hDC and HIMETRIC units * as manipulated in OLE. If the hDC is NULL, then a screen DC is used * and assumes the MM_TEXT mapping mode. * * Parameters: * hDC HDC providing reference to the pixel mapping. If * NULL, a screen DC is used. * lprcSrc LPRECT providing the rectangle to convert. This * contains pixels in XformRectInPixelsToHimetric and * logical HiMetric units in the complement function. * lprcDst LPRECT providing the rectangle to receive converted units. * This contains pixels in XformRectInPixelsToHimetric and * logical HiMetric units in the complement function. * * Return Value: * None * * NOTE: * When displaying on the screen, Window apps display everything enlarged * from its actual size so that it is easier to read. For example, if an * app wants to display a 1in. horizontal line, that when printed is * actually a 1in. line on the printed page, then it will display the line * on the screen physically larger than 1in. This is described as a line * that is "logically" 1in. along the display width. Windows maintains as * part of the device-specific information about a given display device: * LOGPIXELSX -- no. of pixels per logical in along the display width * LOGPIXELSY -- no. of pixels per logical in along the display height * * The following formula converts a distance in pixels into its equivalent * logical HIMETRIC units: * * DistInHiMetric = (HIMETRIC_PER_INCH * DistInPix) * ------------------------------- * PIXELS_PER_LOGICAL_IN * * Rect in Pixels (MM_TEXT): * * 0---------- X * | * | 1) ------------------ ( 2 P1 = (rc.left, rc.top) * | | | P2 = (rc.right, rc.top) * | | | P3 = (rc.left, rc.bottom) * | | | P4 = (rc.right, rc.bottom) * | | * Y | | * 3) ------------------ ( 4 * * NOTE: Origin = (P1x, P1y) * X extent = P4x - P1x * Y extent = P4y - P1y * * * Rect in Himetric (MM_HIMETRIC): * * * 1) ------------------ ( 2 P1 = (rc.left, rc.top) * Y | | P2 = (rc.right, rc.top) * | | P3 = (rc.left, rc.bottom) * | | | P4 = (rc.right, rc.bottom) * | | | * | | | * | 3) ------------------ ( 4 * | * 0---------- X * * NOTE: Origin = (P3x, P3y) * X extent = P2x - P3x * Y extent = P2y - P3y * * */
STDAPI_(void) XformRectInPixelsToHimetric( HDC hDC, LPRECT lprcPix, LPRECT lprcHiMetric) { int iXppli; //Pixels per logical inch along width
int iYppli; //Pixels per logical inch along height
int iXextInPix=(lprcPix->right-lprcPix->left); int iYextInPix=(lprcPix->bottom-lprcPix->top); BOOL fSystemDC=FALSE;
if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0) { hDC=GetDC(NULL); fSystemDC=TRUE; }
iXppli = GetDeviceCaps (hDC, LOGPIXELSX); iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
//We got pixel units, convert them to logical HIMETRIC along the display
lprcHiMetric->right = MAP_PIX_TO_LOGHIM(iXextInPix, iXppli); lprcHiMetric->top = MAP_PIX_TO_LOGHIM(iYextInPix, iYppli);
lprcHiMetric->left = 0; lprcHiMetric->bottom = 0;
if (fSystemDC) ReleaseDC(NULL, hDC);
return; }
STDAPI_(void) XformRectInHimetricToPixels( HDC hDC, LPRECT lprcHiMetric, LPRECT lprcPix) { int iXppli; //Pixels per logical inch along width
int iYppli; //Pixels per logical inch along height
int iXextInHiMetric=(lprcHiMetric->right-lprcHiMetric->left); int iYextInHiMetric=(lprcHiMetric->bottom-lprcHiMetric->top); BOOL fSystemDC=FALSE;
if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0) { hDC=GetDC(NULL); fSystemDC=TRUE; }
iXppli = GetDeviceCaps (hDC, LOGPIXELSX); iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
//We got pixel units, convert them to logical HIMETRIC along the display
lprcPix->right = MAP_LOGHIM_TO_PIX(iXextInHiMetric, iXppli); lprcPix->top = MAP_LOGHIM_TO_PIX(iYextInHiMetric, iYppli);
lprcPix->left = 0; lprcPix->bottom= 0;
if (fSystemDC) ReleaseDC(NULL, hDC);
return; }
/*
* XformSizeInPixelsToHimetric * XformSizeInHimetricToPixels * * Functions to convert a SIZEL structure (Size functions) or * an int (Width functions) between a device coordinate system and * logical HiMetric units. * * Parameters: * hDC HDC providing reference to the pixel mapping. If * NULL, a screen DC is used. * * Size Functions: * lpSizeSrc LPSIZEL providing the structure to convert. This * contains pixels in XformSizeInPixelsToHimetric and * logical HiMetric units in the complement function. * lpSizeDst LPSIZEL providing the structure to receive converted * units. This contains pixels in * XformSizeInPixelsToHimetric and logical HiMetric * units in the complement function. * * Width Functions: * iWidth int containing the value to convert. * * Return Value: * Size Functions: None * Width Functions: Converted value of the input parameters. * * NOTE: * When displaying on the screen, Window apps display everything enlarged * from its actual size so that it is easier to read. For example, if an * app wants to display a 1in. horizontal line, that when printed is * actually a 1in. line on the printed page, then it will display the line * on the screen physically larger than 1in. This is described as a line * that is "logically" 1in. along the display width. Windows maintains as * part of the device-specific information about a given display device: * LOGPIXELSX -- no. of pixels per logical in along the display width * LOGPIXELSY -- no. of pixels per logical in along the display height * * The following formula converts a distance in pixels into its equivalent * logical HIMETRIC units: * * DistInHiMetric = (HIMETRIC_PER_INCH * DistInPix) * ------------------------------- * PIXELS_PER_LOGICAL_IN * */
STDAPI_(void) XformSizeInPixelsToHimetric( HDC hDC, LPSIZEL lpSizeInPix, LPSIZEL lpSizeInHiMetric) { int iXppli; //Pixels per logical inch along width
int iYppli; //Pixels per logical inch along height
BOOL fSystemDC=FALSE;
if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0) { hDC=GetDC(NULL); fSystemDC=TRUE; }
iXppli = GetDeviceCaps (hDC, LOGPIXELSX); iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
//We got pixel units, convert them to logical HIMETRIC along the display
lpSizeInHiMetric->cx = (long)MAP_PIX_TO_LOGHIM((int)lpSizeInPix->cx, iXppli); lpSizeInHiMetric->cy = (long)MAP_PIX_TO_LOGHIM((int)lpSizeInPix->cy, iYppli);
if (fSystemDC) ReleaseDC(NULL, hDC);
return; }
STDAPI_(void) XformSizeInHimetricToPixels( HDC hDC, LPSIZEL lpSizeInHiMetric, LPSIZEL lpSizeInPix) { int iXppli; //Pixels per logical inch along width
int iYppli; //Pixels per logical inch along height
BOOL fSystemDC=FALSE;
if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0) { hDC=GetDC(NULL); fSystemDC=TRUE; }
iXppli = GetDeviceCaps (hDC, LOGPIXELSX); iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
//We got logical HIMETRIC along the display, convert them to pixel units
lpSizeInPix->cx = (long)MAP_LOGHIM_TO_PIX((int)lpSizeInHiMetric->cx, iXppli); lpSizeInPix->cy = (long)MAP_LOGHIM_TO_PIX((int)lpSizeInHiMetric->cy, iYppli);
if (fSystemDC) ReleaseDC(NULL, hDC);
return; }
#if defined( OBSOLETE )
// This function has been converted to a macro
/* AreRectsEqual
** ------------- */ STDAPI_(BOOL) AreRectsEqual(LPRECT lprc1, LPRECT lprc2) { if ((lprc1->top == lprc2->top) && (lprc1->left == lprc2->left) && (lprc1->right == lprc2->right) && (lprc1->bottom == lprc2->bottom)) return TRUE;
return FALSE; } #endif // OBSOLETE
/*
* ParseCmdLine * * Parses the Windows command line which was passed to WinMain. * This function determines if the -Embedding switch has been given. * */
STDAPI_(void) ParseCmdLine( LPSTR lpszLine, BOOL FAR* lpfEmbedFlag, LPSTR szFileName) { int i=0; CHAR szBuf[256];
if(lpfEmbedFlag) *lpfEmbedFlag = FALSE; szFileName[0]='\0'; // NULL string
// skip blanks
while(isspace(*lpszLine)) lpszLine++;
if(!*lpszLine) // No filename or options, so start a fresh document.
return;
// Check for "-Embedding" or "/Embedding" and set fEmbedding.
if(lpfEmbedFlag && (*lpszLine == '-' || *lpszLine == '/')) { lpszLine++; lpszLine = GetWord(lpszLine, szBuf); *lpfEmbedFlag = (BOOL) !strcmp(szBuf, EMBEDDINGFLAG); }
// skip blanks
while(isspace(*lpszLine)) lpszLine++;
// set szFileName to argument
while(lpszLine[i]) { szFileName[i]=lpszLine[i]; i++; } szFileName[i]='\0'; }
/* GetWord
* ------- * * LPSTR lpszSrc - Pointer to a source string * LPSTR lpszDst - Pointer to destination buffer * * Will copy one space-terminated or null-terminated word from the source * string to the destination buffer. * returns: pointer to next character following the word. */ static LPSTR GetWord(LPSTR lpszSrc, LPSTR lpszDst) { while (*lpszSrc && !isspace(*lpszSrc)) *lpszDst++ = *lpszSrc++;
*lpszDst = '\0'; return lpszSrc; }
|