诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
6.3 KiB

  1. #include "StdAfx.h"
  2. #include "ListControl.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //宏定义
  5. //列表属性
  6. #define LIST_STYTE LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_FLATSB
  7. //////////////////////////////////////////////////////////////////////////////////
  8. //排序信息
  9. struct tagSortParameter
  10. {
  11. bool bAscendSort; //升序标志
  12. WORD wColumnIndex; //位置索引
  13. CListControl * pListControl; //列表控件
  14. };
  15. //////////////////////////////////////////////////////////////////////////////////
  16. BEGIN_MESSAGE_MAP(CListHeaderCtrl, CHeaderCtrl)
  17. ON_WM_PAINT()
  18. END_MESSAGE_MAP()
  19. BEGIN_MESSAGE_MAP(CListControl, CListCtrl)
  20. ON_WM_ERASEBKGND()
  21. ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
  22. END_MESSAGE_MAP()
  23. //////////////////////////////////////////////////////////////////////////////////
  24. //构造函数
  25. CListHeaderCtrl::CListHeaderCtrl()
  26. {
  27. }
  28. //析构函数
  29. CListHeaderCtrl::~CListHeaderCtrl()
  30. {
  31. }
  32. //重画函数
  33. VOID CListHeaderCtrl::OnPaint()
  34. {
  35. CPaintDC dc(this);
  36. //获取位置
  37. CRect rcRect;
  38. GetClientRect(&rcRect);
  39. //设置 DC
  40. dc.SetBkMode(TRANSPARENT);
  41. dc.SelectObject(GetFont());
  42. //绘画子项
  43. CRect rcItem;
  44. HDITEM HDItem;
  45. TCHAR szBuffer[64];
  46. for (INT i = 0; i < GetItemCount(); i++)
  47. {
  48. //构造变量
  49. HDItem.mask = HDI_TEXT;
  50. HDItem.pszText = szBuffer;
  51. HDItem.cchTextMax = CountArray(szBuffer);
  52. //获取信息
  53. GetItem(i, &HDItem);
  54. GetItemRect(i, &rcItem);
  55. //绘画背景
  56. dc.DrawFrameControl(&rcItem, DFC_BUTTON, DFCS_BUTTONPUSH);
  57. //绘画标题
  58. rcItem.DeflateRect(3, 1, 3, 1);
  59. const UINT uFormat = DT_WORDBREAK | DT_EDITCONTROL | DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | DT_CENTER;
  60. dc.DrawText(szBuffer, lstrlen(szBuffer), &rcItem, uFormat);
  61. }
  62. return;
  63. }
  64. //////////////////////////////////////////////////////////////////////////////////
  65. //构造函数
  66. CListControl::CListControl()
  67. {
  68. //设置变量
  69. m_bAscendSort = true;
  70. return;
  71. }
  72. //析构函数
  73. CListControl::~CListControl()
  74. {
  75. }
  76. //控件绑定
  77. VOID CListControl::PreSubclassWindow()
  78. {
  79. __super::PreSubclassWindow();
  80. //设置属性
  81. SetBkColor(CR_NORMAL_BK);
  82. SetExtendedStyle(LIST_STYTE);
  83. //绑定控件
  84. m_ListHeaderCtrl.SubclassWindow(GetHeaderCtrl()->GetSafeHwnd());
  85. //配置列表
  86. InitListControl();
  87. return;
  88. }
  89. //绘画函数
  90. VOID CListControl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  91. {
  92. //变量定义
  93. CRect rcItem = lpDrawItemStruct->rcItem;
  94. CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  95. //获取属性
  96. INT nItemID = lpDrawItemStruct->itemID;
  97. INT nColumnCount = m_ListHeaderCtrl.GetItemCount();
  98. //获取颜色
  99. tagListItemColor ListItemColor;
  100. GetListItemColor(lpDrawItemStruct->itemData, lpDrawItemStruct->itemState, ListItemColor);
  101. //绘画区域
  102. CRect rcClipBox;
  103. pDC->GetClipBox(&rcClipBox);
  104. //设置 DC
  105. pDC->SetBkColor(ListItemColor.rcBackColor);
  106. pDC->SetTextColor(ListItemColor.rcTextColor);
  107. //绘画子项
  108. for (INT i = 0; i < nColumnCount; i++)
  109. {
  110. //获取位置
  111. CRect rcSubItem;
  112. GetSubItemRect(nItemID, i, LVIR_LABEL, rcSubItem);
  113. //填充空隙
  114. if ((i == 0) && (rcItem.left<rcSubItem.left))
  115. {
  116. INT nYFill = rcItem.bottom - rcItem.top;
  117. INT nXFill = rcSubItem.left - rcItem.left;
  118. pDC->FillSolidRect(rcItem.left, rcItem.top, nXFill, nYFill, ListItemColor.rcBackColor);
  119. }
  120. //绘画判断
  121. if (rcSubItem.left>rcClipBox.right) break;
  122. if (rcSubItem.right < rcClipBox.left) continue;
  123. if (rcSubItem.left == rcSubItem.right) continue;
  124. //绘画背景
  125. pDC->FillSolidRect(&rcSubItem, ListItemColor.rcBackColor);
  126. //获取文字
  127. TCHAR szString[256] = TEXT("");
  128. GetItemText(nItemID, i, szString, CountArray(szString));
  129. //获取格式
  130. HDITEM HDItem;
  131. HDItem.mask = HDI_FORMAT;
  132. m_ListHeaderCtrl.GetItem(i, &HDItem);
  133. //设置格式
  134. UINT uFormat = 0;
  135. if (HDItem.fmt&HDF_LEFT) uFormat |= DT_LEFT;
  136. if (HDItem.fmt&HDF_RIGHT) uFormat |= DT_RIGHT;
  137. if (HDItem.fmt&HDF_CENTER) uFormat |= DT_CENTER;
  138. //绘画文字
  139. rcSubItem.left += 5;
  140. pDC->DrawText(szString, lstrlen(szString), &rcSubItem, uFormat | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS);
  141. }
  142. //绘画选择
  143. if (lpDrawItemStruct->itemState&ODS_FOCUS) pDC->DrawFocusRect(&rcItem);
  144. return;
  145. }
  146. //排列函数
  147. INT CALLBACK CListControl::SortFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamList)
  148. {
  149. //变量定义
  150. tagSortParameter * pSortParameter = (tagSortParameter *)lParamList;
  151. //排序变量
  152. WORD wColumnIndex = pSortParameter->wColumnIndex;
  153. CListControl * pListControl = pSortParameter->pListControl;
  154. //子项排序
  155. INT nResult = pListControl->SortListItemData(lParam1, lParam2, wColumnIndex);
  156. return (pSortParameter->bAscendSort) ? nResult : -nResult;
  157. }
  158. //绘画背景
  159. BOOL CListControl::OnEraseBkgnd(CDC * pDC)
  160. {
  161. //绘画背景
  162. if (m_ListHeaderCtrl.m_hWnd != NULL)
  163. {
  164. //获取位置
  165. CRect rcClient;
  166. CRect rcHeaderCtrl;
  167. GetClientRect(&rcClient);
  168. m_ListHeaderCtrl.GetWindowRect(&rcHeaderCtrl);
  169. //绘画背景
  170. rcClient.top = rcHeaderCtrl.Height();
  171. pDC->FillSolidRect(&rcClient, GetBkColor());
  172. return TRUE;
  173. }
  174. return __super::OnEraseBkgnd(pDC);
  175. }
  176. //点击消息
  177. VOID CListControl::OnColumnclick(NMHDR * pNMHDR, LRESULT * pResult)
  178. {
  179. //变量定义
  180. NM_LISTVIEW * pNMListView = (NM_LISTVIEW *)pNMHDR;
  181. //变量定义
  182. tagSortParameter SortParameter;
  183. ZeroMemory(&SortParameter, sizeof(SortParameter));
  184. //设置变量
  185. SortParameter.pListControl = this;
  186. SortParameter.bAscendSort = m_bAscendSort;
  187. SortParameter.wColumnIndex = pNMListView->iSubItem;
  188. //设置状态
  189. m_bAscendSort = !m_bAscendSort;
  190. //排列列表
  191. SortItems(SortFunction, (LPARAM)&SortParameter);
  192. return;
  193. }
  194. //////////////////////////////////////////////////////////////////////////////////