让ListBox控件支持拖动

原创 2001年08月03日 10:46:00
通常我们通过ListBox控件来显示我们的信息列表,然后我们可以通过鼠标来选择我们的条目信息,但VC中的ListBox控件是不支持拖动的。也许我们有时需要改变我们的列表顺序,已适应我们的要求,下面是实现的方法。

  设计思路:


  1. 如果通过鼠标左键选中某一条目并拖动,此时我们通过变量记录当前选中条目的位置和条目字符串以及此条目的副值。

  2. 鼠标移动到要移动到的位置后放开左键,此时我们把以前选中的条目插入到此处,同时,删掉原位置的条目。

  实现步骤:

  1. 定义一个从ClistBox类扩展的类CMyListBox,代码下面分析。

  2. 通过新类定义我们的列表控件变量。

  代码分析:


// MyListBox.h : header file
//
// CMyListBox window

class CMyListBox : public CListBox
{
 // Construction
 public:
 CMyListBox();

 // Attributes
 private:
  BOOL m_LButtonDownFlag;
  BOOL m_MouseMoveFlag;
  int m_OldPosition;
  int m_NewPosition;
  CString m_DragString;
  DWORD m_ItemData;
 public:

  // Operations
 public:

  // Overrides
  // ClassWizard generated virtual function overrides
  file://{{AFX_VIRTUAL(CMyListBox)
file://}}AFX_VIRTUAL

 // Implementation
 public:
  virtual ~CMyListBox();

  // Generated message map functions
 protected:
  file://{{AFX_MSG(CMyListBox)
  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  // NOTE - the ClassWizard will add and remove member functions here.
file://}}AFX_MSG

 DECLARE_MESSAGE_MAP()
};

file://{{AFX_INSERT_LOCATION}}

 #endif //  !defined(AFX_MYLISTBOX_H__CF3EDAA5_BBD7_43CD_80CB_A86B65D9A607__INCLUDED_)


 // MyListBox.cpp : implementation file
 file://

 #include "stdafx.h"
 #include "sditest.h"
 #include "MyListBox.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
 #undef THIS_FILE
 static char THIS_FILE[] = __FILE__;
 #endif

 // CMyListBox

 CMyListBox::CMyListBox()
  {
   m_LButtonDownFlag = FALSE;
   m_MouseMoveFlag = FALSE;
  }

 CMyListBox::~CMyListBox()
  {
 }


 BEGIN_MESSAGE_MAP(CMyListBox, CListBox)
 file://{{AFX_MSG_MAP(CMyListBox)
 ON_WM_LBUTTONDOWN()
 ON_WM_LBUTTONUP()
 ON_WM_MOUSEMOVE()
 // NOTE - the ClassWizard will add and remove mapping macros here.
 file://}}AFX_MSG_MAP
END_MESSAGE_MAP()

 // CMyListBox message handlers
 void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
  {
   CListBox::OnLButtonDown(nFlags, point);
   file://如果选中一个条目,此时进行处理,否则会出错。
  if(GetCurSel() != -1)
   m_LButtonDownFlag = TRUE;
  }

 void CMyListBox::OnLButtonUp(UINT nFlags, CPoint point)
  {
   CListBox::OnLButtonUp(nFlags, point);
   m_LButtonDownFlag = FALSE;
   if(m_MouseMoveFlag)
   {
    m_MouseMoveFlag = FALSE;
    POINT pt;
    ::GetCursorPos(&pt);
    CRect iRect;
    this->GetWindowRect(iRect);
    if(iRect.PtInRect(pt))//确定鼠标移动到了合适的位置
    {
     m_NewPosition = GetCurSel();
     if(m_NewPosition < m_OldPosition)
     {
      InsertString(m_NewPosition,m_DragString);
      DeleteString(m_OldPosition+1);
      this->SetCurSel(m_NewPosition);
      file://设置移动条目的副值,如果删除或者添加一条记录,副值会随字符串一起移动
      SetItemData(m_NewPosition,m_ItemData);
      TRACE("%d%d%d%d%d%d%d%d",GetItemData(0),GetItemData(1),_
GetItemData(2),GetItemData(3),GetItemData(4),_
GetItemData(5),GetItemData(6),GetItemData(7));
}
     else
      {
       InsertString(m_NewPosition+1,m_DragString);
       DeleteString(m_OldPosition);
       this->SetCurSel(m_NewPosition);
       SetItemData(m_NewPosition,m_ItemData);
       TRACE("%d%d%d%d%d%d%d%d",GetItemData(0),GetItemData(1),_
GetItemData(2),GetItemData(3),GetItemData(4),_
GetItemData(5),GetItemData(6),GetItemData(7));
}
     }
   }

  }

  void CMyListBox::OnMouseMove(UINT nFlags, CPoint point)
   {
    CListBox::OnMouseMove(nFlags, point);
    if(m_LButtonDownFlag)
    {
     m_MouseMoveFlag = TRUE;
     m_OldPosition = GetCurSel();
     GetText(m_OldPosition,m_DragString);
     try{
      m_ItemData = GetItemData(m_OldPosition);
     }
    catch(...)
    {
     AfxMessageBox("Wrong!");
    }

    m_LButtonDownFlag = FALSE;
    SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
   }
  }

  实现了上面的代码后,我们就可以在列表框中随便改变我们的条目的顺序了,赶快试一下吧!在例程中弹出关于对话框,在列表中就可以改变顺序了。

ListBox实现拖拽排序功能

  • 2013年10月10日 01:35
  • 71KB
  • 下载

listbox之间拖拽,listbox内元素拖拽排序

  • 2015年05月18日 11:51
  • 87KB
  • 下载

C#鼠标拖动ListBox中的数据进行排序操作

  • 2013年08月24日 11:50
  • 39KB
  • 下载

wpf ListBox拖动排序实现

XAML:
  • leolinsheng
  • leolinsheng
  • 2016年04月09日 20:45
  • 1576

listbox控件用法详解

1. 属性列表:     SelectionMode    组件中条目的选择类型,即多选(Multiple)、单选(Single)     Rows             列表框中显示总共多少行 ...
  • SMF0504
  • SMF0504
  • 2016年06月27日 12:33
  • 16768

MFC控件:listbox控件用法详解

获取选中项的字符串: CString strText; int nIndex = m_listbox.GetCurSel(); m_listbox.GetTex...
  • ccx_john
  • ccx_john
  • 2013年09月15日 10:27
  • 5264

WPF之DragDrop拖放实例

【问题】            在winform或wpf开发中,常会用到DragDrop拖放功能,如拖拽一个文件到程序窗体,则在文本控件上显示文件的路径,其他内容控件显示文件内容,这样省去输入文件路...
  • dyllove98
  • dyllove98
  • 2013年06月10日 10:39
  • 10342

C++ LISTBOX控件常见用法(转)

1. 属性列表:     SelectionMode    组件中条目的选择类型,即多选(Multiple)、单选(Single)     Rows             列表框中显示总共多少行...
  • u012425536
  • u012425536
  • 2014年03月10日 08:54
  • 2080

WPF - ListBox显示任意内容

WFP是非常强大的。ListBox是一个很常用的控件,看了一下它的items属性,定义如下: public ItemCollection Items { get; } 这是一个collection...
  • zj510
  • zj510
  • 2013年03月02日 11:58
  • 5955

MFC自绘ListBox可根据条件定义不同行字体颜色

MFC自绘ListBox可根据条件定义不同行字体颜色头文件#if!defined(AFX_MULITLINELISTBOX_H__D705CB99_9FD0_424E_BD71_027547449AE...
  • u010143011
  • u010143011
  • 2015年04月29日 13:41
  • 1423
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让ListBox控件支持拖动
举报原因:
原因补充:

(最多只允许输入30个字)