让ListBox控件支持拖动

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

  设计思路:


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

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

  实现步骤:

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

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

  代码分析:

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

None.gif
class  CMyListBox :  public  CListBox
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif 
// Construction
InBlock.gif
 public:
InBlock.gif CMyListBox();
InBlock.gif
InBlock.gif 
// Attributes
InBlock.gif
 private:
InBlock.gif  BOOL m_LButtonDownFlag;
InBlock.gif  BOOL m_MouseMoveFlag;
InBlock.gif  
int m_OldPosition;
InBlock.gif  
int m_NewPosition;
InBlock.gif  CString m_DragString;
InBlock.gif  DWORD m_ItemData;
InBlock.gif 
public:
InBlock.gif
InBlock.gif  
// Operations
InBlock.gif
 public:
InBlock.gif
InBlock.gif  
// Overrides
InBlock.gif  
// ClassWizard generated virtual function overrides
InBlock.gif
  file://{{AFX_VIRTUAL(CMyListBox)
InBlock.gif
file://}}AFX_VIRTUAL
InBlock.gif
InBlock.gif 
// Implementation
InBlock.gif
 public:
InBlock.gif  
virtual ~CMyListBox();
InBlock.gif
InBlock.gif  
// Generated message map functions
InBlock.gif
 protected:
InBlock.gif  file:
//{{AFX_MSG(CMyListBox)
InBlock.gif
  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
InBlock.gif  afx_msg 
void OnLButtonUp(UINT nFlags, CPoint point);
InBlock.gif  afx_msg 
void OnMouseMove(UINT nFlags, CPoint point);
InBlock.gif  
// NOTE - the ClassWizard will add and remove member functions here.
InBlock.gif
file://}}AFX_MSG
InBlock.gif

InBlock.gif DECLARE_MESSAGE_MAP()
ExpandedBlockEnd.gif}
;
None.gif
None.giffile:
// {{AFX_INSERT_LOCATI 
None.gif
ON}}
None.gif
None.gif 
#endif   //   !defined(AFX_MYLISTBOX_H__CF3EDAA5_BBD7_43CD_80CB_A86B65D9A607__INCLUDED_)
None.gif
None.gif
None.gif 
//  MyListBox.cpp : implementation file
None.gif
 file: //
None.gif

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

None.gif CMyListBox::CMyListBox()
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif   m_LButtonDownFlag 
= FALSE;
InBlock.gif   m_MouseMoveFlag 
= FALSE;
ExpandedBlockEnd.gif  }

None.gif
None.gif CMyListBox::
~ CMyListBox()
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
ExpandedBlockEnd.gif }

None.gif
None.gif
None.gif BEGIN_MESSAGE_MAP(CMyListBox, CListBox)
None.gif file:
// {{AFX_MSG_MAP(CMyListBox)
None.gif
 ON_WM_LBUTTONDOWN()
None.gif ON_WM_LBUTTONUP()
None.gif ON_WM_MOUSEMOVE()
None.gif 
//  NOTE - the ClassWizard will add and remove mapping macros here.
None.gif
 file: // }}AFX_MSG_MAP
None.gif
END_MESSAGE_MAP()
None.gif
None.gif 
//  CMyListBox message handlers
None.gif
  void  CMyListBox::OnLButtonDown(UINT nFlags, CPoint point) 
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif   CListBox::OnLButtonDown(nFlags, point);
InBlock.gif   file:
//如果选中一个条目,此时进行处理,否则会出错。
InBlock.gif
  if(GetCurSel() != -1)
InBlock.gif   m_LButtonDownFlag 
= TRUE;
ExpandedBlockEnd.gif  }

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

InBlock.gif     
else
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif       InsertString(m_NewPosition
+1,m_DragString);
InBlock.gif       DeleteString(m_OldPosition);
InBlock.gif       
this->SetCurSel(m_NewPosition);
InBlock.gif       SetItemData(m_NewPosition,m_ItemData);
InBlock.gif       TRACE(
"%d%d%d%d%d%d%d%d",GetItemData(0),GetItemData(1),_
InBlock.gifGetItemData(
2),GetItemData(3),GetItemData(4),_
InBlock.gifGetItemData(
5),GetItemData(6),GetItemData(7));
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif     }

ExpandedSubBlockEnd.gif   }

InBlock.gif
ExpandedBlockEnd.gif  }

None.gif
None.gif  
void  CMyListBox::OnMouseMove(UINT nFlags, CPoint point) 
ExpandedBlockStart.gifContractedBlock.gif   
dot.gif {
InBlock.gif    CListBox::OnMouseMove(nFlags, point);
InBlock.gif    
if(m_LButtonDownFlag)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif     m_MouseMoveFlag 
= TRUE;
InBlock.gif     m_OldPosition 
= GetCurSel();
InBlock.gif     GetText(m_OldPosition,m_DragString);
ExpandedSubBlockStart.gifContractedSubBlock.gif     
trydot.gif{
InBlock.gif      m_ItemData 
= GetItemData(m_OldPosition);
ExpandedSubBlockEnd.gif     }

InBlock.gif    
catch(dot.gif)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif     AfxMessageBox(
"Wrong!");
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    m_LButtonDownFlag 
= FALSE;
InBlock.gif    SetCursor(AfxGetApp()
->LoadCursor(IDC_CURSOR1));
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif  }

None.gif

转载于:https://www.cnblogs.com/zhangyin/archive/2007/01/17/622162.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值