這是一個可以自由選擇多個子項的列表控件。由於項目需要,使用了 CSortListCtrl 這個類,從“VC知識庫” 網站下載的源碼。我的項目中主要用到該類可方便變化 ITEM 顏色的優點。但是我項目中還要求可以通過鼠標拖動來選擇多項,注意不是整行整行的選擇,而是自由地選擇。所以我把自己如何實現用鼠標拖動來選擇多項 SubItem 的方法貼出來:主要思路:在 CSortListCtrl 類的 OnMouseMove 消息中處理,先判斷鼠標左鍵是否按下,如果按下(這種狀態其實就是鼠標的 Drag 狀態),就獲取鼠標目前所在的行號和列號,然後設置該行號和列號的顏色不同於一般情況下的顏色,以標識為被選中狀態;同時把行號和列號存儲起來用於後面的操作。
代碼如下:
.h文件中:定義了兩個變量用來存儲選中的行和列
CUIntArray ITEM; //用於選中行號的集合
CUIntArray SUBITEM; //用於選中列號的集合
.cpp文件中的代碼:
// TODO: 拖動鼠標消息處理函數
if(nFlags == MK_LBUTTON)
{
LVHITTESTINFO hitTestInfo;
hitTestInfo.pt = point;
this->SubItemHitTest(&hitTestInfo);
this->SetItemColor(hitTestInfo.iItem,hitTestInfo.iSubItem,RGB(255,255,255),RGB(50,50,50));
for(int i=0;i < ITEM.GetCount();i++) //避免存儲重復的SubItem。
{
if(hitTestInfo.iItem==ITEM.GetAt(i)&&hitTestInfo.iSubItem==SUBITEM.GetAt(i))
{
return;
}
this->ITEM.Add(hitTestInfo.iItem); //把選中的行號和列號一一對應的存入數組中
this->SUBITEM.Add(hitTestInfo.iSubItem);
}
}
CListCtrl::OnMouseMove(nFlags, point);
下面兩個消息處理函數:“開始拖動”和“單擊”是為了解決重新拖動以及單擊時清除前一次拖動所做的選擇
void CSortListCtrl::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
// TODO: 開始拖動鼠標消息處理函數
this->SetItemState(pNMLV->iItem,0,LVIS_SELECTED); //取消當前被選中行的選中狀態
//清空前一次拖動所做的選擇
for(int i=0;i< ITEM.GetCount();i++)
{
this->SetItemColor(ITEM.GetAt(i),SUBITEM.GetAt(i),RGB(0,0,0),RGB(255,255,255));
??}
this->ITEM.RemoveAll();
this->SUBITEM.RemoveAll();
*pResult = 0;
}
void CSortListCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 鼠標單擊事件
for(int i=0;iITEM.GetCount();i++)
{
this->SetItemColor(this->ITEM.GetAt(i),this->SUBITEM.GetAt(i),RGB(0,0,0),RGB(255,255,255));
}
this->ITEM.RemoveAll();
this->SUBITEM.RemoveAll();
*pResult = 0;
}
附加說明:我在這個項目中實現的功能是——對所選項右鍵單擊,彈出快捷菜單,進行各種操作,如同時對所有選中的項進行“加法”、“減法”、“乘法”和“除法”等操作 。因為取得了選中的行號和列號,您可以根據自己的需要來實現對所選項的操作。