通常我們通過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));
}
}
實現了上面的代碼後,我們就可以在列表框中隨便改變我們的條目的順序了,趕快試一下吧!在例程中彈出關於對話框,在列表中就可以改變順序了。