程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 在List Control中實現列表項目上下移動

在List Control中實現列表項目上下移動

編輯:關於VC++

前言

List Control是Visual C++的一個通用控件,在很多程序中都有對它的使用,比如Windows 2000任務管理器的進程顯示,就是一個報表樣式的List Control。有時候,我們編程不僅需要使用List Control來顯示數據,同時還希望能在控件中作一些簡單編輯,比如可以上下移動某個選定的列表項,這就是本文所要討論的內容。

介紹

本文的示例程序界面如圖一所示,移動列表項後的示例如圖二所示。

圖一

圖二

實現原理

要實現表項目的上下移動,思路其實很簡單。首先,我們要得到用戶所選列表項目的索引,這可以通過調用CListCtrl類的兩個成員函數GetFirstSelectedItemPosition( )和GetNextSelectedItem( POSITION& pos )來實現。

得到用戶所選列表項目的索引後,就好辦了,我們可以通過刪除項目,再添加項目的方法來達到移動列表項目的目的,假定在List Control中用戶選擇了第i+1項,由於List Control中項目的索引是從0開始的,那麼該項的索引值就是i,先用GetItemText( int nItem, int nSubItem )來得到索引為i的項目的各列文本,然後刪除該項,最後在索引為i-1的位置將我們剛才得到的文本作為新項目插進來,那麼用戶所選列表項就向上移動了一位,如果是在索引為i+1的位置插入新項目,那麼用戶所選列表項就向下移動了一位。

實現方法

新建一個基於對話框的工程,命名為LCDemo,然後在對話框中按照圖一所示添加一個List Control和兩個Button,設置List Control樣式為Report。為List Control關聯一個變量m_listCtrl,並通過ClassWizard為List Control和Button添加Click消息的響應函數。

先在OnInitDialog()函數中對控件初始化,就是為List Control添加列,並插入10行列表項目,詳細內容請參考附帶的源代碼,我只想列出主要的代碼片斷。

為對話框類定義一個整型變量IndexInFieldList,用它來存儲項目索引,把下面代碼粘貼到CLCDemoDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) 函數中。

void CLCDemoDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
  POSITION pos;
  pos = m_listCtrl.GetFirstSelectedItemPosition();

  // 得到項目索引
  IndexInFieldList = m_listCtrl.GetNextSelectedItem(pos);

  *pResult = 0;
}

在向上移動操作按鈕的WM_CLICK消息響應函數中寫入下面代碼。

void CLCDemoDlg::OnButtonUp()
{
  m_listCtrl.SetFocus();

  if (IndexInFieldList == -1)
   return;

  // 判斷所選項是否位於行首
  if (IndexInFieldList == 0)
  {
   AfxMessageBox("已經位於第一行!");
   return;
  }

  // 提取所選列表項各列類容
  CString tempField1, tempField2, tempField3;
  tempField1 = m_listCtrl.GetItemText(IndexInFieldList, 0);
  tempField2 = m_listCtrl.GetItemText(IndexInFieldList, 1);
  tempField3 = m_listCtrl.GetItemText(IndexInFieldList, 2);

  // 刪除所選列表項
  m_listCtrl.DeleteItem(IndexInFieldList);

  // 在IndexInFieldList-1位置處插入上面所刪列表項的各列類容
  int tempItem;
  tempItem = m_listCtrl.InsertItem(IndexInFieldList-1, _T(tempField1));
  m_listCtrl.SetItemText(tempItem, 1, _T(tempField2));
  m_listCtrl.SetItemText(tempItem, 2, _T(tempField3));
  IndexInFieldList--;

  // 使得IndexInFieldList-1位置處項目高亮顯示並獲得焦點
  UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
  m_listCtrl.SetItemState(IndexInFieldList, flag, flag);
}

向下移動操作按鈕的響應函數代碼與上面的代碼類似,請參考本文所附源代碼,因為代碼有相關中文注釋,這裡我就不再贅述了。

運行情況

具體的運行效果請編譯好附帶源代碼後執行。

本示例在Visual C++ 6.0 和 Window XP下編譯運行通過。

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