windows-nt/Source/XPSP1/NT/windows/richedit/re41/_devdsc.h
2020-09-26 16:20:57 +08:00

152 lines
3.3 KiB
C++

/*
* _DEVDSC.H
*
* Purpose:
* CDevDesc (Device Descriptor) class
*
* Authors:
* Original RichEdit code: David R. Fulmer
* Christian Fortini
* Murray Sargent
*/
#ifndef _DEVDSC_H
#define _DEVDSC_H
class CTxtEdit;
// device descriptor
class CDevDesc
{
friend class CMeasurer;
protected:
CTxtEdit * _ped; // used to GetDC and ReleaseDC
HDC _hdc; // hdc for rendering device
BOOL _fMetafile; // Is this device a metafile.
SHORT _dxpInch; // device units per horizontal "inch"
SHORT _dypInch; // device units per vertical "inch"
HDC GetScreenDC () const;
void ReleaseScreenDC (HDC hdc) const;
public:
CDevDesc(CTxtEdit * ped)
{
_fMetafile = FALSE;
_ped = ped;
_hdc = NULL;
_dxpInch = 0;
_dypInch = 0;
}
// Test validity of device descriptor
// (whether SetDC has been properly called)
BOOL IsValid() const {return _dxpInch != 0 && _dypInch != 0;}
BOOL IsMetafile() const
{
if(!_hdc)
return FALSE;
return _fMetafile;
}
BOOL SetDC(HDC hdc, LONG dxpInch = -1, LONG dypInch = -1);
void SetMetafileDC(
HDC hdcMetafile,
LONG xMeasurePerInch,
LONG yMeasurePerInch);
void ResetDC() { SetDC(NULL); }
//REVIEW (keithcu) GetScreenDC/ReleaseScreenDC needed?
HDC GetDC() const
{
if(_hdc)
return _hdc;
return GetScreenDC();
}
void ReleaseDC(HDC hdc) const
{
if(!_hdc)
ReleaseScreenDC(hdc);
}
// REVIEW (keithcu) Verify callers of these routines logic...Think of a way to make it hard for people
// to screw up?
// Methods for converting between pixels and himetric
LONG HimetricXtoDX(LONG xHimetric) const { return W32->HimetricToDevice(xHimetric, _dxpInch); }
LONG HimetricYtoDY(LONG yHimetric) const { return W32->HimetricToDevice(yHimetric, _dypInch); }
LONG DXtoHimetricX(LONG dx) const { return W32->DeviceToHimetric(dx, _dxpInch); }
LONG DYtoHimetricY(LONG dy) const { return W32->DeviceToHimetric(dy, _dypInch); }
void LRtoDR(RECT &rcDest, const RECT &rcSrc, TFLOW tflow) const;
LONG DXtoLX(LONG x) const
{
AssertSz(_dxpInch, "CDevDesc::DXtoLX() - hdc has not been set");
return MulDiv(x, LX_PER_INCH, _dxpInch);
}
LONG DYtoLY(LONG y) const
{
AssertSz(_dypInch, "CDevDesc::DYtoLY() - hdc has not been set");
return MulDiv(y, LY_PER_INCH, _dypInch);
}
LONG LXtoDX(LONG x) const
{
AssertSz(_dxpInch, "CDevDesc::LXtoDX() - hdc has not been set");
return MulDiv(x, _dxpInch, LX_PER_INCH);
}
LONG LYtoDY(LONG y) const
{
AssertSz(_dypInch, "CDevDesc::LYtoDY() - hdc has not been set");
return MulDiv(y, _dypInch, LY_PER_INCH);
}
BOOL SameDevice(const CDevDesc *pdd) const
{
return (_dxpInch == pdd->_dxpInch) && (_dypInch == pdd->_dypInch) ? TRUE : FALSE;
}
// Assignment
CDevDesc& operator = (const CDevDesc& dd)
{
_hdc = dd._hdc;
_dxpInch = dd._dxpInch;
_dypInch = dd._dypInch;
return *this;
}
// Compares two device descriptors
BOOL operator == (const CDevDesc& dd) const
{
return _hdc == dd._hdc;
}
BOOL operator != (const CDevDesc& dd) const
{
return !(*this == dd);
}
LONG GetDxpInch() const
{
AssertSz(_dxpInch != 0, "CDevDesc::GetDxpInch _dxpInch is 0");
return _dxpInch;
}
LONG GetDypInch() const
{
AssertSz(_dypInch != 0, "CDevDesc::GetDypInch _dypInch is 0");
return _dypInch;
}
};
#endif