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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * XFORM.CPP
  3.  *
  4.  * Utility functions for coordinate conversion taken from the
  5.  * original OLE UI Library.
  6.  *
  7.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  8.  *
  9.  * Kraig Brockschmidt, Microsoft
  10.  * Internet  :  kraigb@microsoft.com
  11.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  12.  */
  13. #include "inoledll.h"
  14. #define HIMETRIC_PER_INCH   2540    //Number HIMETRIC units per inch
  15. #define PTS_PER_INCH        72      //Number points (font size) per inch
  16. #define MAP_PIX_TO_LOGHIM(x,ppli)   MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
  17. #define MAP_LOGHIM_TO_PIX(x,ppli)   MulDiv((ppli), (x), HIMETRIC_PER_INCH)
  18. /*
  19.  * XformWidthInPixelsToHimetric
  20.  * XformWidthInHimetricToPixels
  21.  * XformHeightInPixelsToHimetric
  22.  * XformHeightInHimetricToPixels
  23.  *
  24.  * Functions to convert an int between a device coordinate system and
  25.  * logical HiMetric units.
  26.  *
  27.  * Parameters:
  28.  *  hDC             HDC providing reference to the pixel mapping.  If
  29.  *                  NULL, a screen DC is used.
  30.  *  (others)        Values to convert
  31.  *
  32.  * NOTE:
  33.  *  When displaying on the screen, Window apps display everything enlarged
  34.  *  from its actual size so that it is easier to read. For example, if an
  35.  *  app wants to display a 1in. horizontal line, that when printed is
  36.  *  actually a 1in. line on the printed page, then it will display the line
  37.  *  on the screen physically larger than 1in. This is described as a line
  38.  *  that is "logically" 1in. along the display width. Windows maintains as
  39.  *  part of the device-specific information about a given display device:
  40.  *      LOGPIXELSX -- no. of pixels per logical in along the display width
  41.  *      LOGPIXELSY -- no. of pixels per logical in along the display height
  42.  *
  43.  *  The following formula converts a distance in pixels into its equivalent
  44.  *  logical HIMETRIC units:
  45.  *
  46.  *      DistInHiMetric = (HIMETRIC_PER_INCH * DistInPix)
  47.  *                       -------------------------------
  48.  *                           PIXELS_PER_LOGICAL_IN
  49.  *
  50.  */
  51. STDAPI_(int) XformWidthInPixelsToHimetric(HDC hDC, int iWidthInPix)
  52. {
  53. int     iXppli;     //Pixels per logical inch along width
  54. int     iWidthInHiMetric;
  55. BOOL    fSystemDC=FALSE;
  56. if (NULL==hDC)
  57. {
  58. hDC=GetDC(NULL);
  59. fSystemDC=TRUE;
  60. }
  61. iXppli=GetDeviceCaps (hDC, LOGPIXELSX);
  62. //We got pixel units, convert them to logical HIMETRIC along the display
  63. iWidthInHiMetric=MAP_PIX_TO_LOGHIM(iWidthInPix, iXppli);
  64. if (fSystemDC)
  65. ReleaseDC(NULL, hDC);
  66. return iWidthInHiMetric;
  67. }
  68. STDAPI_(int) XformWidthInHimetricToPixels(HDC hDC, int iWidthInHiMetric)
  69. {
  70. int     iXppli;     //Pixels per logical inch along width
  71. int     iWidthInPix;
  72. BOOL    fSystemDC=FALSE;
  73. if (NULL==hDC)
  74. {
  75. hDC=GetDC(NULL);
  76. fSystemDC=TRUE;
  77. }
  78. iXppli=GetDeviceCaps (hDC, LOGPIXELSX);
  79. //We got logical HIMETRIC along the display, convert them to pixel units
  80. iWidthInPix=MAP_LOGHIM_TO_PIX(iWidthInHiMetric, iXppli);
  81. if (fSystemDC)
  82. ReleaseDC(NULL, hDC);
  83. return iWidthInPix;
  84. }
  85. STDAPI_(int) XformHeightInPixelsToHimetric(HDC hDC, int iHeightInPix)
  86. {
  87. int     iYppli;     //Pixels per logical inch along height
  88. int     iHeightInHiMetric;
  89. BOOL    fSystemDC=FALSE;
  90. if (NULL==hDC)
  91. {
  92. hDC=GetDC(NULL);
  93. fSystemDC=TRUE;
  94. }
  95. iYppli=GetDeviceCaps (hDC, LOGPIXELSY);
  96. //We got pixel units, convert them to logical HIMETRIC along the display
  97. iHeightInHiMetric=MAP_PIX_TO_LOGHIM(iHeightInPix, iYppli);
  98. if (fSystemDC)
  99. ReleaseDC(NULL, hDC);
  100. return iHeightInHiMetric;
  101. }
  102. STDAPI_(int) XformHeightInHimetricToPixels(HDC hDC, int iHeightInHiMetric)
  103. {
  104. int     iYppli;     //Pixels per logical inch along height
  105. int     iHeightInPix;
  106. BOOL    fSystemDC=FALSE;
  107. if (NULL==hDC)
  108. {
  109. hDC=GetDC(NULL);
  110. fSystemDC=TRUE;
  111. }
  112. iYppli=GetDeviceCaps (hDC, LOGPIXELSY);
  113. //We got logical HIMETRIC along the display, convert them to pixel units
  114. iHeightInPix=MAP_LOGHIM_TO_PIX(iHeightInHiMetric, iYppli);
  115. if (fSystemDC)
  116. ReleaseDC(NULL, hDC);
  117. return iHeightInPix;
  118. }
  119. /*
  120.  * XformRectInPixelsToHimetric
  121.  * XformRectInHimetricToPixels
  122.  *
  123.  * Purpose:
  124.  *  Convert a rectangle between pixels of a given hDC and HIMETRIC units
  125.  *  as manipulated in OLE.  If the hDC is NULL, then a screen DC is used
  126.  *  and assumes the MM_TEXT mapping mode.
  127.  *
  128.  * Parameters:
  129.  *  hDC             HDC providing reference to the pixel mapping.  If
  130.  *                  NULL, a screen DC is used.
  131.  *  prcPix          LPRECT containng the rectangles to convert.
  132.  *  prcHiMetric
  133.  *
  134.  * Return Value:
  135.  *  None
  136.  *
  137.  * NOTE:
  138.  *  When displaying on the screen, Window apps display everything enlarged
  139.  *  from its actual size so that it is easier to read. For example, if an
  140.  *  app wants to display a 1in. horizontal line, that when printed is
  141.  *  actually a 1in. line on the printed page, then it will display the line
  142.  *  on the screen physically larger than 1in. This is described as a line
  143.  *  that is "logically" 1in. along the display width. Windows maintains as
  144.  *  part of the device-specific information about a given display device:
  145.  *      LOGPIXELSX -- no. of pixels per logical in along the display width
  146.  *      LOGPIXELSY -- no. of pixels per logical in along the display height
  147.  *
  148.  *  The following formula converts a distance in pixels into its equivalent
  149.  *  logical HIMETRIC units:
  150.  *
  151.  *      DistInHiMetric=(HIMETRIC_PER_INCH * DistInPix)
  152.  *                      -------------------------------
  153.  *                            PIXELS_PER_LOGICAL_IN
  154.  *
  155.  * Rect in Pixels (MM_TEXT):
  156.  *
  157.  *              0---------- X
  158.  *              |
  159.  *              |       1) ------------------ ( 2   P1=(rc.left, rc.top)
  160.  *              |       |                     |     P2=(rc.right, rc.top)
  161.  *              |       |                     |     P3=(rc.left, rc.bottom)
  162.  *              |       |                     |     P4=(rc.right, rc.bottom)
  163.  *                      |                     |
  164.  *              Y       |                     |
  165.  *                      3) ------------------ ( 4
  166.  *
  167.  *              NOTE:   Origin  =(P1x, P1y)
  168.  *                      X extent=P4x - P1x
  169.  *                      Y extent=P4y - P1y
  170.  *
  171.  *
  172.  * Rect in Himetric (MM_HIMETRIC):
  173.  *
  174.  *
  175.  *                      1) ------------------ ( 2   P1=(rc.left, rc.top)
  176.  *              Y       |                     |     P2=(rc.right, rc.top)
  177.  *                      |                     |     P3=(rc.left, rc.bottom)
  178.  *              |       |                     |     P4=(rc.right, rc.bottom)
  179.  *              |       |                     |
  180.  *              |       |                     |
  181.  *              |       3) ------------------ ( 4
  182.  *              |
  183.  *              0---------- X
  184.  *
  185.  *              NOTE:   Origin  =(P3x, P3y)
  186.  *                      X extent=P2x - P3x
  187.  *                      Y extent=P2y - P3y
  188.  *
  189.  *
  190.  */
  191. STDAPI_(void) XformRectInPixelsToHimetric(HDC hDC, LPRECT prcPix
  192. , LPRECT prcHiMetric)
  193. {
  194. int     iXppli;     //Pixels per logical inch along width
  195. int     iYppli;     //Pixels per logical inch along height
  196. int     iXextInPix=(prcPix->right-prcPix->left);
  197. int     iYextInPix=(prcPix->bottom-prcPix->top);
  198. BOOL    fSystemDC=FALSE;
  199. if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0)
  200. {
  201. hDC=GetDC(NULL);
  202. fSystemDC=TRUE;
  203. }
  204. iXppli=GetDeviceCaps (hDC, LOGPIXELSX);
  205. iYppli=GetDeviceCaps (hDC, LOGPIXELSY);
  206. //We got pixel units, convert them to logical HIMETRIC along the display
  207. prcHiMetric->right=MAP_PIX_TO_LOGHIM(iXextInPix, iXppli);
  208. prcHiMetric->top  =MAP_PIX_TO_LOGHIM(iYextInPix, iYppli);
  209. prcHiMetric->left   =0;
  210. prcHiMetric->bottom =0;
  211. if (fSystemDC)
  212. ReleaseDC(NULL, hDC);
  213. return;
  214. }
  215. STDAPI_(void) XformRectInHimetricToPixels(HDC hDC, LPRECT prcHiMetric
  216. , LPRECT prcPix)
  217. {
  218. int     iXppli;     //Pixels per logical inch along width
  219. int     iYppli;     //Pixels per logical inch along height
  220. int     iXextInHiMetric=(prcHiMetric->right-prcHiMetric->left);
  221. int     iYextInHiMetric=(prcHiMetric->bottom-prcHiMetric->top);
  222. BOOL    fSystemDC=FALSE;
  223. if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0)
  224. {
  225. hDC=GetDC(NULL);
  226. fSystemDC=TRUE;
  227. }
  228. iXppli=GetDeviceCaps (hDC, LOGPIXELSX);
  229. iYppli=GetDeviceCaps (hDC, LOGPIXELSY);
  230. //We got pixel units, convert them to logical HIMETRIC along the display
  231. prcPix->right=MAP_LOGHIM_TO_PIX(iXextInHiMetric, iXppli);
  232. prcPix->top  =MAP_LOGHIM_TO_PIX(iYextInHiMetric, iYppli);
  233. prcPix->left =0;
  234. prcPix->bottom= 0;
  235. if (fSystemDC)
  236. ReleaseDC(NULL, hDC);
  237. return;
  238. }
  239. /*
  240.  * XformSizeInPixelsToHimetric
  241.  * XformSizeInHimetricToPixels
  242.  *
  243.  * Functions to convert a SIZEL structure (Size functions) or
  244.  * an int (Width functions) between a device coordinate system and
  245.  * logical HiMetric units.
  246.  *
  247.  * Parameters:
  248.  *  hDC             HDC providing reference to the pixel mapping.  If
  249.  *                  NULL, a screen DC is used.
  250.  *  pSizeInPix      LPSIZEL containing the size to convert.
  251.  *  pSizeInHiMetric
  252.  *
  253.  * NOTE:
  254.  *  When displaying on the screen, Window apps display everything enlarged
  255.  *  from its actual size so that it is easier to read. For example, if an
  256.  *  app wants to display a 1in. horizontal line, that when printed is
  257.  *  actually a 1in. line on the printed page, then it will display the line
  258.  *  on the screen physically larger than 1in. This is described as a line
  259.  *  that is "logically" 1in. along the display width. Windows maintains as
  260.  *  part of the device-specific information about a given display device:
  261.  *      LOGPIXELSX -- no. of pixels per logical in along the display width
  262.  *      LOGPIXELSY -- no. of pixels per logical in along the display height
  263.  *
  264.  *  The following formula converts a distance in pixels into its equivalent
  265.  *  logical HIMETRIC units:
  266.  *
  267.  *      DistInHiMetric=(HIMETRIC_PER_INCH * DistInPix)
  268.  *                       -------------------------------
  269.  *                           PIXELS_PER_LOGICAL_IN
  270.  *
  271.  */
  272. STDAPI_(void) XformSizeInPixelsToHimetric(HDC hDC, LPSIZEL pSizeInPix
  273. , LPSIZEL pSizeInHiMetric)
  274. {
  275. int     iXppli;     //Pixels per logical inch along width
  276. int     iYppli;     //Pixels per logical inch along height
  277. BOOL    fSystemDC=FALSE;
  278. if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0)
  279. {
  280. hDC=GetDC(NULL);
  281. fSystemDC=TRUE;
  282. }
  283. iXppli=GetDeviceCaps (hDC, LOGPIXELSX);
  284. iYppli=GetDeviceCaps (hDC, LOGPIXELSY);
  285. //We got pixel units, convert them to logical HIMETRIC along the display
  286. pSizeInHiMetric->cx=(long)MAP_PIX_TO_LOGHIM((int)pSizeInPix->cx, iXppli);
  287. pSizeInHiMetric->cy=(long)MAP_PIX_TO_LOGHIM((int)pSizeInPix->cy, iYppli);
  288. if (fSystemDC)
  289. ReleaseDC(NULL, hDC);
  290. return;
  291. }
  292. STDAPI_(void) XformSizeInHimetricToPixels(HDC hDC, LPSIZEL pSizeInHiMetric
  293. , LPSIZEL pSizeInPix)
  294. {
  295. int     iXppli;     //Pixels per logical inch along width
  296. int     iYppli;     //Pixels per logical inch along height
  297. BOOL    fSystemDC=FALSE;
  298. if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0)
  299. {
  300. hDC=GetDC(NULL);
  301. fSystemDC=TRUE;
  302. }
  303. iXppli=GetDeviceCaps (hDC, LOGPIXELSX);
  304. iYppli=GetDeviceCaps (hDC, LOGPIXELSY);
  305. //We got logical HIMETRIC along the display, convert them to pixel units
  306. pSizeInPix->cx=(long)MAP_LOGHIM_TO_PIX((int)pSizeInHiMetric->cx, iXppli);
  307. pSizeInPix->cy=(long)MAP_LOGHIM_TO_PIX((int)pSizeInHiMetric->cy, iYppli);
  308. if (fSystemDC)
  309. ReleaseDC(NULL, hDC);
  310. return;
  311. }