MyBtn.cpp
上传用户:cesper001
上传日期:2007-01-01
资源大小:50k
文件大小:3k
源码类别:

按钮控件

开发平台:

Visual C++

  1. // MyBtn.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyBtn.h"
  5. #include "MemDC.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CMyBtn
  13. CMyBtn::CMyBtn()
  14. {
  15. }
  16. CMyBtn::~CMyBtn()
  17. {
  18. }
  19. BEGIN_MESSAGE_MAP(CMyBtn, CButton)
  20. //{{AFX_MSG_MAP(CMyBtn)
  21. //}}AFX_MSG_MAP
  22. END_MESSAGE_MAP()
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CMyBtn message handlers
  25. void CMyBtn::SetRound(void)
  26. {
  27. HRGN rgn;
  28. CRect wrect;
  29. GetClientRect(&wrect);
  30.     SetWindowRgn( NULL, FALSE );
  31. rgn = CreateEllipticRgn( wrect.left, wrect.top,
  32. wrect.right, wrect.bottom );
  33. SetWindowRgn(rgn, TRUE);
  34. }
  35. void CMyBtn::GradientFill (CDC* pDC, CRect* pRect)
  36. {
  37.     CBrush* pBrush[64];
  38.     for (int i=0; i<64; i++) 
  39. {
  40. pBrush[i] = new CBrush (RGB (0, 0, 255 - (i * 4)));
  41.     }
  42.     int nWidth = pRect->Width ();
  43.     int nHeight = pRect->Height ();
  44.     CRect rect;
  45.     for (i=0; i<nHeight; i++) 
  46. {
  47.         rect.SetRect (0, i, nWidth, i + 1);
  48.         pDC->FillRect (&rect, pBrush[(i * 63) / nHeight]);
  49.     }
  50.     for (i=0; i<64; i++)
  51.         delete pBrush[i];
  52. }
  53. void CMyBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  54. {
  55. // TODO: Add your code to draw the specified item
  56. CRect Rect = lpDrawItemStruct->rcItem;
  57. CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  58. CRgn rgn;
  59. CRect rect;
  60. rect = Rect;
  61. UINT state = lpDrawItemStruct->itemState;
  62. CMemDC *pMemDC = new CMemDC( pDC, Rect);
  63. CBrush hbr;
  64. hbr.CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
  65. //pDC->FillRect( &Rect, &hbr);
  66. pMemDC->FillRect( &Rect, &hbr);
  67. hbr.DeleteObject();
  68. if( !(state & ODS_DISABLED) )
  69. {
  70. if (state & ODS_SELECTED)
  71. {
  72. CPen pen( PS_SOLID, 2, GetSysColor( COLOR_3DHILIGHT ) );
  73. CPen *pPen;
  74. CPoint start, end;
  75. start.x = rect.left;
  76. start.y = rect.bottom;
  77. end.x = rect.right;
  78. end.y = rect.top;
  79. rect.left += 2;
  80. rect.top += 2;
  81. rect.right -= 2;
  82. rect.bottom -= 2;
  83. pPen = pMemDC->SelectObject( &pen );
  84. pMemDC->Arc( &rect, start, end );
  85. pMemDC->SelectObject( pPen );
  86. pen.DeleteObject();
  87. }
  88. }
  89. rgn.CreateEllipticRgn( rect.left, rect.top, 
  90. rect.right, rect.bottom );
  91. pMemDC->SelectClipRgn( &rgn );
  92. GradientFill( pMemDC, &Rect );
  93. SetRound();
  94. CString title;
  95. GetWindowText( title );
  96. if( title.GetLength() != 0 )
  97. {
  98. DrawWhiteText( pMemDC, &Rect, title );
  99. title.ReleaseBuffer();
  100. }
  101. delete pMemDC;
  102. }
  103. void CMyBtn::DrawWhiteText(CDC* pDC, CRect* pRect, CString& text )
  104. {
  105.     CFont font;
  106.     int nHeight = -16;
  107.     font.CreateFont (nHeight, 0, 0, 0, FW_BOLD,
  108.         TRUE, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS,
  109.         CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH |
  110.         FF_DONTCARE, "Times New Roman");
  111.     pDC->SetBkMode(TRANSPARENT);
  112.     pDC->SetTextColor(RGB (255, 255, 255));
  113.     CFont* pOldFont = pDC->SelectObject (&font);
  114.     pDC->DrawText (text, -1, pRect, DT_SINGLELINE | DT_CENTER |
  115.     DT_VCENTER);
  116.     pDC->SelectObject (pOldFont);
  117. }