ListCtrlEx.cpp
上传用户:twainx
上传日期:2007-01-02
资源大小:4k
文件大小:8k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. // ListCtrlEx.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ListCtrlEx.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CListCtrlEx
  12. BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
  13. //{{AFX_MSG_MAP(CListCtrlEx)
  14. //}}AFX_MSG_MAP
  15. END_MESSAGE_MAP()
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CListCtrlEx message handlers
  18. int CListCtrlEx::AddItem(LPCTSTR strItem, int nItem, int nSubItem, UINT nState, int nImageIndex, long nParam)
  19. {
  20. LVITEM lvItem;
  21. lvItem.mask = LVIF_TEXT;
  22. lvItem.iItem = nItem;
  23. lvItem.iSubItem = nSubItem;
  24. lvItem.pszText = (LPTSTR)strItem;
  25. if (nState != -1)
  26. {
  27. lvItem.mask |= LVIF_STATE;
  28. lvItem.state = nState;
  29. }
  30. if (nImageIndex != -1)
  31. {
  32. lvItem.mask |= LVIF_IMAGE;
  33. lvItem.iImage = nImageIndex;
  34. }
  35. if (nParam != -1)
  36. {
  37. lvItem.mask |= LVIF_PARAM;
  38. lvItem.lParam = nParam;
  39. }
  40. if (nSubItem == 0)
  41. return InsertItem(&lvItem);
  42. else
  43. return SetItem(&lvItem);
  44. }
  45. DWORD CListCtrlEx::GetViewStyle() const
  46. {
  47. ASSERT(::IsWindow(m_hWnd));
  48. return (DWORD) (::GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK);
  49. }
  50. DWORD CListCtrlEx::SetViewStyle(DWORD dwNewView)
  51. {
  52. ASSERT(::IsWindow(m_hWnd));
  53. return (DWORD) (::SetWindowLong(m_hWnd, GWL_STYLE, (::GetWindowLong(m_hWnd, GWL_STYLE) & ~LVS_TYPEMASK) | dwNewView) & LVS_TYPEMASK);
  54. }
  55. // Available with IE4 Dll => commctl.dll v4.71.1712.3
  56. #ifndef NOLISTVIEWEX
  57. POSITION CListCtrlEx::GetFirstSelectedItemPosition() const
  58. {
  59. ASSERT(::IsWindow(m_hWnd));
  60. return (POSITION)(1+GetNextItem(-1, LVIS_SELECTED));
  61. }
  62. int CListCtrlEx::GetNextSelectedItem(POSITION& pos) const
  63. {
  64. ASSERT(::IsWindow(m_hWnd));
  65. int nReturn = (int)pos-1;
  66. pos = (POSITION)(1+GetNextItem(nReturn, LVIS_SELECTED));
  67. return nReturn;
  68. }
  69. BOOL CListCtrlEx::GetColumnOrderArray(LPINT pnArray, int nCount) const
  70. {
  71. ASSERT(::IsWindow(m_hWnd));
  72. if (nCount == -1)
  73. {
  74. CHeaderCtrl* pHeader = GetHeaderCtrl();
  75. if (pHeader != NULL)
  76. nCount = pHeader->GetItemCount();
  77. }
  78. if (nCount == -1)
  79. return FALSE;
  80. ASSERT(AfxIsValidAddress(pnArray, nCount * sizeof(int)));
  81. return (BOOL) ::SendMessage(m_hWnd, LVM_GETCOLUMNORDERARRAY, (WPARAM)nCount, (LPARAM)pnArray);
  82. }
  83. BOOL CListCtrlEx::SetColumnOrderArray(int nCount, LPINT pnArray)
  84. {
  85. ASSERT(::IsWindow(m_hWnd));
  86. ASSERT(AfxIsValidAddress(pnArray, nCount * sizeof(int), FALSE));
  87. return (BOOL) ::SendMessage(m_hWnd, LVM_SETCOLUMNORDERARRAY, (WPARAM)nCount, (LPARAM)pnArray);
  88. }
  89. CSize CListCtrlEx::SetIconSpacing(CSize size)
  90. {
  91. ASSERT(::IsWindow(m_hWnd));
  92. return CSize((DWORD) ::SendMessage(m_hWnd, LVM_SETICONSPACING, 0, MAKELPARAM(size.cx, size.cy)));
  93. }
  94. CSize CListCtrlEx::SetIconSpacing(int cx, int cy)
  95. {
  96. ASSERT(::IsWindow(m_hWnd));
  97. return CSize((DWORD) ::SendMessage(m_hWnd, LVM_SETICONSPACING, 0, MAKELPARAM(cx, cy)));
  98. }
  99. CHeaderCtrl* CListCtrlEx::GetHeaderCtrl() const
  100. {
  101. ASSERT(::IsWindow(m_hWnd));
  102. HWND hWnd = (HWND) ::SendMessage(m_hWnd, LVM_GETHEADER, 0, 0L);
  103. if (hWnd == NULL)
  104. return NULL;
  105. else
  106. return (CHeaderCtrl*) CHeaderCtrl::FromHandle(hWnd);
  107. }
  108. HCURSOR CListCtrlEx::GetHotCursor() const
  109. {
  110. ASSERT(::IsWindow(m_hWnd));
  111. return (HCURSOR) ::SendMessage(m_hWnd, LVM_GETHOTCURSOR, 0, 0L);
  112. }
  113. HCURSOR CListCtrlEx::SetHotCursor(HCURSOR hc)
  114. {
  115. ASSERT(::IsWindow(m_hWnd) && hc != NULL);
  116. return (HCURSOR) ::SendMessage(m_hWnd, LVM_SETHOTCURSOR, 0, (LPARAM)hc);
  117. }
  118. BOOL CListCtrlEx::GetSubItemRect(int nItem, int nSubItem, int nArea, CRect & rcRef) const
  119. {
  120. ASSERT(::IsWindow(m_hWnd));
  121. ASSERT(nArea == LVIR_BOUNDS || nArea == LVIR_ICON || nArea == LVIR_LABEL);
  122. RECT rect;
  123. rect.top = nSubItem;
  124. rect.left = nArea;
  125. BOOL bReturn = (BOOL) ::SendMessage(m_hWnd, LVM_GETSUBITEMRECT, nItem, (LPARAM) &rect);
  126. if (bReturn)
  127. rcRef = rect;
  128. return bReturn;
  129. }
  130. int CListCtrlEx::GetHotItem() const
  131. {
  132. ASSERT(::IsWindow(m_hWnd));
  133. return (int) ::SendMessage(m_hWnd, LVM_GETHOTITEM, 0, 0L);
  134. }
  135. int CListCtrlEx::SetHotItem(int nIndex)
  136. {
  137. ASSERT(::IsWindow(m_hWnd));
  138. return (int) ::SendMessage(m_hWnd, LVM_SETHOTITEM, (WPARAM)nIndex, 0L);
  139. }
  140. int CListCtrlEx::GetSelectionMark() const
  141. {
  142. ASSERT(::IsWindow(m_hWnd));
  143. return (int) ::SendMessage(m_hWnd, LVM_GETSELECTIONMARK, 0, 0L);
  144. }
  145. int CListCtrlEx::SetSelectionMark(int nIndex)
  146. {
  147. ASSERT(::IsWindow(m_hWnd));
  148. return (int) ::SendMessage(m_hWnd, LVM_SETSELECTIONMARK, 0, (LPARAM)nIndex);
  149. }
  150. DWORD CListCtrlEx::GetExtendedStyle() const
  151. ASSERT(::IsWindow(m_hWnd)); 
  152. return (DWORD) ::SendMessage(m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0L);
  153. }
  154. DWORD CListCtrlEx::SetExtendedStyle(DWORD dwNewStyle)
  155. {
  156. ASSERT(::IsWindow(m_hWnd));
  157. return (DWORD) ::SendMessage(m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)dwNewStyle);
  158. }
  159. int CListCtrlEx::SubItemHitTest(LPLVHITTESTINFO lpInfo)
  160. {
  161. ASSERT(::IsWindow(m_hWnd));
  162. return (int) ::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, 0, (LPARAM)lpInfo);
  163. }
  164. UINT CListCtrlEx::GetNumberOfWorkAreas() const
  165. {
  166. ASSERT(::IsWindow(m_hWnd));
  167. UINT nWorkAreas;
  168. ::SendMessage(m_hWnd, LVM_GETNUMBEROFWORKAREAS, 0, (LPARAM)&nWorkAreas);
  169. return nWorkAreas;
  170. }
  171. void CListCtrlEx::GetWorkAreas(int nWorkAreas, LPRECT lpRect) const
  172. {
  173. ASSERT(::IsWindow(m_hWnd));
  174. ::SendMessage(m_hWnd, LVM_GETWORKAREAS, (WPARAM)nWorkAreas, (LPARAM)lpRect);
  175. }
  176. void CListCtrlEx::SetWorkAreas(int nWorkAreas, LPRECT lpRect)
  177. {
  178. ASSERT(::IsWindow(m_hWnd));
  179. ::SendMessage(m_hWnd, LVM_SETWORKAREAS, (WPARAM)nWorkAreas, (LPARAM)lpRect);
  180. }
  181. BOOL CListCtrlEx::SetItemCountEx(int iCount, DWORD dwFlags)
  182. {
  183. ASSERT(::IsWindow(m_hWnd));
  184. ASSERT((GetStyle() & LVS_OWNERDATA));
  185. return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMCOUNT, (WPARAM)iCount, (LPARAM)dwFlags);
  186. }
  187. CSize CListCtrlEx::ApproximateViewRect(CSize size, int nCount) const
  188. {
  189. ASSERT(::IsWindow(m_hWnd));
  190. return CSize((DWORD) ::SendMessage(m_hWnd, LVM_APPROXIMATEVIEWRECT, nCount, MAKELPARAM(size.cx, size.cy)));
  191. }
  192. BOOL CListCtrlEx::GetBkImage(LVBKIMAGE* plvbkImage) const
  193. {
  194. ASSERT(::IsWindow(m_hWnd));
  195. return (BOOL) ::SendMessage(m_hWnd, LVM_GETBKIMAGE, 0, (LPARAM)plvbkImage);
  196. }
  197. BOOL CListCtrlEx::SetBkImage(HBITMAP hbm, BOOL bTile, int xOffsetPercent, int yOffsetPercent)
  198. {
  199. LVBKIMAGE lv;
  200. lv.ulFlags = LVBKIF_SOURCE_HBITMAP;
  201. lv.ulFlags |= (bTile) ? LVBKIF_STYLE_TILE : LVBKIF_STYLE_NORMAL;
  202. lv.hbm = hbm;
  203. lv.xOffsetPercent = xOffsetPercent;
  204. lv.yOffsetPercent = yOffsetPercent;
  205. return SetBkImage(&lv);
  206. }
  207. BOOL CListCtrlEx::SetBkImage(LPTSTR pszUrl, BOOL bTile, int xOffsetPercent, int yOffsetPercent)
  208. {
  209. LVBKIMAGE lv;
  210. lv.ulFlags = LVBKIF_SOURCE_HBITMAP;
  211. lv.ulFlags |= (bTile) ? LVBKIF_STYLE_TILE : LVBKIF_STYLE_NORMAL;
  212. lv.pszImage = pszUrl;
  213. lv.xOffsetPercent = xOffsetPercent;
  214. lv.yOffsetPercent = yOffsetPercent;
  215. return SetBkImage(&lv);
  216. }
  217. BOOL CListCtrlEx::SetBkImage(LVBKIMAGE* plvbkImage)
  218. {
  219. ASSERT(::IsWindow(m_hWnd));
  220. return (BOOL) ::SendMessage(m_hWnd, LVM_SETBKIMAGE, 0, (LPARAM)plvbkImage);
  221. }
  222. DWORD CListCtrlEx::GetHoverTime() const
  223. {
  224. ASSERT(::IsWindow(m_hWnd));
  225. return (DWORD) ::SendMessage(m_hWnd, LVM_GETHOVERTIME, 0, 0L);
  226. }
  227. DWORD CListCtrlEx::SetHoverTime(DWORD dwHoverTime)
  228. {
  229. ASSERT(::IsWindow(m_hWnd));
  230. return (DWORD) ::SendMessage(m_hWnd, LVM_SETHOVERTIME, 0, (LPARAM)dwHoverTime);
  231. }
  232. BOOL CListCtrlEx::GetCheck(int nItem) const
  233. {
  234. ASSERT(::IsWindow(m_hWnd));
  235. int nState = (int) ::SendMessage(m_hWnd, LVM_GETITEMSTATE, (WPARAM)nItem, (LPARAM)LVIS_STATEIMAGEMASK);
  236. return ((BOOL)(nState >> 12) -1);
  237. }
  238. BOOL CListCtrlEx::SetCheck(int nItem, BOOL bCheck)
  239. {
  240. ASSERT(::IsWindow(m_hWnd));
  241. LVITEM lvi;
  242. lvi.stateMask = LVIS_STATEIMAGEMASK;
  243. lvi.state = INDEXTOSTATEIMAGEMASK((bCheck ? 2 : 1));
  244. return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)&lvi);
  245. }
  246. #endif // NOLISTVIEWEX