GradientItem.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "StdAfx.h"
  2. #include "GradientItem.h"
  3. CGradientItem::CGradientItem(void)
  4. {
  5. m_clrLeft = RGB(0,0,0);
  6. m_clrRight = RGB(0,255,0);
  7. m_nButtonPushed = 0;
  8. }
  9. CPropertyGrid::EEditMode CGradientItem::GetEditMode()
  10. {
  11. return CPropertyGrid::EM_CUSTOM;
  12. }
  13. void CGradientItem::DrawItem(CDC& dc, CRect rc, bool focused)
  14. {
  15. CRect rect = rc;
  16. rect.DeflateRect(focused?rc.Height()+2:2, 2);
  17. CBrush brush;
  18. brush.CreateSolidBrush(GetSysColor(COLOR_WINDOWTEXT));
  19. dc.FrameRect(rect, &brush);
  20. rect.DeflateRect(1,1);
  21. TRIVERTEX vert[2] ;
  22. GRADIENT_RECT gRect;
  23. vert [0] .x = rect.left;
  24. vert [0] .y = rect.top;
  25. vert [0] .Red = GetRValue(m_clrLeft)*256;
  26. vert [0] .Green = GetGValue(m_clrLeft)*256;
  27. vert [0] .Blue = GetBValue(m_clrLeft)*256;
  28. vert [0] .Alpha = 0x0000;
  29. vert [1] .x = rect.right;
  30. vert [1] .y = rect.bottom;
  31. vert [1] .Red = GetRValue(m_clrRight)*256;
  32. vert [1] .Green = GetGValue(m_clrRight)*256;
  33. vert [1] .Blue = GetBValue(m_clrRight)*256;
  34. vert [1] .Alpha = 0x0000;
  35. gRect.UpperLeft = 0;
  36. gRect.LowerRight = 1;
  37. ::GradientFill(dc, vert, 2, &gRect, 1, GRADIENT_FILL_RECT_H);
  38. if (focused)
  39. {
  40. // for propert clean up
  41. CFont* pOldFont = dc.SelectObject(m_pGrid->GetFontBold());
  42. // the left button
  43. CRect rc1 = rc;
  44. rc1.right = rc1.left + rc1.Height();
  45. dc.DrawFrameControl(rc1, DFC_BUTTON, DFCS_BUTTONPUSH|(m_nButtonPushed==1?DFCS_PUSHED:0));
  46. dc.SelectObject(m_pGrid->GetFontBold());
  47. dc.DrawText("...", rc1, DT_CENTER|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX);
  48. // the right button
  49. CRect rc2 = rc;
  50. rc2.left = rc2.right - rc2.Height();
  51. dc.DrawFrameControl(rc2, DFC_BUTTON, DFCS_BUTTONPUSH|(m_nButtonPushed==2?DFCS_PUSHED:0));
  52. dc.SelectObject(m_pGrid->GetFontBold());
  53. dc.DrawText("...", rc2, DT_CENTER|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX);
  54. // clean up
  55. dc.SelectObject(pOldFont);
  56. }
  57. }
  58. bool CGradientItem::OnLButtonDown(CRect rc, CPoint pt)
  59. {
  60. m_nButtonPushed = 0;
  61. if (rc.PtInRect(pt))
  62. {
  63. if (pt.x<=rc.left+rc.Height())
  64. {
  65. m_nButtonPushed = 1;
  66. return true;
  67. }
  68. if (pt.x>=rc.right-rc.Height())
  69. {
  70. m_nButtonPushed = 2;
  71. return true;
  72. }
  73. }
  74. return false;
  75. }
  76. void CGradientItem::OnMouseMove(CRect rc, CPoint pt)
  77. {
  78. OnLButtonDown(rc, pt);
  79. }
  80. void CGradientItem::OnLButtonUp(CRect rc, CPoint pt)
  81. {
  82. COLORREF& clr = (m_nButtonPushed==1) ? m_clrLeft : m_clrRight;
  83. m_nButtonPushed = 0;
  84. CColorDialog dlg(clr, 0, m_pGrid);
  85. if (dlg.DoModal() == IDOK)
  86. {
  87. clr = dlg.GetColor();
  88. m_pGrid->Invalidate();
  89. }
  90. }