在List Control中實現列表專案的上下移動

2021-04-15 06:04:22 字數 2438 閱讀 8978

一、前言

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);

MFC中ListControl控制項的使用

以下未經說明,listctrl預設view 風格為report lvs icon 為每個item顯示大圖示 lvs smallicon 為每個item顯示小圖示 lvs list 顯示一列帶有小圖示的item lvs report 顯示item詳細資料 直觀的理解 windows資源管理器,檢視 標...

MFC中ListControl控制項的使用

以下未經說明,listctrl預設view 風格為report lvs icon 為每個item顯示大圖示 lvs smallicon 為每個item顯示小圖示 lvs list 顯示一列帶有小圖示的item lvs report 顯示item詳細資料 直觀的理解 windows資源管理器,檢視 標...

MFC中ListControl控制項的使用

以下未經說明,listctrl預設view 風格為report lvs icon 為每個item顯示大圖示 lvs smallicon 為每個item顯示小圖示 lvs list 顯示一列帶有小圖示的item lvs report 顯示item詳細資料 直觀的理解 windows資源管理器,檢視 標...