ListCtrlCl.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. // ListCtrlCl.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "ListCtrlCl.h"
  5. struct stColor
  6. {
  7. int nRow;
  8. int nCol;
  9. COLORREF rgb;
  10. };
  11. // CListCtrlCl
  12. IMPLEMENT_DYNAMIC(CListCtrlCl, CListCtrl)
  13. CListCtrlCl::CListCtrlCl()
  14. : m_nRowHeight(0)
  15. , m_fontHeight(12)
  16. , m_fontWith(0)
  17. {
  18. m_color = RGB(0,0,0);
  19. }
  20. CListCtrlCl::~CListCtrlCl()
  21. {
  22. }
  23. BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)
  24. ON_WM_MEASUREITEM()
  25. ON_WM_MEASUREITEM_REFLECT()
  26. END_MESSAGE_MAP()
  27. // CListCtrlCl 消息处理程序
  28. void CListCtrlCl::PreSubclassWindow()
  29. {
  30. // TODO: 在此添加专用代码和/或调用基类
  31. ModifyStyle(0,LVS_OWNERDRAWFIXED);
  32. CListCtrl::PreSubclassWindow();
  33. CHeaderCtrl *pHeader = GetHeaderCtrl();
  34. m_Header.SubclassWindow(pHeader->GetSafeHwnd());
  35. }
  36. void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  37. {
  38. // TODO: 添加您的代码以绘制指定项
  39. TCHAR lpBuffer[256];
  40. LV_ITEM lvi;
  41. lvi.mask = LVIF_TEXT | LVIF_PARAM ;
  42. lvi.iItem = lpDrawItemStruct->itemID ;
  43. lvi.iSubItem = 0;
  44. lvi.pszText = lpBuffer ;
  45. lvi.cchTextMax = sizeof(lpBuffer);
  46. VERIFY(GetItem(&lvi));
  47. LV_COLUMN lvc, lvcprev ;
  48. ::ZeroMemory(&lvc, sizeof(lvc));
  49. ::ZeroMemory(&lvcprev, sizeof(lvcprev));
  50. lvc.mask = LVCF_WIDTH | LVCF_FMT;
  51. lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
  52. CDC* pDC;
  53. pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  54. CRect rtClient;
  55. GetClientRect(&rtClient);
  56. for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
  57. {
  58. if ( nCol > 0 )
  59. {
  60. // Get Previous Column Width in order to move the next display item
  61. GetColumn(nCol-1, &lvcprev) ;
  62. lpDrawItemStruct->rcItem.left += lvcprev.cx ;
  63. lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left;
  64. }
  65. CRect rcItem;
  66. if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem))
  67. continue;
  68. ::ZeroMemory(&lvi, sizeof(lvi));
  69. lvi.iItem = lpDrawItemStruct->itemID;
  70. lvi.mask = LVIF_TEXT | LVIF_PARAM;
  71. lvi.iSubItem = nCol;
  72. lvi.pszText = lpBuffer;
  73. lvi.cchTextMax = sizeof(lpBuffer);
  74. VERIFY(GetItem(&lvi));
  75. CRect rcTemp;
  76. rcTemp = rcItem;
  77. if (nCol==0)
  78. {
  79. rcTemp.left -=2;
  80. }
  81. if ( lpDrawItemStruct->itemState & ODS_SELECTED )
  82. {
  83. pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;
  84. pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;
  85. }
  86. else
  87. {
  88. COLORREF color;
  89. color = GetBkColor();
  90. pDC->FillSolidRect(rcTemp,color);
  91. if (FindColColor(nCol,color))
  92. {
  93. pDC->FillSolidRect(rcTemp,color);
  94. }
  95. if (FindItemColor(nCol,lpDrawItemStruct->itemID,color))
  96. {
  97. pDC->FillSolidRect(rcTemp,color);
  98. }
  99. //pDC->SetTextColor(m_color);
  100. }
  101. pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
  102. UINT uFormat = DT_CENTER ;
  103. if (m_Header.m_Format[nCol]=='0')
  104. {
  105. uFormat = DT_LEFT;
  106. }
  107. else if (m_Header.m_Format[nCol]=='1')
  108. {
  109. uFormat = DT_CENTER;
  110. }
  111. else if (m_Header.m_Format[nCol]=='2')
  112. {
  113. uFormat = DT_RIGHT;
  114. }
  115. TEXTMETRIC metric;
  116. pDC->GetTextMetrics(&metric);
  117. int ofst;
  118. ofst = rcItem.Height() - metric.tmHeight;
  119. rcItem.OffsetRect(0,ofst/2);
  120. pDC->SetTextColor(m_color);
  121. COLORREF color;
  122. if (FindColTextColor(nCol,color))
  123. {
  124. pDC->SetTextColor(color);
  125. }
  126. if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color))
  127. {
  128. pDC->SetTextColor(color);
  129. }
  130. CFont nFont ,* nOldFont;
  131. nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体
  132. nOldFont = pDC->SelectObject(&nFont);
  133. DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer),
  134. &rcItem, uFormat) ;
  135. pDC->SelectStockObject(SYSTEM_FONT) ;
  136. }
  137. }
  138. void CListCtrlCl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
  139. {
  140. // TODO: 在此添加消息处理程序代码和/或调用默认值
  141. CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
  142. }
  143. void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
  144. {
  145. if (m_nRowHeight>0)
  146. {
  147. lpMeasureItemStruct->itemHeight = m_nRowHeight;
  148. }
  149. }
  150. int CListCtrlCl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat /* = LVCFMT_LEFT */, int nWidth /* = -1 */, int nSubItem /* = -1 */)
  151. {
  152. m_Header.m_HChar.Add(lpszColumnHeading);
  153. if (nFormat==LVCFMT_LEFT)
  154. {
  155. m_Header.m_Format = m_Header.m_Format + "0";
  156. }
  157. else if (nFormat==LVCFMT_CENTER)
  158. {
  159. m_Header.m_Format = m_Header.m_Format + "1";
  160. }
  161. else if (nFormat==LVCFMT_RIGHT)
  162. {
  163. m_Header.m_Format = m_Header.m_Format + "2";
  164. }
  165. else
  166. {
  167. m_Header.m_Format = m_Header.m_Format + "1";
  168. }
  169. return CListCtrl::InsertColumn(nCol,lpszColumnHeading,nFormat,nWidth,nSubItem);
  170. }
  171. // Gradient - 渐变系数,立体背景用,不用渐变设为0
  172. void CListCtrlCl::SetHeaderBKColor(int R, int G, int B, int Gradient) //设置表头背景色
  173. {
  174. m_Header.m_R = R;
  175. m_Header.m_G = G;
  176. m_Header.m_B = B;
  177. m_Header.m_Gradient = Gradient;
  178. }
  179. // 设置表头高度
  180. void CListCtrlCl::SetHeaderHeight(float Height) //设置表头高度
  181. {
  182. m_Header.m_Height = Height;
  183. }
  184. bool CListCtrlCl::FindColColor(int col,COLORREF &color) //查找列颜色
  185. {
  186. int flag = 0;
  187. for (POSITION pos = m_ptrListCol.GetHeadPosition();pos!=NULL;)
  188. {
  189. stColor *pColor = (stColor*)m_ptrListCol.GetNext(pos);
  190. if (pColor->nCol==col)
  191. {
  192. flag = 1;
  193. color = pColor->rgb;
  194. break;
  195. }
  196. }
  197. if (1==flag)
  198. {
  199. return true;
  200. }
  201. return false;
  202. }
  203. bool CListCtrlCl::FindItemColor(int col,int row,COLORREF &color) //查找颜色
  204. {
  205. int flag = 0;
  206. for (POSITION pos = m_ptrListItem.GetHeadPosition();pos!=NULL;)
  207. {
  208. stColor *pColor = (stColor*)m_ptrListItem.GetNext(pos);
  209. if (pColor->nCol==col&&pColor->nRow==row)
  210. {
  211. flag = 1;
  212. color = pColor->rgb;
  213. break;
  214. }
  215. }
  216. if (1==flag)
  217. {
  218. return true;
  219. }
  220. return false;
  221. }
  222. void CListCtrlCl::SetColColor(int col,COLORREF color) //设置列颜色
  223. {
  224. stColor *pColor = new stColor;
  225. pColor->nCol = col;
  226. pColor->rgb = color;
  227. m_ptrListCol.AddTail(pColor);
  228. }
  229. void CListCtrlCl::SetItemColor(int col,int row,COLORREF color) //设置格子颜色
  230. {
  231. stColor *pColor = new stColor;
  232. pColor->nCol = col;
  233. pColor->nRow = row;
  234. pColor->rgb = color;
  235. m_ptrListItem.AddTail(pColor);
  236. }
  237. void CListCtrlCl::SetRowHeigt(int nHeight) //高置行高
  238. {
  239. m_nRowHeight = nHeight;
  240. CRect rcWin;
  241. GetWindowRect(&rcWin);
  242. WINDOWPOS wp;
  243. wp.hwnd = m_hWnd;
  244. wp.cx = rcWin.Width();
  245. wp.cy = rcWin.Height();
  246. wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
  247. SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
  248. }
  249. void CListCtrlCl::SetHeaderFontHW(int nHeight,int nWith) //设置头部字体宽和高
  250. {
  251. m_Header.m_fontHeight = nHeight;
  252. m_Header.m_fontWith = nWith;
  253. }
  254. void CListCtrlCl::SetHeaderTextColor(COLORREF color) //设置头部字体颜色
  255. {
  256. m_Header.m_color = color;
  257. }
  258. BOOL CListCtrlCl::SetTextColor(COLORREF cr) //设置字体颜色
  259. {
  260. m_color = cr;
  261. return TRUE;
  262. }
  263. void CListCtrlCl::SetFontHW(int nHeight,int nWith) //设置字体高和宽
  264. {
  265. m_fontHeight = nHeight;
  266. m_fontWith = nWith;
  267. }
  268. void CListCtrlCl::SetColTextColor(int col,COLORREF color)
  269. {
  270. stColor *pColor = new stColor;
  271. pColor->nCol = col;
  272. pColor->rgb = color;
  273. m_colTextColor.AddTail(pColor);
  274. }
  275. bool CListCtrlCl::FindColTextColor(int col,COLORREF &color)
  276. {
  277. int flag = 0;
  278. for (POSITION pos = m_colTextColor.GetHeadPosition();pos!=NULL;)
  279. {
  280. stColor *pColor = (stColor*)m_colTextColor.GetNext(pos);
  281. if (pColor->nCol==col)
  282. {
  283. flag = 1;
  284. color = pColor->rgb;
  285. break;
  286. }
  287. }
  288. if (1==flag)
  289. {
  290. return true;
  291. }
  292. return false;
  293. }
  294. bool CListCtrlCl::FindItemTextColor(int col,int row,COLORREF &color)
  295. {
  296. int flag = 0;
  297. for (POSITION pos = m_ItemTextColor.GetHeadPosition();pos!=NULL;)
  298. {
  299. stColor *pColor = (stColor*)m_ItemTextColor.GetNext(pos);
  300. if (pColor->nCol==col&&pColor->nRow==row)
  301. {
  302. flag = 1;
  303. color = pColor->rgb;
  304. break;
  305. }
  306. }
  307. if (1==flag)
  308. {
  309. return true;
  310. }
  311. return false;
  312. }
  313. void CListCtrlCl::SetItemTextColor(int col,int row,COLORREF color)
  314. {
  315. stColor *pColor = new stColor;
  316. pColor->nCol = col;
  317. pColor->nRow = row;
  318. pColor->rgb = color;
  319. m_ItemTextColor.AddTail(pColor);
  320. }