程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC CSortListCtrl加強版

VC CSortListCtrl加強版

編輯:關於VC++

這是一個可以自由選擇多個子項的列表控件。由於項目需要,使用了 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;
}   

附加說明:我在這個項目中實現的功能是——對所選項右鍵單擊,彈出快捷菜單,進行各種操作,如同時對所有選中的項進行“加法”、“減法”、“乘法”和“除法”等操作 。因為取得了選中的行號和列號,您可以根據自己的需要來實現對所選項的操作。

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