mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
3.7 KiB
162 lines
3.7 KiB
/*
|
|
* DEVDSC.C
|
|
*
|
|
* Purpose:
|
|
* CDevDesc (Device Descriptor) class
|
|
*
|
|
* Owner:
|
|
* Original RichEdit code: David R. Fulmer
|
|
* Christian Fortini
|
|
* Murray Sargent
|
|
*/
|
|
|
|
#include "_common.h"
|
|
#include "_devdsc.h"
|
|
#include "_edit.h"
|
|
#include "_font.h"
|
|
|
|
ASSERTDATA
|
|
|
|
BOOL CDevDesc::SetDC(HDC hdc, LONG dxpInch, LONG dypInch)
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::SetDC");
|
|
|
|
AssertSz((NULL == hdc) || (GetDeviceCaps(hdc, TECHNOLOGY) != DT_METAFILE),
|
|
"CDevDesc::SetDC attempting to set a metafile");
|
|
|
|
_hdc = hdc;
|
|
if(!_hdc)
|
|
{
|
|
if(!_ped->_fInPlaceActive || !(hdc = _ped->TxGetDC()))
|
|
{
|
|
_dxpInch = _dypInch = 0;
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
if (dxpInch == -1)
|
|
{
|
|
// Get device metrics - these should both succeed
|
|
_dxpInch = (SHORT)GetDeviceCaps(hdc, LOGPIXELSX);
|
|
AssertSz(_dxpInch != 0, "CDevDesc::SetDC _dxpInch is 0");
|
|
}
|
|
else
|
|
_dxpInch = dxpInch;
|
|
|
|
if (dypInch == -1)
|
|
{
|
|
_dypInch = (SHORT)GetDeviceCaps(hdc, LOGPIXELSY);
|
|
AssertSz(_dypInch != 0, "CDevDesc::SetDC _dypInch is 0");
|
|
}
|
|
else
|
|
_dypInch = dypInch;
|
|
|
|
if(!_dxpInch || !_dypInch)
|
|
return FALSE;
|
|
|
|
// Release DC if we got the window DC
|
|
if(!_hdc)
|
|
_ped->TxReleaseDC(hdc);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CDevDesc::SetMetafileDC(
|
|
HDC hdcMetafile,
|
|
LONG xMeasurePerInch,
|
|
LONG yMeasurePerInch)
|
|
{
|
|
_fMetafile = TRUE;
|
|
_hdc = hdcMetafile;
|
|
_dxpInch = (SHORT) xMeasurePerInch;
|
|
_dypInch = (SHORT) yMeasurePerInch;
|
|
}
|
|
|
|
HDC CDevDesc::GetScreenDC() const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::GetScreenDC");
|
|
|
|
Assert(!_hdc);
|
|
Assert(_ped);
|
|
return _ped->TxGetDC();
|
|
}
|
|
|
|
VOID CDevDesc::ReleaseScreenDC(HDC hdc) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::ReleaseScreenDC");
|
|
|
|
Assert(!_hdc);
|
|
Assert(_ped);
|
|
_ped->TxReleaseDC(hdc);
|
|
}
|
|
|
|
LONG CDevDesc::DXtoLX(LONG x) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::DXtoLX");
|
|
|
|
AssertSz(_dxpInch, "CDevDesc::DXtoLX() - hdc has not been set");
|
|
return ((x * LX_PER_INCH) * 2 + _dxpInch) / (2 * _dxpInch);
|
|
}
|
|
|
|
LONG CDevDesc::DYtoLY(LONG y) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::DYtoLY");
|
|
|
|
AssertSz(_dypInch, "CDevDesc::DYtoLY() - hdc has not been set");
|
|
return ((y * LY_PER_INCH) * 2 + _dypInch) / (2 * _dypInch);
|
|
}
|
|
|
|
void CDevDesc::DPtoLP(POINT &ptDest, const POINT &ptSrc) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::DPtoLP");
|
|
|
|
ptDest.x = DXtoLX(ptSrc.x);
|
|
ptDest.y = DYtoLY(ptSrc.y);
|
|
}
|
|
|
|
void CDevDesc::DRtoLR(RECT &rcDest, const RECT &rcSrc) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::DRtoLR");
|
|
|
|
rcDest.left = DXtoLX(rcSrc.left);
|
|
rcDest.right = DXtoLX(rcSrc.right);
|
|
rcDest.top = DYtoLY(rcSrc.top);
|
|
rcDest.bottom = DYtoLY(rcSrc.bottom);
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
LONG CDevDesc::LXtoDX(LONG x) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::LXtoDX");
|
|
|
|
AssertSz(_dxpInch, "CDevDesc::LXtoDX() - hdc has not been set");
|
|
return ((x * _dxpInch) + LX_PER_INCH / 2) / LX_PER_INCH;
|
|
}
|
|
|
|
LONG CDevDesc::LYtoDY(LONG y) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::LYtoDY");
|
|
|
|
AssertSz(_dypInch, "CDevDesc::LYtoDY() - hdc has not been set");
|
|
return ((y * _dypInch) + LY_PER_INCH / 2) / LY_PER_INCH;
|
|
}
|
|
#endif // DEBUG
|
|
|
|
void CDevDesc::LPtoDP(POINT &ptDest, const POINT &ptSrc) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::LPtoDP");
|
|
|
|
ptDest.x = LXtoDX(ptSrc.x);
|
|
ptDest.y = LYtoDY(ptSrc.y);
|
|
}
|
|
|
|
void CDevDesc::LRtoDR(RECT &rcDest, const RECT &rcSrc) const
|
|
{
|
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::LRtoDR");
|
|
|
|
rcDest.left = LXtoDX(rcSrc.left);
|
|
rcDest.right = LXtoDX(rcSrc.right);
|
|
rcDest.top = LYtoDY(rcSrc.top);
|
|
rcDest.bottom = LYtoDY(rcSrc.bottom);
|
|
}
|