RTListCtrl.cpp
上传用户:qhonly
上传日期:2013-06-10
资源大小:487k
文件大小:4k
源码类别:

界面编程

开发平台:

Visual C++

  1. // RTListCtrl.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "RTListCtrl.h"
  5. #include "RTDraw.h"
  6. // CRTListCtrl
  7. IMPLEMENT_DYNAMIC(CRTListCtrl, CListCtrl)
  8. CRTListCtrl::CRTListCtrl()
  9. {
  10. m_bDraging = FALSE;
  11. m_bPainting = FALSE;
  12. }
  13. CRTListCtrl::~CRTListCtrl()
  14. {
  15. }
  16. CBitmap* CRTListCtrl::m_BackBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
  17. UINT     CRTListCtrl::m_BackBitmapDrawMode[5] = {0,0,0,0,0};
  18. BOOL     CRTListCtrl::m_bIsEnableSkin = TRUE;
  19. BEGIN_MESSAGE_MAP(CRTListCtrl, CListCtrl)
  20. ON_WM_CREATE()
  21. ON_WM_PAINT()
  22. ON_WM_ERASEBKGND()
  23. ON_WM_VSCROLL()
  24. ON_WM_HSCROLL()
  25. ON_WM_CTLCOLOR()
  26. END_MESSAGE_MAP()
  27. // CRTListCtrl 消息处理程序
  28. void CRTListCtrl::SetBackBitmap(CBitmap* pBitmap[],UINT DrawMode[])
  29. {
  30. for(int i = 0; i < 5; i ++)
  31. {
  32. m_BackBitmap[i] = pBitmap[i];
  33. m_BackBitmapDrawMode[i] = DrawMode[i];
  34. }
  35. }
  36. void CRTListCtrl::EnableSkin(BOOL IsEnable)
  37. {
  38. m_bIsEnableSkin = IsEnable;
  39. }
  40. void CRTListCtrl::PreSubclassWindow()
  41. {
  42. if(GetHeaderCtrl() != NULL)
  43. {
  44. m_HeaderCtrl.SubclassWindow(GetHeaderCtrl()->m_hWnd);
  45. }
  46. m_Container.Create(this);
  47. CListCtrl::PreSubclassWindow();
  48. }
  49. int CRTListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  50. {
  51. if (CListCtrl::OnCreate(lpCreateStruct) == -1)
  52. return -1;
  53. m_Container.Create(this);
  54. return 0;
  55. }
  56. void CRTListCtrl::OnPaint()
  57. {
  58. int nmax;
  59. int npos;
  60. nmax = GetScrollLimit(SBS_VERT);
  61. m_Container.SetVerRange(0,nmax);
  62. npos = GetScrollPos(SBS_VERT);
  63. m_Container.SetVerPos(npos);
  64. nmax = GetScrollLimit(SBS_HORZ);
  65. m_Container.SetHorRange(0,nmax);
  66. npos = GetScrollPos(SBS_HORZ);
  67. m_Container.SetHorPos(npos);
  68. if(!m_bIsEnableSkin)return CListCtrl::OnPaint();
  69. CRect rcArea;
  70. CRect rcWnd;
  71. GetClientRect(&rcWnd);
  72. rcArea = rcWnd;
  73. DWORD style = GetStyle();
  74. if((style & LVS_NOCOLUMNHEADER) != LVS_NOCOLUMNHEADER && (style & LVS_REPORT) == LVS_REPORT)
  75. {
  76. if(IsWindow(m_HeaderCtrl.m_hWnd))
  77. {
  78. CRect rtHeader;
  79. m_HeaderCtrl.GetWindowRect(&rtHeader);
  80. rcArea.top += rtHeader.Height();
  81. }
  82. }
  83. CClientDC ptDC(this);
  84. CDC defDC;
  85. CMemDC memDC(&ptDC,rcArea);
  86. defDC.CreateCompatibleDC(&ptDC);
  87. CBitmap  defBmp;
  88. CBitmap* defOld;
  89. defBmp.CreateCompatibleBitmap(&ptDC,rcWnd.Width(),rcWnd.Height());
  90. defOld = defDC.SelectObject(&defBmp);
  91. DefWindowProc(WM_ERASEBKGND, (WPARAM)defDC.m_hDC , 0);
  92. DefWindowProc(WM_PAINT, (WPARAM)defDC.m_hDC , 0);
  93. CRTDraw::RTDrawBitmap(&memDC,rcArea,m_BackBitmap[BMP_BACK],m_BackBitmapDrawMode[BMP_BACK]);
  94. memDC.TransparentBlt(rcArea.left,rcArea.top,rcArea.Width(),rcArea.Height(),&defDC,rcArea.left,rcArea.top,rcArea.Width(),rcArea.Height(),GetSysColor(COLOR_WINDOW));
  95. CPaintDC dc(this);
  96. defDC.SelectObject(defOld);
  97. }
  98. BOOL CRTListCtrl::OnEraseBkgnd(CDC* pDC)
  99. {
  100. if(!m_bIsEnableSkin)
  101. return CListCtrl::OnEraseBkgnd(pDC);
  102. DWORD style = GetStyle();
  103. if((style & LVS_NOCOLUMNHEADER) != LVS_NOCOLUMNHEADER && (style & LVS_REPORT) == LVS_REPORT)
  104. {
  105. if(IsWindow(m_HeaderCtrl.m_hWnd))
  106. {
  107. m_HeaderCtrl.RedrawWindow();
  108. }
  109. }
  110. return TRUE;
  111. }
  112. void CRTListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  113. {
  114. if(nSBCode == SB_THUMBTRACK || nSBCode == SB_THUMBPOSITION)
  115. {
  116. int pos = GetScrollPos(SBS_VERT);
  117. int newpos = nPos - pos;
  118. CRect rtItem;
  119. GetItemRect(0,&rtItem,LVIR_BOUNDS);
  120. CSize size(0,newpos * rtItem.Height());
  121. Scroll(size);
  122. }
  123. else
  124. {
  125. CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
  126. }
  127. }
  128. void CRTListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  129. {
  130. if((nSBCode & SB_THUMBTRACK) == SB_THUMBTRACK || nSBCode == SB_THUMBPOSITION)
  131. {
  132. int pos = GetScrollPos(SBS_HORZ);
  133. int newpos = nPos - pos;
  134. CSize size(newpos,0);
  135. Scroll(size);
  136. }
  137. else
  138. {
  139. CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
  140. }
  141. }
  142. void CRTListCtrl::MoveWindow(LPCRECT rect)
  143. {
  144. m_Container.MoveWindow(rect);
  145. }
  146. BOOL CRTListCtrl::PreCreateWindow(CREATESTRUCT& cs)
  147. {
  148. if(!CListCtrl::PreCreateWindow(cs))
  149. return FALSE;
  150. return TRUE;
  151. }
  152. HBRUSH CRTListCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  153. {
  154. HBRUSH hbr = CListCtrl::OnCtlColor(pDC, pWnd, nCtlColor);
  155. return hbr;
  156. }