/* * _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