GRID.HXX
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

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