home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / gdi / fonts / gridfont / grid.hxx < prev    next >
Text File  |  1994-08-28  |  9KB  |  318 lines

  1. #ifndef __GRID_HXX_
  2. #define __GRID_HXX_
  3.  
  4. #include "canvas.hxx"
  5. #include "cset.hxx"
  6.  
  7. #include "font.hxx"
  8.  
  9. //========== CGridIt ===========================================
  10. class CGridIt
  11. {
  12. public:
  13.         CGridIt(UINT cCol, UINT cRow, SIZE size, POINT pt) :
  14.                 _pt(pt), _size(size), _cCol(cCol), _cRow(cRow), 
  15.                 _iRow(0), _iCol(0), _cx(pt.x), _cy(pt.y)
  16.         {}
  17.         
  18.         BOOL Done() { return _iCol == _cCol; };
  19.  
  20.         UINT Row()  { return _iRow; };
  21.         UINT Col()  { return _iCol; };
  22.         
  23.         COORD Cx() { return _cx; }
  24.         COORD Cy() { return _cy; }
  25.  
  26.         void operator++()
  27.         {
  28.             if( !Done())
  29.             {
  30.                 _iRow++;
  31.                 _cy+=_size.cy;
  32.                 if( _iRow == _cRow )
  33.                 {
  34.                     _iRow = 0;
  35.                     _cy = _pt.y;
  36.                     _iCol++;
  37.                     _cx += _size.cx;
  38.                 }
  39.             }
  40.         }
  41. protected:
  42.         POINT   _pt;
  43.         SIZE    _size;
  44.         UINT    _cRow;
  45.         UINT    _iRow;
  46.         UINT    _cCol;
  47.         UINT    _iCol;
  48.         COORD _cx, _cy;
  49. };
  50.  
  51. //========== CGrid =============================================
  52.  
  53. class CGrid
  54. {
  55. public:
  56.         virtual void Paint(CCanvas& canvas, RECT rc, POINT pt)=0;
  57. protected:
  58.         SIZE    _size;
  59.         UINT    _cCol;
  60.         UINT    _cRow;
  61. };
  62.  
  63. //========== CLineGrid =========================================
  64.  
  65. class CLineGrid : public CGrid
  66. {
  67. public:
  68.         CLineGrid(UINT cCol, UINT cRow, SIZE size);
  69.         void SetStyle(int iStyle = PS_DOT );
  70.         void SetWeight(int nWeight = 1 );
  71.         void Paint(CCanvas& canvas, RECT rc, POINT pt);
  72. protected:
  73.         int     _iStyle;
  74.         int     _nWeight;
  75. };
  76.  
  77. //========== CTextGrid =========================================
  78.  
  79. class CTextGrid : public CGrid
  80. {
  81. public:
  82.         CTextGrid() { _pCharUsed = NULL;};
  83.         ~CTextGrid() { if (_pCharUsed != NULL) _pCharUsed = (USHORT*)LocalFree(LocalHandle(_pCharUsed));};
  84.         void SetFont(HFONT hfont);
  85.         void SetTextOrg() 
  86.         {
  87.             _ptOrg.x = _size.cx/2;
  88.             _ptOrg.y=7*_size.cy/11;
  89.         };
  90.         
  91.         void SetTextOrg(COORD x, COORD y) 
  92.         {
  93.             _ptOrg.x=x; 
  94.             _ptOrg.y=y;
  95.         };
  96.         
  97.         virtual void Paint(CCanvas& canvas, RECT rc, POINT pt);
  98.         virtual void DrawElement(CCanvas& canvas, COORD x, COORD y, UINT i, UINT j)=0;
  99.         UINT Hittest(POINT pt, POINT ptTest);
  100.         void SetCharTable();
  101. protected:
  102.         POINT   _ptOrg;
  103.         HFONT   _font;
  104.         UINT    _iEltOffset;
  105.         USHORT * _pCharUsed;
  106. };
  107.  
  108. //========== CCharGrid =============================================
  109.  
  110. class CCharGrid : public CTextGrid
  111. {
  112. public:
  113.         CCharGrid(UINT cCol, UINT cRow, SIZE size, UINT iEltOffset=0);
  114.         virtual void DrawElement(CCanvas& canvas, COORD x, COORD y, UINT i, UINT j);
  115. //protected:
  116. };
  117.  
  118.  
  119. //========== CCodeGrid =============================================
  120.  
  121. #define HEXADECIMAL 0
  122. #define DECIMAL     1
  123. #define MASKROOT    1
  124.  
  125. class CCodeGrid : public CTextGrid
  126. {
  127. public:
  128.         CCodeGrid(UINT cCol, UINT cRow, SIZE size, UINT iEltOffset=0);
  129.         void SetFormat(UINT fuFormat=HEXADECIMAL, UINT cDigits=1);
  130.         void DrawElement(CCanvas& canvas, COORD x, COORD y, UINT i, UINT j);
  131. protected:
  132.         UINT    _cDigits;
  133.         TCHAR   _szFormat[5];
  134. };
  135.  
  136. //========== CBlockFormat =============================================
  137. // formatting elements common to all blocks 
  138.  
  139.  
  140. class CBlockFormat
  141. {
  142. public:
  143.         SIZE    _size;          // size of grid cell
  144.         CFont   _fontChar;
  145.         CFont   _fontCode;
  146.         UINT    _fuFormat;
  147. protected:
  148.         CBlockFormat();
  149. };
  150.  
  151. //========== CFrameFormat =============================================
  152. // formatting elements common to all frames
  153. class CFrameFormat : public CBlockFormat
  154. {
  155. public:
  156.         CFont   _fontHeader;
  157.         CFont   _fontLabel;
  158. protected:
  159.         CFrameFormat();
  160. };       
  161.  
  162. //========== CPageFormat =============================================
  163. //
  164. #define PAGEELEMS 2
  165. #define PAGEPRINT 4
  166.  
  167. class CPageFormat : public CFrameFormat
  168. {
  169. public: 
  170.         CPageFormat(UINT fuFormat);
  171.         void SetFormat(UINT fuFormat=HEXADECIMAL);
  172.  
  173.         CFont   _fontPageNum;
  174.         UINT    _fuFormat;
  175.         POINT   _ptPE[3];
  176.         POINT   _pt;            // "origin" of page proper
  177. };
  178.  
  179. //========== CCharBlock =============================================
  180. class CCharBlock
  181. {
  182. public:
  183.         CCharBlock(UINT cCol, UINT cRow, UINT iBlockOffset, const CBlockFormat &bf);
  184.  
  185.         void Paint(CCanvas& canvas, RECT rc, POINT pt);
  186.         UINT Hittest(POINT pt, POINT ptTest);
  187.         void SetFormat(UINT fuFormat=HEXADECIMAL);
  188.         void SetFont(HFONT font);
  189. protected:
  190.         CLineGrid       _Line;
  191.         CCharGrid       _Char;
  192.         CCodeGrid       _Code;
  193. };
  194.  
  195.  
  196. //========== CBlockFrame =============================================
  197.  
  198. class CBlockFrame : public CCharBlock
  199. {
  200. public:
  201.         CBlockFrame(UINT cCol, UINT cRow, POINT pt, UINT iBlockOffset, 
  202.                                     TCHAR *szHeader, const CFrameFormat &ff);
  203.         ~CBlockFrame();
  204.         void Paint(CCanvas& canvas, RECT rc, POINT pt);
  205.  
  206. protected:
  207.         void Draw(CCanvas& canvas, POINT pt);
  208.         TCHAR *         _szHeader;
  209.         SIZE            _size;
  210.         UINT            _cCol;
  211.         UINT            _cRow;   
  212.         HFONT           _fontHeader;
  213.         CCodeGrid       _Cols;
  214.  
  215.         // optional
  216.         CCodeGrid *     _pRows;
  217. };
  218. //========== CPage ===================================================
  219.  
  220. class CPage
  221. {
  222. public:
  223.         CPage(HINSTANCE hInst, CPageFormat& pf, UINT nPage=0);
  224.         ~CPage();
  225.       
  226.         void Paint(CCanvas& canvas, RECT rc);
  227.         void SetFormat(UINT fuFormat=HEXADECIMAL);
  228.         void SetFont( HFONT hfont);
  229.         UINT Hittest( POINT pt);
  230.         
  231. protected:
  232.         UINT InitPage(UINT nPage);
  233.         HINSTANCE       _hInst;
  234.         CPageFormat&    _pf;
  235.  
  236.         UINT            _cBlock;        // 0..4
  237.         CBlockFrame*    _apBlock[4];    // at most 4 blocks/page
  238.         POINT           _aptBlock[4];
  239.  
  240.         CCodeGrid       _PageHeadR;     // Right header 
  241.         CCodeGrid       _PageHeadL;     // Left  header 
  242.         CCodeGrid       _PageNums;      // Page number
  243. };
  244.  
  245. //========== CFontRange ===================================================
  246.  
  247. class CFontRange
  248. {
  249. friend class CTextGrid;
  250. public:
  251.         void SetFontRange(HWND hwnd, HFONT hfont);
  252.         ~CFontRange();
  253.         BOOL IsPageUsed(UINT nPage) { return _fPageUsed[nPage]; };
  254.               
  255. private:
  256.         void SwapShort (PUSHORT p);
  257.         void SwapULong (PULONG p);
  258.         BOOL CountUCSegments(HDC hdc);
  259.  
  260.         UINT _fPageUsed[256];
  261. };
  262.  
  263. //========== CModel ==================================================
  264. #define USEDONLY    0
  265. #define ALLPAGES    1
  266.  
  267. class CModel
  268. {
  269. public:
  270.         CModel(HINSTANCE hInst, HWND hwnd, UINT fuFormat=HEXADECIMAL, UINT fUsedPageOnly=USEDONLY);
  271.         ~CModel();
  272.  
  273.         // iteration
  274.         void NextPage();
  275.         void PrevPage();
  276.         void NextSection();
  277.         void PrevSection();
  278.         BOOL CanNextPage()      { return _iPage + 1 < _macPage; };
  279.         BOOL CanPrevPage()      { return _iPage;                };
  280.         BOOL CanNextSection()   { return _iPage +16 < _macPage; };
  281.         BOOL CanPrevSection()   { return _iPage + 1 >= 16;      };
  282.         UINT GetPage()          { return _iPage;                };
  283.         void SetPage(UINT nPage);
  284.         UINT GetMaxPage()       { return _macPage; };
  285.         UINT GetMaxSection()    { return _macPage / 16; };
  286.  
  287.         // Layout
  288.         void Paint(CCanvas& canvas, RECT rc){_pPage->Paint(canvas, rc);};
  289.         UINT Hittest( POINT pt);
  290.         void GetLineSize( SIZE * psize) { psize->cx = 4*INCH2/5;
  291.                                           psize->cy = INCH2;
  292.                                         }
  293.  
  294.         // Formatting
  295.         BOOL ChooseFont(HWND hwnd);
  296.         HFONT GetFont();
  297.         BOOL CreateFont(LOGFONT &lf);
  298.         void GetFormat(UINT &fuFormat);
  299.         void SetFormat(UINT fuFormat=HEXADECIMAL);
  300.         void GetPageMode(UINT &fPageMode);
  301.         void SetPageMode(UINT fPageMode=USEDONLY);
  302.         void SetCSet(CSet * pCset);
  303.         BOOL IsModelPageUsed(UINT nPage) {return _fr.IsPageUsed(nPage);}
  304.  
  305. protected:
  306.         UINT            _iPage;
  307.         UINT            _macPage;
  308.         CPageFormat     _pf;
  309.         CPage *         _pPage;
  310.         HINSTANCE       _hInst;
  311.         UINT            _fPageMode;
  312.         CFontRange      _fr;
  313. };
  314.  
  315.  
  316.  
  317. #endif
  318.