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