114 lines
2.2 KiB
C++
114 lines
2.2 KiB
C++
|
/*
|
||
|
* 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);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDevDesc::LRtoDR(RECT &rcDest, const RECT &rcSrc, TFLOW tflow) const
|
||
|
{
|
||
|
TRACEBEGIN(TRCSUBSYSDISP, TRCSCOPEINTERN, "CDevDesc::LRtoDR");
|
||
|
|
||
|
if (!IsUVerticalTflow(tflow))
|
||
|
{
|
||
|
rcDest.left = LXtoDX(rcSrc.left);
|
||
|
rcDest.right = LXtoDX(rcSrc.right);
|
||
|
rcDest.top = LYtoDY(rcSrc.top);
|
||
|
rcDest.bottom = LYtoDY(rcSrc.bottom);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
rcDest.left = LYtoDY(rcSrc.left);
|
||
|
rcDest.right = LYtoDY(rcSrc.right);
|
||
|
rcDest.top = LXtoDX(rcSrc.top);
|
||
|
rcDest.bottom = LXtoDX(rcSrc.bottom);
|
||
|
}
|
||
|
}
|