241 lines
6.5 KiB
C++
241 lines
6.5 KiB
C++
|
// legacy.cpp
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include "tLegacy.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
* RectConvertMappings
|
||
|
*
|
||
|
* Purpose:
|
||
|
* Converts the contents of a rectangle from device to logical
|
||
|
* coordinates where the hDC defines the logical coordinates.
|
||
|
*
|
||
|
* Parameters:
|
||
|
* pRect LPRECT containing the rectangle to convert.
|
||
|
* hDC HDC describing the logical coordinate system.
|
||
|
* if NULL, uses a screen DC in MM_LOMETRIC.
|
||
|
* fToDevice BOOL TRUE to convert from uConv to device,
|
||
|
* FALSE to convert device to uConv.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* None
|
||
|
*/
|
||
|
|
||
|
|
||
|
void RectConvertMappings(LPRECT pRect, HDC hDC, BOOL fToDevice)
|
||
|
{
|
||
|
POINT rgpt[2];
|
||
|
BOOL fSysDC=FALSE;
|
||
|
|
||
|
if (NULL==pRect)
|
||
|
return;
|
||
|
|
||
|
rgpt[0].x=pRect->left;
|
||
|
rgpt[0].y=pRect->top;
|
||
|
rgpt[1].x=pRect->right;
|
||
|
rgpt[1].y=pRect->bottom;
|
||
|
|
||
|
if (NULL==hDC)
|
||
|
{
|
||
|
hDC=GetDC(NULL);
|
||
|
SetMapMode(hDC, MM_LOMETRIC);
|
||
|
fSysDC=TRUE;
|
||
|
}
|
||
|
|
||
|
if (fToDevice)
|
||
|
LPtoDP(hDC, rgpt, 2);
|
||
|
else
|
||
|
DPtoLP(hDC, rgpt, 2);
|
||
|
|
||
|
if (fSysDC)
|
||
|
ReleaseDC(NULL, hDC);
|
||
|
|
||
|
pRect->left=rgpt[0].x;
|
||
|
pRect->top=rgpt[0].y;
|
||
|
pRect->right=rgpt[1].x;
|
||
|
pRect->bottom=rgpt[1].y;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
STDAPI_(void) XformRectInHimetricToPixels(HDC hDC, LPRECT prcHiMetric
|
||
|
, LPRECT prcPix)
|
||
|
{
|
||
|
int iXppli; //Pixels per logical inch along width
|
||
|
int iYppli; //Pixels per logical inch along height
|
||
|
int iXextInHiMetric=(prcHiMetric->right-prcHiMetric->left);
|
||
|
int iYextInHiMetric=(prcHiMetric->bottom-prcHiMetric->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
|
||
|
prcPix->right=MAP_LOGHIM_TO_PIX(iXextInHiMetric, iXppli);
|
||
|
prcPix->top =MAP_LOGHIM_TO_PIX(iYextInHiMetric, iYppli);
|
||
|
|
||
|
prcPix->left =0;
|
||
|
prcPix->bottom= 0;
|
||
|
|
||
|
if (fSystemDC)
|
||
|
ReleaseDC(NULL, hDC);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
/*
|
||
|
* INOLE_SetIconInCache
|
||
|
*
|
||
|
* Purpose:
|
||
|
* Stores an iconic presentation metafile in the cache.
|
||
|
*
|
||
|
* Parameters:
|
||
|
* pObj IUnknown * of the object.
|
||
|
* hMetaPict HGLOBAL containing the presentation.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* HRESULT From IOleCache::SetData.
|
||
|
*/
|
||
|
|
||
|
#if 0
|
||
|
STDAPI INOLE_SetIconInCache(IUnknown *pObj, HGLOBAL hMetaPict)
|
||
|
{
|
||
|
IOleCache *pCache;
|
||
|
FORMATETC fe;
|
||
|
STGMEDIUM stm;
|
||
|
HRESULT hr;
|
||
|
|
||
|
if (NULL==hMetaPict)
|
||
|
return ResultFromScode(E_INVALIDARG);
|
||
|
|
||
|
if (FAILED(pObj->QueryInterface(IID_IOleCache, (void **)&pCache)))
|
||
|
return ResultFromScode(E_NOINTERFACE);
|
||
|
|
||
|
SETFormatEtc(fe, CF_METAFILEPICT, DVASPECT_ICON, NULL
|
||
|
, TYMED_MFPICT, -1);
|
||
|
|
||
|
stm.tymed=TYMED_MFPICT;
|
||
|
stm.hGlobal=hMetaPict;
|
||
|
stm.pUnkForRelease=NULL;
|
||
|
|
||
|
hr=pCache->SetData(&fe, &stm, FALSE);
|
||
|
pCache->Release();
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* 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.
|
||
|
* prcPix LPRECT containng the rectangles to convert.
|
||
|
* prcHiMetric
|
||
|
*
|
||
|
* 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 prcPix
|
||
|
, LPRECT prcHiMetric)
|
||
|
{
|
||
|
int iXppli; //Pixels per logical inch along width
|
||
|
int iYppli; //Pixels per logical inch along height
|
||
|
int iXextInPix=(prcPix->right-prcPix->left);
|
||
|
int iYextInPix=(prcPix->bottom-prcPix->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
|
||
|
prcHiMetric->right=MAP_PIX_TO_LOGHIM(iXextInPix, iXppli);
|
||
|
prcHiMetric->top =MAP_PIX_TO_LOGHIM(iYextInPix, iYppli);
|
||
|
|
||
|
prcHiMetric->left =0;
|
||
|
prcHiMetric->bottom =0;
|
||
|
|
||
|
if (fSystemDC)
|
||
|
ReleaseDC(NULL, hDC);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|