程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 讓ListBox控件支持拖動

讓ListBox控件支持拖動

編輯:vc教程

  通常我們通過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));
   }
  }
 

  實現了上面的代碼後,我們就可以在列表框中隨便改變我們的條目的順序了,趕快試一下吧!在例程中彈出關於對話框,在列表中就可以改變順序了。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved