MLISTCTL.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // MyListCtrl.cpp : implementation file
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "listhdr.h"
  14. #include "mlistctl.h"
  15. //#include "listcpg.h"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CMyListCtrl
  23. CMyListCtrl::CMyListCtrl()
  24. {
  25. m_bDragging = FALSE;
  26. m_pimageListDrag = NULL;
  27. }
  28. CMyListCtrl::~CMyListCtrl()
  29. {
  30. }
  31. BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
  32. //{{AFX_MSG_MAP(CMyListCtrl)
  33. ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBeginDrag)
  34. ON_NOTIFY_REFLECT(LVN_BEGINRDRAG, OnBeginDrag)
  35. ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
  36. ON_WM_MOUSEMOVE()
  37. ON_WM_LBUTTONUP()
  38. ON_WM_RBUTTONUP()
  39. //}}AFX_MSG_MAP
  40. END_MESSAGE_MAP()
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CMyListCtrl message handlers
  43. void CMyListCtrl::OnBeginDrag(LPNMHDR pnmhdr, LRESULT *pResult)
  44. {
  45. CPoint          ptItem, ptAction, ptImage;
  46. NM_LISTVIEW     *pnmListView = (NM_LISTVIEW *)pnmhdr;
  47. ASSERT(!m_bDragging);
  48. m_bDragging = TRUE;
  49. m_iItemDrag = pnmListView->iItem;
  50. ptAction = pnmListView->ptAction;
  51. GetItemPosition(m_iItemDrag, &ptItem);  // ptItem is relative to (0,0) and not the view origin
  52. GetOrigin(&m_ptOrigin);
  53. ASSERT(m_pimageListDrag == NULL);
  54. m_pimageListDrag = CreateDragImage(m_iItemDrag, &ptImage);
  55. m_sizeDelta = ptAction - ptImage;   // difference between cursor pos and image pos
  56. m_ptHotSpot = ptAction - ptItem + m_ptOrigin;  // calculate hotspot for the cursor
  57. m_pimageListDrag->DragShowNolock(TRUE);  // lock updates and show drag image
  58. m_pimageListDrag->SetDragCursorImage(0, m_ptHotSpot);  // define the hot spot for the new cursor image
  59. m_pimageListDrag->BeginDrag(0, CPoint(0, 0));
  60. ptAction -= m_sizeDelta;
  61. m_pimageListDrag->DragEnter(this, ptAction);
  62. m_pimageListDrag->DragMove(ptAction);  // move image to overlap original icon
  63. SetCapture();
  64. }
  65. void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)
  66. {
  67. long        lStyle;
  68. int         iItem;
  69. LV_ITEM     lvitem;
  70. lStyle = GetWindowLong(m_hWnd, GWL_STYLE);
  71. lStyle &= LVS_TYPEMASK;  // drag will do different things in list and report mode
  72. if (m_bDragging)
  73. {
  74. ASSERT(m_pimageListDrag != NULL);
  75. m_pimageListDrag->DragMove(point - m_sizeDelta);  // move the image
  76. if ((iItem = HitTest(point)) != -1)
  77. {
  78. m_iItemDrop = iItem;
  79. m_pimageListDrag->DragLeave(this); // unlock the window and hide drag image
  80. if (lStyle == LVS_REPORT || lStyle == LVS_LIST)
  81. {
  82. lvitem.iItem = iItem;
  83. lvitem.iSubItem = 0;
  84. lvitem.mask = LVIF_STATE;
  85. lvitem.stateMask = LVIS_DROPHILITED;  // highlight the drop target
  86. SetItem(&lvitem);
  87. }
  88. point -= m_sizeDelta;
  89. m_pimageListDrag->DragEnter(this, point);  // lock updates and show drag image
  90. }
  91. }
  92. CListCtrl::OnMouseMove(nFlags, point);
  93. }
  94. void CMyListCtrl::OnButtonUp(CPoint point)
  95. {
  96. if (m_bDragging)  // end of the drag operation
  97. {
  98. long        lStyle;
  99. CString     cstr;
  100. lStyle = GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK;
  101. m_bDragging = FALSE;
  102. ASSERT(m_pimageListDrag != NULL);
  103. m_pimageListDrag->DragLeave(this);
  104. m_pimageListDrag->EndDrag();
  105. delete m_pimageListDrag;
  106. m_pimageListDrag = NULL;
  107. // The drop target's sub-item text is replaced by the dragged item's
  108. // main text
  109. if (lStyle == LVS_REPORT && m_iItemDrop != m_iItemDrag)
  110. {
  111. cstr = GetItemText(m_iItemDrag, 0);
  112. SetItemText(m_iItemDrop, 1, cstr);
  113. }
  114. //the character string "**" is added to the end of the drop target's main text
  115. if (lStyle == LVS_LIST && m_iItemDrop != m_iItemDrag)
  116. {
  117. cstr = GetItemText(m_iItemDrop, 0);
  118. cstr += _T("**");
  119. SetItemText(m_iItemDrop, 0, cstr);
  120. }
  121.   // move the icon
  122. if (lStyle == LVS_ICON || lStyle == LVS_SMALLICON)
  123. {
  124. point -= m_ptHotSpot;  // the icon should be drawn exactly where the image is
  125. point += m_ptOrigin;
  126. SetItemPosition(m_iItemDrag, point);  // just move the dragged item
  127. }
  128. ::ReleaseCapture();
  129. }
  130. }
  131. void CMyListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  132. {
  133. OnButtonUp(point);
  134. CListCtrl::OnLButtonUp(nFlags, point);
  135. }
  136. void CMyListCtrl::OnRButtonUp(UINT nFlags, CPoint point)
  137. {
  138. OnButtonUp(point);
  139. CListCtrl::OnRButtonUp(nFlags, point);
  140. }
  141. void CMyListCtrl::OnEndLabelEdit(LPNMHDR pnmhdr, LRESULT *pLResult)
  142. {
  143. LV_DISPINFO  *plvDispInfo = (LV_DISPINFO *)pnmhdr;
  144. LV_ITEM      *plvItem = &plvDispInfo->item;
  145. if (plvItem->pszText != NULL)
  146. SetItemText(plvItem->iItem, plvItem->iSubItem, plvItem->pszText);
  147. }