HeaderCtrlEx.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // HeaderCtrlEx.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "HeaderCtrlEx.h"
  5. // CHeaderCtrlEx
  6. IMPLEMENT_DYNAMIC(CHeaderCtrlEx, CHeaderCtrl)
  7. CHeaderCtrlEx::CHeaderCtrlEx()
  8. {
  9. }
  10. CHeaderCtrlEx::~CHeaderCtrlEx()
  11. {
  12. }
  13. BEGIN_MESSAGE_MAP(CHeaderCtrlEx, CHeaderCtrl)
  14. ON_WM_PAINT()
  15. ON_MESSAGE(HDM_LAYOUT, OnLayout)
  16. END_MESSAGE_MAP()
  17. LRESULT CHeaderCtrlEx::OnLayout( WPARAM wParam, LPARAM lParam )
  18. {
  19. LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);
  20. HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;
  21. RECT *prc = hdl.prc;
  22. WINDOWPOS *pwpos = hdl.pwpos;
  23. int nHeight = 35;
  24. pwpos->cy = nHeight;
  25. prc->top = nHeight;
  26. return lResult;
  27. }
  28. // CHeaderCtrlEx 消息处理程序;
  29. void CHeaderCtrlEx::OnPaint()
  30. {
  31. CPaintDC dc(this); // device context for painting
  32. // TODO: 在此处添加消息处理程序代码;
  33. RECT rRect;
  34. GetClientRect(&rRect);
  35. int nWidth = rRect.right-rRect.left;
  36. int nHeight = rRect.bottom-rRect.top;
  37. CDC memDC;
  38. CBitmap memBitmap;
  39. CBrush brush;
  40. //填充整个客户区;
  41. memDC.CreateCompatibleDC(&dc);
  42. memBitmap.CreateCompatibleBitmap(&dc, nWidth, nHeight);
  43. memDC.SelectObject(&memBitmap);
  44. memDC.SetBkMode(TRANSPARENT);
  45. //memDC.SelectObject(GetFont());
  46. CFont font;
  47. font.CreateFont(-MulDiv(int(21), 72, 72),
  48. 0, 0, 0, FW_NORMAL, 0, 0, 0, GB2312_CHARSET,
  49. OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, PROOF_QUALITY,
  50. FIXED_PITCH | FF_SWISS, "微软雅黑");
  51. memDC.SelectObject(&font);
  52. TRIVERTEX vert[2] ;
  53. GRADIENT_RECT gRect;
  54. vert [0] .x = rRect.left;
  55. vert [0] .y = rRect.top;
  56. vert [1] .x = rRect.right;
  57. vert [1] .y = rRect.bottom;
  58. vert [0] .Red = 0xff00;
  59. vert [0] .Green = 0xff00;
  60. vert [0] .Blue = 0xff00;
  61. vert [0] .Alpha = 0x0000;
  62. vert [1] .Red = 0x9100;
  63. vert [1] .Green = 0xd100;
  64. vert [1] .Blue = 0xf300;
  65. vert [1] .Alpha = 0xff00;
  66. gRect.UpperLeft = 0;
  67. gRect.LowerRight = 1;
  68. memDC.GradientFill(vert,2,&gRect,1,GRADIENT_FILL_RECT_V);
  69. //memDC.FillSolidRect(&rRect, RGB(172,232,244));
  70. int nCount = GetItemCount();
  71. for (int i =0; i < nCount; i++)
  72. {
  73. CRect itemRc;
  74. GetItemRect(i, &itemRc);
  75. CRect txtRc= itemRc;
  76. txtRc.left+=5;
  77. //txtRc.top +=5;
  78. HDITEM Item={0};
  79. TCHAR lpBuffer[256] = {0};
  80. Item.cchTextMax = 256;
  81. Item.pszText = lpBuffer;
  82. Item.mask = HDI_TEXT;
  83. GetItem(i, &Item);
  84. memDC.DrawText(lpBuffer, txtRc, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
  85. //切割线;
  86. CPen pen;
  87. pen.CreatePen(PS_SOLID, 1, 0xFFE4E1);
  88. memDC.SelectObject(&pen);
  89. memDC.MoveTo(itemRc.right, itemRc.top);
  90. memDC.LineTo(itemRc.right, itemRc.bottom);
  91. pen.DeleteObject();
  92. pen.CreatePen(PS_SOLID, 1, 0xFFFFFF);
  93. memDC.SelectObject(&pen);
  94. memDC.MoveTo(itemRc.right+1, itemRc.top);
  95. memDC.LineTo(itemRc.right+1, itemRc.bottom);
  96. }
  97. //底边线;
  98. CPen pen;
  99. pen.CreatePen(PS_SOLID, 1,0xFFE4E1);
  100. memDC.SelectObject(&pen);
  101. memDC.MoveTo(rRect.left, rRect.bottom-1);
  102. memDC.LineTo(rRect.right, rRect.bottom-1);
  103. pen.DeleteObject();
  104. //pen.CreatePen(PS_SOLID, 1, 0xFFFFFF);
  105. //memDC.SelectObject(&pen);
  106. //memDC.MoveTo(rRect.left, rRect.bottom-2);
  107. //memDC.LineTo(rRect.right, rRect.bottom-2);
  108. dc.BitBlt(0,0, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
  109. ReleaseDC(&memDC);
  110. }
  111. BOOL CHeaderCtrlEx::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
  112. {
  113. // TODO: 在此添加专用代码和/或调用基类;
  114. return CHeaderCtrl::Create(dwStyle, rect, pParentWnd, nID);
  115. }