ListCtrlEx.cpp
上传用户:sunnie
上传日期:2022-07-13
资源大小:4512k
文件大小:7k
源码类别:

界面编程

开发平台:

Visual C++

  1. // ListCtrlEx.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ListCtrl.h"
  5. #include "ListCtrlEx.h"
  6. typedef vector<CListCtrlRow*> VECLISTROW;
  7. // CListCtrlEx
  8. IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl)
  9. CListCtrlEx::CListCtrlEx()
  10. {
  11. }
  12. CListCtrlEx::~CListCtrlEx()
  13. {
  14. }
  15. BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
  16. END_MESSAGE_MAP()
  17. // CListCtrlEx message handlers
  18. /*hdr
  19. ** Copyright  ShangHai Skoito Lamp Ltd.,China
  20. **
  21. ** 函数名: InsertItemEx
  22. ** 作者: RobateWang
  23. ** 日期: 05 - 06 - 2010
  24. **
  25. ** 描述:
  26. ** 向list插入一行,这一行包括三种控件:精度条、编辑、复选框
  27. **
  28. **
  29. ** 变量: 变量名  方向 类型 描述
  30. ** nItem 入参 char * 行号
  31. ** nCmdShow 出参 boolean 显示命令
  32. **
  33. **
  34. ** 返回值:
  35. **
  36. **
  37. ** 备注:
  38. **
  39. */
  40. void
  41. CListCtrlEx::InsertItemEx(const int nItem, int nCmdShow)
  42. {
  43. CString strTemp = "";
  44. int nTop = GetTopIndex();
  45. int nTotal = GetItemCount();
  46. int nPerPage = GetCountPerPage();
  47. int nLastItem = ((nTop + nPerPage) > nTotal) ? nTotal : nTop + nPerPage;
  48. if ((nItem < nTop) && (nItem > nLastItem))
  49. {
  50. return;
  51. }
  52. CRect rcCol1(0, 0, 0, 0);
  53. CRect rcCol2(0, 0, 0, 0);
  54. CRect rcCol3(0, 0, 0, 0);
  55. CRect rcProgBar(0, 0, 0, 0);
  56. CRect rcEditBox(0, 0, 0, 0);
  57. CRect rcChkBox(0, 0, 0, 0);
  58. GetHeaderCtrl()->GetItemRect(1, &rcCol1);
  59. GetHeaderCtrl()->GetItemRect(2, &rcCol2);
  60. GetHeaderCtrl()->GetItemRect(3, &rcCol3);
  61. //计算第一行的位置
  62. if (GetItemCount() == 0)
  63. {
  64. rcProgBar.top += rcCol1.bottom;
  65. rcProgBar.bottom = rcProgBar.top + 12;
  66. rcEditBox.top += rcCol2.bottom;
  67. rcEditBox.bottom = rcEditBox.top + 12;
  68. rcChkBox.top += rcCol3.bottom;
  69. rcChkBox.bottom = rcChkBox.top + 12;
  70. }
  71. else
  72. {
  73. GetItemRect(GetItemCount() - 1, &rcProgBar, LVIR_LABEL);
  74. rcProgBar.top += 1;
  75. rcProgBar.bottom -= 1;
  76. rcEditBox.top += rcProgBar.top;
  77. rcEditBox.bottom = rcProgBar.bottom;
  78. rcChkBox.top += rcProgBar.top;
  79. rcChkBox.bottom = rcProgBar.bottom;
  80. }
  81. //计算进度条的位置
  82. rcProgBar.left += rcCol1.left - 4;
  83. rcProgBar.right =  rcProgBar.left + rcCol1.Width() + 1;
  84. //计算编辑框的位置
  85. rcEditBox.left += rcCol2.left;
  86. rcEditBox.right =  rcEditBox.left + rcCol2.Width() - 1;
  87. //计算复选框的位置
  88. rcChkBox.left += rcCol3.left;
  89. rcChkBox.right =  rcChkBox.left + rcCol3.Width();
  90. //新建一行
  91. CListCtrlRow * pListRow = new CListCtrlRow;
  92. pListRow->SetRow(nItem);
  93. strTemp.Format("%s%d", "CheckBox", nItem + 1);
  94. //开始创建对应的控件,默认显示控件
  95. pListRow->CreateProgBar(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rcProgBar, this, IDC_LIST_CTRL + 10);
  96. pListRow->CreateEditBox(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, rcEditBox, this, IDC_LIST_CTRL + 11);
  97. pListRow->CreateChkBox(strTemp, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, rcChkBox, this, IDC_LIST_CTRL + 11);
  98. //放入数组,便于以后控制,比如隐藏、删除等
  99. m_vecListRow.push_back(pListRow);
  100. }
  101. /*hdr
  102. ** Copyright  ShangHai Skoito Lamp Ltd.,China
  103. **
  104. ** 函数名: ReleaseAll
  105. ** 作者: RobateWang
  106. ** 日期: 05 - 06 - 2010
  107. **
  108. ** 描述:
  109. ** 将所有创建的控件销毁,如果不销毁就造成内存泄露
  110. **
  111. **
  112. ** 变量: 变量名  方向 类型 描述
  113. **
  114. **
  115. ** 返回值:
  116. **
  117. **
  118. ** 备注:
  119. **
  120. */
  121. void
  122. CListCtrlEx::ReleaseAll()
  123. {
  124. VECLISTROW::iterator iterRow = m_vecListRow.begin();
  125. while (iterRow != m_vecListRow.end())
  126. {
  127. (*iterRow)->DestroyWindow();
  128. delete (*iterRow);
  129. (*iterRow) = NULL;
  130. iterRow++;
  131. }//while
  132. m_vecListRow.clear();
  133. }
  134. /*hdr
  135. ** Copyright  ShangHai Skoito Lamp Ltd.,China
  136. **
  137. ** 函数名: MovePosition
  138. ** 作者: RobateWang
  139. ** 日期: 05 - 06 - 2010
  140. **
  141. ** 描述:
  142. ** 将已经存在的控件移动到新位置
  143. **
  144. ** 变量: 变量名  方向 类型 描述
  145. **
  146. **
  147. ** 返回值:
  148. **
  149. **
  150. ** 备注:
  151. **
  152. */
  153. void
  154. CListCtrlEx::MovePosition()
  155. {
  156. int nTop = GetTopIndex();
  157. int nTotal = GetItemCount();
  158. int nPerPage = GetCountPerPage();
  159. int nLastItem = ((nTop + nPerPage) > nTotal) ? nTotal : nTop + nPerPage;
  160. CRect rcCol(0, 0, 0, 0);
  161. CRect rcProgBar(0, 0, 0, 0);
  162. CRect rcEditBox(0, 0, 0, 0);
  163. CRect rcChkBox(0, 0, 0, 0);
  164. VECLISTROW::iterator iterRow = m_vecListRow.begin();
  165. for (iterRow = m_vecListRow.begin(); iterRow != m_vecListRow.end(); iterRow++)
  166. {
  167. //移动第(*iterRow)->GetRow()行的进度条控件到新位置
  168. GetHeaderCtrl()->GetItemRect(1, &rcCol);
  169. GetItemRect((*iterRow)->GetRow(), &rcProgBar, LVIR_LABEL);
  170. rcProgBar.top += 1;
  171. rcProgBar.bottom -= 1;
  172. rcProgBar.left += rcCol.left - 4;
  173. rcProgBar.right =  rcProgBar.left + rcCol.Width() + 1;
  174. (*iterRow)->MoveProgressBar(&rcProgBar);
  175. //移动第(*iterRow)->GetRow()行的编辑框控件到新位置
  176. GetHeaderCtrl()->GetItemRect(2, &rcCol);
  177. GetItemRect((*iterRow)->GetRow(), &rcEditBox, LVIR_LABEL);
  178. rcEditBox.top += 1;
  179. rcEditBox.bottom -= 1;
  180. rcEditBox.left += rcCol.left - 2;
  181. rcEditBox.right =  rcEditBox.left + rcCol.Width();
  182. (*iterRow)->MoveEditBox(&rcEditBox);
  183. //移动第(*iterRow)->GetRow()行的复选框控件到新位置
  184. GetHeaderCtrl()->GetItemRect(3, &rcCol);
  185. GetItemRect((*iterRow)->GetRow(), &rcChkBox, LVIR_LABEL);
  186. rcChkBox.top += 1;
  187. rcChkBox.bottom -= 1;
  188. rcChkBox.left += rcCol.left;
  189. rcChkBox.right =  rcChkBox.left + rcCol.Width();
  190. (*iterRow)->MoveChkBox(&rcChkBox);
  191. }
  192. //刷新窗口
  193. Invalidate();
  194. }
  195. /*hdr
  196. ** Copyright  ShangHai Skoito Lamp Ltd.,China
  197. **
  198. ** 函数名: SetBarPosition
  199. ** 作者: RobateWang
  200. ** 日期: 05 - 06 - 2010
  201. **
  202. ** 描述:
  203. ** 设置进度条的位置,你可以根据实际需求来设计这个函数
  204. **
  205. ** 变量: 变量名  方向 类型 描述
  206. ** nPos 入参 int 进度条位置变量
  207. **
  208. ** 返回值:
  209. **
  210. **
  211. ** 备注:
  212. **
  213. */
  214. void
  215. CListCtrlEx::SetBarPosition(const int nPos)
  216. {
  217. VECLISTROW::iterator iterRow = m_vecListRow.begin();
  218. int nPosTemp = nPos;
  219. //设定所有的进度条位置
  220. for (iterRow = m_vecListRow.begin(); iterRow != m_vecListRow.end(); iterRow++)
  221. {
  222. ((*iterRow)->GetProgressBar())->SetPos(nPosTemp);
  223. nPosTemp += 2;
  224. if (nPosTemp >= 100)
  225. {
  226. nPosTemp = 0;
  227. }
  228. }
  229. }
  230. /*hdr
  231. ** Copyright  ShangHai Skoito Lamp Ltd.,China
  232. **
  233. ** 函数名: SetChkBox
  234. ** 作者: RobateWang
  235. ** 日期: 05 - 06 - 2010
  236. **
  237. ** 描述:
  238. ** 设置复选框的状态,执行后会改变当前的状态,
  239. **
  240. ** 变量: 变量名  方向 类型 描述
  241. **
  242. **
  243. ** 返回值:
  244. **
  245. **
  246. ** 备注:
  247. **
  248. */
  249. void
  250. CListCtrlEx::SetChkBox()
  251. {
  252. VECLISTROW::iterator iterRow = m_vecListRow.begin();
  253. int nChk = 0;
  254. for (iterRow = m_vecListRow.begin(); iterRow != m_vecListRow.end(); iterRow++)
  255. {
  256. if (BST_UNCHECKED == ((*iterRow)->GetChkBox())->GetCheck())
  257. {
  258. //如果非选中,则设置选中
  259. nChk = BST_CHECKED;
  260. }
  261. else
  262. {
  263. //如果选中,则设置非选中
  264. nChk = BST_UNCHECKED;
  265. }
  266. ((*iterRow)->GetChkBox())->SetCheck(nChk);
  267. }
  268. }
  269. /*hdr
  270. ** Copyright  ShangHai Skoito Lamp Ltd.,China
  271. **
  272. ** 函数名: SetEdtBox
  273. ** 作者: RobateWang
  274. ** 日期: 05 - 06 - 2010
  275. **
  276. ** 描述:
  277. ** 设置编辑框的内容,用户可根据实际需求来设计函数
  278. **
  279. ** 变量: 变量名  方向 类型 描述
  280. **
  281. **
  282. ** 返回值:
  283. **
  284. **
  285. ** 备注:
  286. **
  287. */
  288. void
  289. CListCtrlEx::SetEdtBox()
  290. {
  291. VECLISTROW::iterator iterRow = m_vecListRow.begin();
  292. CString sTemp = "";
  293. for (iterRow = m_vecListRow.begin(); iterRow != m_vecListRow.end(); iterRow++)
  294. {
  295. sTemp.Format("%s%d%s", "第", (*iterRow)->GetRow() + 1, "行");
  296. (*iterRow)->GetEdit()->SetWindowText(sTemp);
  297. }
  298. }