OLEUTL.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:23k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * OLEUTL.C
  3.  *
  4.  * Miscellaneous utility functions for OLE 2.0 Applications:
  5.  *
  6.  *  Function                      Purpose
  7.  *  -------------------------------------------------------------------
  8.  *  SetDCToDrawInHimetricRect     Sets up an HIMETRIC mapping mode in a DC.
  9.  *  ResetOrigDC                   Performs the opposite of
  10.  *                                SetDCToDrawInHimetricRect
  11.  *  XformWidthInPixelsToHimetric  Converts an int width into HiMetric units
  12.  *  XformWidthInHimetricToPixels  Converts an int width from HiMetric units
  13.  *  XformHeightInPixelsToHimetric Converts an int height into HiMetric units
  14.  *  XformHeightInHimetricToPixels Converts an int height from HiMetric units
  15.  *  XformRectInPixelsToHimetric   Converts a rect into HiMetric units
  16.  *  XformRectInHimetricToPixels   Converts a rect from HiMetric units
  17.  *  XformSizeInPixelsToHimetric   Converts a SIZEL into HiMetric units
  18.  *  XformSizeInHimetricToPixels   Converts a SIZEL from HiMetric units
  19.  *  AreRectsEqual                 Compares to Rect's
  20.  *
  21.  *  ParseCmdLine                  Determines if -Embedding exists
  22.  *  OpenOrCreateRootStorage       Creates a root docfile for OLE storage
  23.  *  CommitStorage                 Commits all changes in a docfile
  24.  *  CreateChildStorage            Creates child storage in another storage
  25.  *  OpenChildStorage              Opens child storage in another storage
  26.  *
  27.  *
  28.  * Copyright (c)1992-1996 Microsoft Corporation, All Right Reserved
  29.  */
  30. #define STRICT  1
  31. #include "olestd.h"
  32. #include <stdlib.h>
  33. #include <ctype.h>
  34. //Internal function to this module
  35. static LPSTR GetWord(LPSTR lpszSrc, LPSTR lpszDst);
  36. /*
  37.  * SetDCToAnisotropic
  38.  *
  39.  * Purpose:
  40.  *  Setup the correspondence between the rect in device unit (Viewport) and
  41.  *  the rect in logical unit (Window) so that the proper scaling of
  42.  *  coordinate systems will be calculated. set up both the Viewport and
  43.  *  the window as follows:
  44.  *
  45.  *      1) ------------------ ( 2
  46.  *      |                     |
  47.  *      |                     |
  48.  *      |                     |
  49.  *      |                     |
  50.  *      |                     |
  51.  *      3) ------------------ ( 4
  52.  *
  53.  *      Origin   = P3
  54.  *      X extent = P2x - P3x
  55.  *      Y extent = P2y - P3y
  56.  *
  57.  * Parameters:
  58.  *  hDC             HDC to affect
  59.  *  lprcPhysical    LPRECT containing the physical (device) extents of DC
  60.  *  lprcLogical     LPRECT containing the logical extents
  61.  *  lprcWindowOld   LPRECT in which to preserve the window for ResetOrigDC
  62.  *  lprcViewportOld LPRECT in which to preserver the viewport for ResetOrigDC
  63.  *
  64.  * Return Value:
  65.  *  int             The original mapping mode of the DC.
  66.  */
  67. STDAPI_(int) SetDCToAnisotropic(
  68.                 HDC hDC,
  69.                 LPRECT lprcPhysical, LPRECT lprcLogical,
  70.                 LPRECT lprcWindowOld, LPRECT lprcViewportOld)
  71. {
  72.         int     nMapModeOld=SetMapMode(hDC, MM_ANISOTROPIC);
  73.         SetWindowOrgEx(hDC, lprcLogical->left, lprcLogical->bottom, (LPPOINT)&lprcWindowOld->left);
  74.         SetWindowExtEx(hDC, (lprcLogical->right-lprcLogical->left), (lprcLogical->top-lprcLogical->bottom), (LPSIZE)&lprcWindowOld->right);
  75.         SetViewportOrgEx(hDC, lprcPhysical->left, lprcPhysical->bottom, (LPPOINT)&lprcViewportOld->left);
  76.         SetViewportExtEx(hDC, (lprcPhysical->right-lprcPhysical->left), (lprcPhysical->top-lprcPhysical->bottom), (LPSIZE)&lprcViewportOld->right);
  77.         return nMapModeOld;
  78. }
  79. /*
  80.  * SetDCToDrawInHimetricRect
  81.  *
  82.  * Purpose:
  83.  *  Setup the correspondence between the rect in pixels (Viewport) and
  84.  *  the rect in HIMETRIC (Window) so that the proper scaling of
  85.  *  coordinate systems will be calculated. set up both the Viewport and
  86.  *  the window as follows:
  87.  *
  88.  *      1) ------------------ ( 2
  89.  *      |                     |
  90.  *      |                     |
  91.  *      |                     |
  92.  *      |                     |
  93.  *      |                     |
  94.  *      3) ------------------ ( 4
  95.  *
  96.  *      Origin   = P3
  97.  *      X extent = P2x - P3x
  98.  *      Y extent = P2y - P3y
  99.  *
  100.  * Parameters:
  101.  *  hDC             HDC to affect
  102.  *  lprcPix         LPRECT containing the pixel extents of DC
  103.  *  lprcHiMetric    LPRECT to receive the himetric extents
  104.  *  lprcWindowOld   LPRECT in which to preserve the window for ResetOrigDC
  105.  *  lprcViewportOld LPRECT in which to preserver the viewport for ResetOrigDC
  106.  *
  107.  * Return Value:
  108.  *  int             The original mapping mode of the DC.
  109.  */
  110. STDAPI_(int) SetDCToDrawInHimetricRect(
  111.         HDC hDC,
  112.         LPRECT lprcPix, LPRECT lprcHiMetric,
  113.         LPRECT lprcWindowOld, LPRECT lprcViewportOld)
  114.         {
  115.         int     nMapModeOld=SetMapMode(hDC, MM_ANISOTROPIC);
  116.         BOOL    fSystemDC  =FALSE;
  117.         if (NULL==hDC)
  118.                 {
  119.                 hDC=GetDC(NULL);
  120.                 fSystemDC=TRUE;
  121.                 }
  122.         XformRectInPixelsToHimetric(hDC, lprcPix, lprcHiMetric);
  123.         SetWindowOrgEx(hDC, lprcHiMetric->left, lprcHiMetric->bottom, (LPPOINT)&lprcWindowOld->left);
  124.         SetWindowExtEx(hDC, (lprcHiMetric->right-lprcHiMetric->left), (lprcHiMetric->top-lprcHiMetric->bottom), (LPSIZE)&lprcWindowOld->right);
  125.         SetViewportOrgEx(hDC, lprcPix->left, lprcPix->bottom, (LPPOINT)&lprcViewportOld->left);
  126.         SetViewportExtEx(hDC, (lprcPix->right-lprcPix->left), (lprcPix->top-lprcPix->bottom), (LPSIZE)&lprcViewportOld->right);
  127.         if (fSystemDC)
  128.                 ReleaseDC(NULL, hDC);
  129.         return nMapModeOld;
  130.         }
  131. /*
  132.  * ResetOrigDC
  133.  *
  134.  * Purpose:
  135.  *  Restores a DC set to draw in himetric from SetDCToDrawInHimetricRect.
  136.  *
  137.  * Parameters:
  138.  *  hDC             HDC to restore
  139.  *  nMapModeOld     int original mapping mode of hDC
  140.  *  lprcWindowOld   LPRECT filled in SetDCToDrawInHimetricRect
  141.  *  lprcViewportOld LPRECT filled in SetDCToDrawInHimetricRect
  142.  *
  143.  * Return Value:
  144.  *  int             Same as nMapModeOld.
  145.  */
  146. STDAPI_(int) ResetOrigDC(
  147.         HDC hDC, int nMapModeOld,
  148.         LPRECT lprcWindowOld, LPRECT lprcViewportOld)
  149.         {
  150.         POINT     pOld;
  151.         SetMapMode(hDC, nMapModeOld);
  152.         SetWindowOrgEx(hDC,   lprcWindowOld->left,    lprcWindowOld->top,      (LPPOINT)&pOld);
  153.         SetWindowExtEx(hDC,   lprcWindowOld->right,   lprcWindowOld->bottom,   (LPSIZE)&pOld);
  154.         SetViewportOrgEx(hDC, lprcViewportOld->left,  lprcViewportOld->top,    (LPPOINT)&pOld);
  155.         SetViewportExtEx(hDC, lprcViewportOld->right, lprcViewportOld->bottom, (LPSIZE)&pOld);
  156.         return nMapModeOld;
  157.         }
  158. /*
  159.  * XformWidthInPixelsToHimetric
  160.  * XformWidthInHimetricToPixels
  161.  * XformHeightInPixelsToHimetric
  162.  * XformHeightInHimetricToPixels
  163.  *
  164.  * Functions to convert an int between a device coordinate system and
  165.  * logical HiMetric units.
  166.  *
  167.  * Parameters:
  168.  *  hDC             HDC providing reference to the pixel mapping.  If
  169.  *                  NULL, a screen DC is used.
  170.  *
  171.  *  Size Functions:
  172.  *  lpSizeSrc       LPSIZEL providing the structure to convert.  This
  173.  *                  contains pixels in XformSizeInPixelsToHimetric and
  174.  *                  logical HiMetric units in the complement function.
  175.  *  lpSizeDst       LPSIZEL providing the structure to receive converted
  176.  *                  units.  This contains pixels in
  177.  *                  XformSizeInPixelsToHimetric and logical HiMetric
  178.  *                  units in the complement function.
  179.  *
  180.  *  Width Functions:
  181.  *  iWidth          int containing the value to convert.
  182.  *
  183.  * Return Value:
  184.  *  Size Functions:     None
  185.  *  Width Functions:    Converted value of the input parameters.
  186.  *
  187.  * NOTE:
  188.  *  When displaying on the screen, Window apps display everything enlarged
  189.  *  from its actual size so that it is easier to read. For example, if an
  190.  *  app wants to display a 1in. horizontal line, that when printed is
  191.  *  actually a 1in. line on the printed page, then it will display the line
  192.  *  on the screen physically larger than 1in. This is described as a line
  193.  *  that is "logically" 1in. along the display width. Windows maintains as
  194.  *  part of the device-specific information about a given display device:
  195.  *      LOGPIXELSX -- no. of pixels per logical in along the display width
  196.  *      LOGPIXELSY -- no. of pixels per logical in along the display height
  197.  *
  198.  *  The following formula converts a distance in pixels into its equivalent
  199.  *  logical HIMETRIC units:
  200.  *
  201.  *      DistInHiMetric = (HIMETRIC_PER_INCH * DistInPix)
  202.  *                       -------------------------------
  203.  *                           PIXELS_PER_LOGICAL_IN
  204.  *
  205.  */
  206. STDAPI_(int) XformWidthInPixelsToHimetric(HDC hDC, int iWidthInPix)
  207.         {
  208.         int     iXppli;     //Pixels per logical inch along width
  209.         int     iWidthInHiMetric;
  210.         BOOL    fSystemDC=FALSE;
  211.         if (NULL==hDC)
  212.                 {
  213.                 hDC=GetDC(NULL);
  214.                 fSystemDC=TRUE;
  215.                 }
  216.         iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
  217.         //We got pixel units, convert them to logical HIMETRIC along the display
  218.         iWidthInHiMetric = MAP_PIX_TO_LOGHIM(iWidthInPix, iXppli);
  219.         if (fSystemDC)
  220.                 ReleaseDC(NULL, hDC);
  221.         return iWidthInHiMetric;
  222.         }
  223. STDAPI_(int) XformWidthInHimetricToPixels(HDC hDC, int iWidthInHiMetric)
  224.         {
  225.         int     iXppli;     //Pixels per logical inch along width
  226.         int     iWidthInPix;
  227.         BOOL    fSystemDC=FALSE;
  228.         if (NULL==hDC)
  229.                 {
  230.                 hDC=GetDC(NULL);
  231.                 fSystemDC=TRUE;
  232.                 }
  233.         iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
  234.         //We got logical HIMETRIC along the display, convert them to pixel units
  235.         iWidthInPix = MAP_LOGHIM_TO_PIX(iWidthInHiMetric, iXppli);
  236.         if (fSystemDC)
  237.                 ReleaseDC(NULL, hDC);
  238.         return iWidthInPix;
  239.         }
  240. STDAPI_(int) XformHeightInPixelsToHimetric(HDC hDC, int iHeightInPix)
  241.         {
  242.         int     iYppli;     //Pixels per logical inch along height
  243.         int     iHeightInHiMetric;
  244.         BOOL    fSystemDC=FALSE;
  245.         if (NULL==hDC)
  246.                 {
  247.                 hDC=GetDC(NULL);
  248.                 fSystemDC=TRUE;
  249.                 }
  250.         iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
  251.         //* We got pixel units, convert them to logical HIMETRIC along the display
  252.         iHeightInHiMetric = MAP_PIX_TO_LOGHIM(iHeightInPix, iYppli);
  253.         if (fSystemDC)
  254.                 ReleaseDC(NULL, hDC);
  255.         return iHeightInHiMetric;
  256.         }
  257. STDAPI_(int) XformHeightInHimetricToPixels(HDC hDC, int iHeightInHiMetric)
  258.         {
  259.         int     iYppli;     //Pixels per logical inch along height
  260.         int     iHeightInPix;
  261.         BOOL    fSystemDC=FALSE;
  262.         if (NULL==hDC)
  263.                 {
  264.                 hDC=GetDC(NULL);
  265.                 fSystemDC=TRUE;
  266.                 }
  267.         iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
  268.         //* We got logical HIMETRIC along the display, convert them to pixel units
  269.         iHeightInPix = MAP_LOGHIM_TO_PIX(iHeightInHiMetric, iYppli);
  270.         if (fSystemDC)
  271.                 ReleaseDC(NULL, hDC);
  272.         return iHeightInPix;
  273.         }
  274. /*
  275.  * XformRectInPixelsToHimetric
  276.  * XformRectInHimetricToPixels
  277.  *
  278.  * Purpose:
  279.  *  Convert a rectangle between pixels of a given hDC and HIMETRIC units
  280.  *  as manipulated in OLE.  If the hDC is NULL, then a screen DC is used
  281.  *  and assumes the MM_TEXT mapping mode.
  282.  *
  283.  * Parameters:
  284.  *  hDC             HDC providing reference to the pixel mapping.  If
  285.  *                  NULL, a screen DC is used.
  286.  *  lprcSrc         LPRECT providing the rectangle to convert.  This
  287.  *                  contains pixels in XformRectInPixelsToHimetric and
  288.  *                  logical HiMetric units in the complement function.
  289.  *  lprcDst         LPRECT providing the rectangle to receive converted units.
  290.  *                  This contains pixels in XformRectInPixelsToHimetric and
  291.  *                  logical HiMetric units in the complement function.
  292.  *
  293.  * Return Value:
  294.  *  None
  295.  *
  296.  * NOTE:
  297.  *  When displaying on the screen, Window apps display everything enlarged
  298.  *  from its actual size so that it is easier to read. For example, if an
  299.  *  app wants to display a 1in. horizontal line, that when printed is
  300.  *  actually a 1in. line on the printed page, then it will display the line
  301.  *  on the screen physically larger than 1in. This is described as a line
  302.  *  that is "logically" 1in. along the display width. Windows maintains as
  303.  *  part of the device-specific information about a given display device:
  304.  *      LOGPIXELSX -- no. of pixels per logical in along the display width
  305.  *      LOGPIXELSY -- no. of pixels per logical in along the display height
  306.  *
  307.  *  The following formula converts a distance in pixels into its equivalent
  308.  *  logical HIMETRIC units:
  309.  *
  310.  *      DistInHiMetric = (HIMETRIC_PER_INCH * DistInPix)
  311.  *                      -------------------------------
  312.  *                            PIXELS_PER_LOGICAL_IN
  313.  *
  314.  * Rect in Pixels (MM_TEXT):
  315.  *
  316.  *              0---------- X
  317.  *              |
  318.  *              |       1) ------------------ ( 2   P1 = (rc.left, rc.top)
  319.  *              |       |                     |     P2 = (rc.right, rc.top)
  320.  *              |       |                     |     P3 = (rc.left, rc.bottom)
  321.  *              |       |                     |     P4 = (rc.right, rc.bottom)
  322.  *                      |                     |
  323.  *              Y       |                     |
  324.  *                      3) ------------------ ( 4
  325.  *
  326.  *              NOTE:   Origin   = (P1x, P1y)
  327.  *                      X extent = P4x - P1x
  328.  *                      Y extent = P4y - P1y
  329.  *
  330.  *
  331.  * Rect in Himetric (MM_HIMETRIC):
  332.  *
  333.  *
  334.  *                      1) ------------------ ( 2   P1 = (rc.left, rc.top)
  335.  *              Y       |                     |     P2 = (rc.right, rc.top)
  336.  *                      |                     |     P3 = (rc.left, rc.bottom)
  337.  *              |       |                     |     P4 = (rc.right, rc.bottom)
  338.  *              |       |                     |
  339.  *              |       |                     |
  340.  *              |       3) ------------------ ( 4
  341.  *              |
  342.  *              0---------- X
  343.  *
  344.  *              NOTE:   Origin   = (P3x, P3y)
  345.  *                      X extent = P2x - P3x
  346.  *                      Y extent = P2y - P3y
  347.  *
  348.  *
  349.  */
  350. STDAPI_(void) XformRectInPixelsToHimetric(
  351.         HDC hDC, LPRECT lprcPix, LPRECT lprcHiMetric)
  352.         {
  353.         int     iXppli;     //Pixels per logical inch along width
  354.         int     iYppli;     //Pixels per logical inch along height
  355.         int     iXextInPix=(lprcPix->right-lprcPix->left);
  356.         int     iYextInPix=(lprcPix->bottom-lprcPix->top);
  357.         BOOL    fSystemDC=FALSE;
  358.         if (NULL==hDC ||
  359.             GetDeviceCaps(hDC, TECHNOLOGY) == DT_METAFILE ||
  360.             GetDeviceCaps(hDC, LOGPIXELSX) == 0)
  361.                 {
  362.                 hDC=GetDC(NULL);
  363.                 fSystemDC=TRUE;
  364.                 }
  365.         iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
  366.         iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
  367.         //We got pixel units, convert them to logical HIMETRIC along the display
  368.         lprcHiMetric->right = MAP_PIX_TO_LOGHIM(iXextInPix, iXppli);
  369.         lprcHiMetric->top   = MAP_PIX_TO_LOGHIM(iYextInPix, iYppli);
  370.         lprcHiMetric->left    = 0;
  371.         lprcHiMetric->bottom  = 0;
  372.         if (fSystemDC)
  373.                 ReleaseDC(NULL, hDC);
  374.         return;
  375.         }
  376. STDAPI_(void) XformRectInHimetricToPixels(
  377.         HDC hDC, LPRECT lprcHiMetric, LPRECT lprcPix)
  378.         {
  379.         int     iXppli;     //Pixels per logical inch along width
  380.         int     iYppli;     //Pixels per logical inch along height
  381.         int     iXextInHiMetric=(lprcHiMetric->right-lprcHiMetric->left);
  382.         int     iYextInHiMetric=(lprcHiMetric->bottom-lprcHiMetric->top);
  383.         BOOL    fSystemDC=FALSE;
  384.         if (NULL==hDC ||
  385.             GetDeviceCaps(hDC, TECHNOLOGY) == DT_METAFILE ||
  386.             GetDeviceCaps(hDC, LOGPIXELSX) == 0)
  387.                 {
  388.                 hDC=GetDC(NULL);
  389.                 fSystemDC=TRUE;
  390.                 }
  391.         iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
  392.         iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
  393.         //We got pixel units, convert them to logical HIMETRIC along the display
  394.         lprcPix->right = MAP_LOGHIM_TO_PIX(iXextInHiMetric, iXppli);
  395.         lprcPix->top   = MAP_LOGHIM_TO_PIX(iYextInHiMetric, iYppli);
  396.         lprcPix->left  = 0;
  397.         lprcPix->bottom= 0;
  398.         if (fSystemDC)
  399.                 ReleaseDC(NULL, hDC);
  400.         return;
  401.         }
  402. /*
  403.  * XformSizeInPixelsToHimetric
  404.  * XformSizeInHimetricToPixels
  405.  *
  406.  * Functions to convert a SIZEL structure (Size functions) or
  407.  * an int (Width functions) between a device coordinate system and
  408.  * logical HiMetric units.
  409.  *
  410.  * Parameters:
  411.  *  hDC             HDC providing reference to the pixel mapping.  If
  412.  *                  NULL, a screen DC is used.
  413.  *
  414.  *  Size Functions:
  415.  *  lpSizeSrc       LPSIZEL providing the structure to convert.  This
  416.  *                  contains pixels in XformSizeInPixelsToHimetric and
  417.  *                  logical HiMetric units in the complement function.
  418.  *  lpSizeDst       LPSIZEL providing the structure to receive converted
  419.  *                  units.  This contains pixels in
  420.  *                  XformSizeInPixelsToHimetric and logical HiMetric
  421.  *                  units in the complement function.
  422.  *
  423.  *  Width Functions:
  424.  *  iWidth          int containing the value to convert.
  425.  *
  426.  * Return Value:
  427.  *  Size Functions:     None
  428.  *  Width Functions:    Converted value of the input parameters.
  429.  *
  430.  * NOTE:
  431.  *  When displaying on the screen, Window apps display everything enlarged
  432.  *  from its actual size so that it is easier to read. For example, if an
  433.  *  app wants to display a 1in. horizontal line, that when printed is
  434.  *  actually a 1in. line on the printed page, then it will display the line
  435.  *  on the screen physically larger than 1in. This is described as a line
  436.  *  that is "logically" 1in. along the display width. Windows maintains as
  437.  *  part of the device-specific information about a given display device:
  438.  *      LOGPIXELSX -- no. of pixels per logical in along the display width
  439.  *      LOGPIXELSY -- no. of pixels per logical in along the display height
  440.  *
  441.  *  The following formula converts a distance in pixels into its equivalent
  442.  *  logical HIMETRIC units:
  443.  *
  444.  *      DistInHiMetric = (HIMETRIC_PER_INCH * DistInPix)
  445.  *                       -------------------------------
  446.  *                           PIXELS_PER_LOGICAL_IN
  447.  *
  448.  */
  449. STDAPI_(void) XformSizeInPixelsToHimetric(
  450.         HDC hDC, LPSIZEL lpSizeInPix, LPSIZEL lpSizeInHiMetric)
  451.         {
  452.         int     iXppli;     //Pixels per logical inch along width
  453.         int     iYppli;     //Pixels per logical inch along height
  454.         BOOL    fSystemDC=FALSE;
  455.         if (NULL==hDC ||
  456.             GetDeviceCaps(hDC, TECHNOLOGY) == DT_METAFILE ||
  457.             GetDeviceCaps(hDC, LOGPIXELSX) == 0)
  458.                 {
  459.                 hDC=GetDC(NULL);
  460.                 fSystemDC=TRUE;
  461.                 }
  462.         iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
  463.         iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
  464.         //We got pixel units, convert them to logical HIMETRIC along the display
  465.         lpSizeInHiMetric->cx = (long)MAP_PIX_TO_LOGHIM((int)lpSizeInPix->cx, iXppli);
  466.         lpSizeInHiMetric->cy = (long)MAP_PIX_TO_LOGHIM((int)lpSizeInPix->cy, iYppli);
  467.         if (fSystemDC)
  468.                 ReleaseDC(NULL, hDC);
  469.         return;
  470.         }
  471. STDAPI_(void) XformSizeInHimetricToPixels(
  472.         HDC hDC, LPSIZEL lpSizeInHiMetric, LPSIZEL lpSizeInPix)
  473.         {
  474.         int     iXppli;     //Pixels per logical inch along width
  475.         int     iYppli;     //Pixels per logical inch along height
  476.         BOOL    fSystemDC=FALSE;
  477.         if (NULL==hDC ||
  478.             GetDeviceCaps(hDC, TECHNOLOGY) == DT_METAFILE ||
  479.             GetDeviceCaps(hDC, LOGPIXELSX) == 0)
  480.                 {
  481.                 hDC=GetDC(NULL);
  482.                 fSystemDC=TRUE;
  483.                 }
  484.         iXppli = GetDeviceCaps (hDC, LOGPIXELSX);
  485.         iYppli = GetDeviceCaps (hDC, LOGPIXELSY);
  486.         //We got logical HIMETRIC along the display, convert them to pixel units
  487.         lpSizeInPix->cx = (long)MAP_LOGHIM_TO_PIX((int)lpSizeInHiMetric->cx, iXppli);
  488.         lpSizeInPix->cy = (long)MAP_LOGHIM_TO_PIX((int)lpSizeInHiMetric->cy, iYppli);
  489.         if (fSystemDC)
  490.                 ReleaseDC(NULL, hDC);
  491.         return;
  492.         }
  493. #if defined( OBSOLETE )
  494. // This function has been converted to a macro
  495. /* AreRectsEqual
  496. ** -------------
  497. */
  498. STDAPI_(BOOL) AreRectsEqual(LPRECT lprc1, LPRECT lprc2)
  499. {
  500.         if ((lprc1->top == lprc2->top) &&
  501.                 (lprc1->left == lprc2->left) &&
  502.                 (lprc1->right == lprc2->right) &&
  503.                 (lprc1->bottom == lprc2->bottom))
  504.                 return TRUE;
  505.         return FALSE;
  506. }
  507. #endif  // OBSOLETE
  508. /*
  509.  * ParseCmdLine
  510.  *
  511.  * Parses the Windows command line which was passed to WinMain.
  512.  * This function determines if the -Embedding switch has been given.
  513.  *
  514.  */
  515. STDAPI_(void) ParseCmdLine(
  516.         LPSTR lpszLine,
  517.         BOOL FAR* lpfEmbedFlag,
  518.         LPSTR szFileName)
  519. {
  520.         int i=0;
  521.         char szBuf[256];
  522.         if(lpfEmbedFlag)
  523.                 *lpfEmbedFlag = FALSE;
  524.         szFileName[0]='';             // NULL string
  525.         // skip blanks
  526.         while(isspace(*lpszLine)) lpszLine++;
  527.         if(!*lpszLine)   // No filename or options, so start a fresh document.
  528.                 return;
  529.         // Check for "-Embedding" or "/Embedding" and set fEmbedding.
  530.         if(lpfEmbedFlag && (*lpszLine == '-' || *lpszLine == '/')) {
  531.                 lpszLine++;
  532.                 lpszLine = GetWord(lpszLine, szBuf);
  533.                 *lpfEmbedFlag = !lstrcmp(szBuf, EMBEDDINGFLAG);
  534.         }
  535.         // skip blanks
  536.         while(isspace(*lpszLine)) lpszLine++;
  537.         // set szFileName to argument
  538.         while(lpszLine[i]) {
  539.                 szFileName[i]=lpszLine[i];
  540.                 i++;
  541.         }
  542.         szFileName[i]='';
  543. }
  544. /* GetWord
  545.  * -------
  546.  *
  547.  * LPSTR lpszSrc - Pointer to a source string
  548.  * LPSTR lpszDst - Pointer to destination buffer
  549.  *
  550.  * Will copy one space-terminated or null-terminated word from the source
  551.  * string to the destination buffer.
  552.  * returns: pointer to next character following the word.
  553.  */
  554. static LPSTR GetWord(LPSTR lpszSrc, LPSTR lpszDst)
  555. {
  556.         while (*lpszSrc && !isspace(*lpszSrc))
  557.                 *lpszDst++ = *lpszSrc++;
  558.         *lpszDst = '';
  559.         return lpszSrc;
  560. }