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

Windows编程

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include "app.h"
  4. #include "box.hxx"
  5. CTextField::CTextField(TCHAR *sz)
  6. {
  7.     _sz = sz;
  8. }
  9. void CTextField::Paint(CCanvas &canvas, int x, int y)
  10. {
  11.     SetTextAlign(canvas, TA_LEFT | TA_BASELINE );
  12.     CFontSelect fs(canvas, _font);
  13.     canvas.Text(x, y, _sz, lstrlen(_sz) );
  14. }
  15. void CTextField::GetExtent(CCanvas &canvas, SIZE *pSize)
  16. {
  17. CFontSelect fs(canvas, _font);
  18.     GetTextExtentPoint(canvas, _sz, lstrlen(_sz), pSize);
  19. }
  20. void CTextField::SetFont(HFONT hfont)
  21. {
  22.     _font = hfont;      
  23. }
  24. //-----------------------------------------------
  25. CBoxFormat::CBoxFormat(SIZE sizeChar) :
  26.         _fontAlias(TEXT("Arial Narrow"), -10, FALSE),
  27. #ifdef CHARBITS
  28.         _fontCtype(TEXT("Arial"), 12, TRUE, FALSE, TRUE)
  29. #else
  30.         _fontCtype(TEXT("Arial"), 7, TRUE, FALSE, FALSE)
  31. #endif
  32. {
  33.         _size = sizeChar;
  34. }
  35. //-----------------------------------------------
  36. CBox::CBox( CBoxFormat &bxf, UINT iChar, HFONT hfont ) :
  37.         _fontBlock( hfont ),
  38.         _Block(1, 1, iChar, bxf ),
  39.         _bxf(bxf),
  40. #ifdef CHARBITS
  41.         _Alias(TEXT("Character Type Bits:")),
  42. #else
  43. _Alias(TEXT("Character Decomposition: ")),
  44. #endif
  45. _fuFormat(HEXADECIMAL)
  46. {
  47.     
  48.     _fontBlock.Update( -40, TRUE);
  49.     _Block.SetFont(_fontBlock); 
  50.     _sizeBox.cx = bxf._size.cx+100; // shadow 100/20 poitns
  51.     _sizeBox.cy = bxf._size.cy+100;
  52. #ifdef UNICODE
  53.     _sizeBox.cx += INCH4;
  54.     _sizeBox.cy += INCH4;
  55. #endif
  56.     _Alias.SetFont(bxf._fontAlias);
  57.     _iChar = iChar;
  58. }
  59.         
  60. void CBox::Paint(CCanvas &canvas, POINT pt, RECT rc)
  61. {
  62.     int x = pt.x;
  63.     int y = pt.y;
  64. #ifdef UNICODE
  65.     // adjust to length of header
  66.     SIZE size;
  67.     _Alias.GetExtent(canvas, &size);
  68.     _sizeBox.cx += size.cx;
  69. #endif
  70.     // make rc large enough
  71.     rc.left = pt.x;
  72.     rc.top = pt.y;
  73.     rc.right = pt.x+_sizeBox.cx-100;
  74.     rc.bottom = pt.y+_sizeBox.cy-100;
  75.     OffsetRect( &rc, 100, 100 );
  76.     FillRect(canvas, &rc, GetStockBrush(GRAY_BRUSH));
  77.     OffsetRect( &rc, -100, -100 );
  78.     FillRect(canvas, &rc, GetStockBrush(WHITE_BRUSH));
  79. #ifdef UNICODE
  80.     CBlackPen pen(canvas, PS_SOLID, 20);
  81.     Rectangle(canvas, rc.left, rc.top, rc.right, rc.bottom);
  82.     pt.x += INCH8;
  83.     pt.y += INCH8;
  84. #endif
  85.     _Block.SetFormat(_fuFormat);
  86.     _Block.Paint(canvas, rc, pt);
  87. #ifdef UNICODE
  88.     _Alias.Paint(canvas, x+=(INCH1-INCH10), y+= INCH4);
  89.     _Alias.GetExtent(canvas, &size);
  90.     pt.x = x;
  91.     pt.y = y+INCH10;
  92.     USHORT uTemp[2]={_iChar, 0};
  93.     SetTextColor(canvas, RGB(0,128,0));
  94. #ifdef CHARBITS
  95.     USHORT uType[2];
  96.     for( int i = 0; i < 3; i++ )
  97.     {
  98.         pt.y += size.cy;
  99.         GetStringTypeW(1<<i, uTemp, 2, uType );
  100.         CCodeGrid Ctype(1,1, size, uType[0]);
  101.         Ctype.SetFont(_bxf._fontCtype);
  102. Ctype.SetFormat(HEXADECIMAL, 4);
  103.         Ctype.Paint(canvas, rc, pt);
  104.     }
  105. #else // ifdef DECOMP
  106. int cch =FoldString(MAP_COMPOSITE, (LPCTSTR) &_iChar, 1, NULL, 0);
  107. LPTSTR pch = new TCHAR[cch];
  108. FoldString(MAP_COMPOSITE, (LPCTSTR) &_iChar, 1, pch, cch);
  109. SIZE sizedecomp;
  110. sizedecomp.cx = _bxf._size.cx/2;
  111. sizedecomp.cy = _bxf._size.cy/2;
  112.     // pt.y += sizedecomp.cy;
  113. CFont fontDecomp(_fontBlock);
  114. fontDecomp.Update(-20, TRUE);
  115. for(int i=0; i < cch; i++ )
  116. {
  117. CCharGrid Decomp(1,1,sizedecomp, pch[i] );
  118. Decomp.SetCharTable(); // exclude char images not in font
  119.         Decomp.SetFont(fontDecomp);
  120.         Decomp.Paint(canvas, rc, pt);
  121. CCodeGrid Code(1,1,sizedecomp, pch[i] );
  122. // but don't exclude their code nums
  123.         Code.SetFont(_bxf._fontCtype);
  124.       Code.SetTextOrg(sizedecomp.cx/2, 9*sizedecomp.cy/10);
  125. Code.SetFormat(HEXADECIMAL, 4);
  126.         Code.Paint(canvas, rc, pt);
  127.         pt.x += sizedecomp.cx;
  128. }    
  129. delete pch;
  130. #endif
  131.     SetTextColor(canvas, RGB(0,0,0));
  132. #endif
  133. }
  134. /*
  135. */
  136. UINT CBox::Hittest(CCanvas &canvas, POINT pt)
  137. {
  138.      return 0x00C5;
  139. }