MLISTCTL.CPP
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:
Windows编程
开发平台:
Visual C++
- // MyListCtrl.cpp : implementation file
- //
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
- #include "stdafx.h"
- #include "listhdr.h"
- #include "mlistctl.h"
- //#include "listcpg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CMyListCtrl
- CMyListCtrl::CMyListCtrl()
- {
- m_bDragging = FALSE;
- m_pimageListDrag = NULL;
- }
- CMyListCtrl::~CMyListCtrl()
- {
- }
- BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
- //{{AFX_MSG_MAP(CMyListCtrl)
- ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBeginDrag)
- ON_NOTIFY_REFLECT(LVN_BEGINRDRAG, OnBeginDrag)
- ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
- ON_WM_MOUSEMOVE()
- ON_WM_LBUTTONUP()
- ON_WM_RBUTTONUP()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CMyListCtrl message handlers
- void CMyListCtrl::OnBeginDrag(LPNMHDR pnmhdr, LRESULT *pResult)
- {
- CPoint ptItem, ptAction, ptImage;
- NM_LISTVIEW *pnmListView = (NM_LISTVIEW *)pnmhdr;
- ASSERT(!m_bDragging);
- m_bDragging = TRUE;
- m_iItemDrag = pnmListView->iItem;
- ptAction = pnmListView->ptAction;
- GetItemPosition(m_iItemDrag, &ptItem); // ptItem is relative to (0,0) and not the view origin
- GetOrigin(&m_ptOrigin);
- ASSERT(m_pimageListDrag == NULL);
- m_pimageListDrag = CreateDragImage(m_iItemDrag, &ptImage);
- m_sizeDelta = ptAction - ptImage; // difference between cursor pos and image pos
- m_ptHotSpot = ptAction - ptItem + m_ptOrigin; // calculate hotspot for the cursor
- m_pimageListDrag->DragShowNolock(TRUE); // lock updates and show drag image
- m_pimageListDrag->SetDragCursorImage(0, m_ptHotSpot); // define the hot spot for the new cursor image
- m_pimageListDrag->BeginDrag(0, CPoint(0, 0));
- ptAction -= m_sizeDelta;
- m_pimageListDrag->DragEnter(this, ptAction);
- m_pimageListDrag->DragMove(ptAction); // move image to overlap original icon
- SetCapture();
- }
- void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)
- {
- long lStyle;
- int iItem;
- LV_ITEM lvitem;
- lStyle = GetWindowLong(m_hWnd, GWL_STYLE);
- lStyle &= LVS_TYPEMASK; // drag will do different things in list and report mode
- if (m_bDragging)
- {
- ASSERT(m_pimageListDrag != NULL);
- m_pimageListDrag->DragMove(point - m_sizeDelta); // move the image
- if ((iItem = HitTest(point)) != -1)
- {
- m_iItemDrop = iItem;
- m_pimageListDrag->DragLeave(this); // unlock the window and hide drag image
- if (lStyle == LVS_REPORT || lStyle == LVS_LIST)
- {
- lvitem.iItem = iItem;
- lvitem.iSubItem = 0;
- lvitem.mask = LVIF_STATE;
- lvitem.stateMask = LVIS_DROPHILITED; // highlight the drop target
- SetItem(&lvitem);
- }
- point -= m_sizeDelta;
- m_pimageListDrag->DragEnter(this, point); // lock updates and show drag image
- }
- }
- CListCtrl::OnMouseMove(nFlags, point);
- }
- void CMyListCtrl::OnButtonUp(CPoint point)
- {
- if (m_bDragging) // end of the drag operation
- {
- long lStyle;
- CString cstr;
- lStyle = GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK;
- m_bDragging = FALSE;
- ASSERT(m_pimageListDrag != NULL);
- m_pimageListDrag->DragLeave(this);
- m_pimageListDrag->EndDrag();
- delete m_pimageListDrag;
- m_pimageListDrag = NULL;
- // The drop target's sub-item text is replaced by the dragged item's
- // main text
- if (lStyle == LVS_REPORT && m_iItemDrop != m_iItemDrag)
- {
- cstr = GetItemText(m_iItemDrag, 0);
- SetItemText(m_iItemDrop, 1, cstr);
- }
- //the character string "**" is added to the end of the drop target's main text
- if (lStyle == LVS_LIST && m_iItemDrop != m_iItemDrag)
- {
- cstr = GetItemText(m_iItemDrop, 0);
- cstr += _T("**");
- SetItemText(m_iItemDrop, 0, cstr);
- }
- // move the icon
- if (lStyle == LVS_ICON || lStyle == LVS_SMALLICON)
- {
- point -= m_ptHotSpot; // the icon should be drawn exactly where the image is
- point += m_ptOrigin;
- SetItemPosition(m_iItemDrag, point); // just move the dragged item
- }
- ::ReleaseCapture();
- }
- }
- void CMyListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
- {
- OnButtonUp(point);
- CListCtrl::OnLButtonUp(nFlags, point);
- }
- void CMyListCtrl::OnRButtonUp(UINT nFlags, CPoint point)
- {
- OnButtonUp(point);
- CListCtrl::OnRButtonUp(nFlags, point);
- }
- void CMyListCtrl::OnEndLabelEdit(LPNMHDR pnmhdr, LRESULT *pLResult)
- {
- LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pnmhdr;
- LV_ITEM *plvItem = &plvDispInfo->item;
- if (plvItem->pszText != NULL)
- SetItemText(plvItem->iItem, plvItem->iSubItem, plvItem->pszText);
- }