天天看點

CListCtrl詳解 zt

 1。先來介紹REPORT類型的CListCtrl:

首先使用下面的語句設定CListCtrl的style:

 DWORD SetExtendedStyle( DWORD dwNewStyle );

其中

 LVS_EX_CHECKBOXES 表示添加CheckBox

 LVS_EX_FULLROWSELECT 表示選擇整行

 LVS_EX_GRIDLINES 表示添加表格線

如果設定了LVS_EX_CHECKBOXES屬性,則可以用

 BOOL GetCheck( int nItem ) const;

來得到某一行是否Checked。

可以先用下面的語句來删除以前的東西:

 for(int k=2;k>=0;k--) //注意要從後往前删,否則出錯

  m_ListCtrl.DeleteColumn(k);

 m_ListCtrl.DeleteAllItems();

用下面的語句建立列:

 m_ListCtrl.InsertColumn(0,_T("檔案名"),LVCFMT_IMAGE|LVCFMT_LEFT);

 m_ListCtrl.InsertColumn(1,_T("儀器類别"));

 m_ListCtrl.InsertColumn(2,_T("項目類别"));

其中LVCFMT_IMAGE表示可以在第一列加入圖示。如果不要圖示可以删去。

然後設定列寬:

 for(j=0;j<3;j++)

  m_ListCtrl.SetColumnWidth(j ,100);

以下為清單加入圖示,如果不需要圖示,可以跳過這一步。注意隻在第一次加入,如果多次加入會出錯!

先在頭檔案中加入聲明:

 CImageList m_ImageList;

這是必要的,如果在cpp的某個函數中加入由于生命期結束,CImageList自動釋放,則效果是清單中看不到圖示,隻看到一個白方塊。

下面生成CImageList,并将其綁定到CListCtrl中,這是CImageList中還沒有圖示,隻是一個容器:

 static int flag=2;

 if(flag==2){//隻調用一次SetImageList,否則出錯

  m_ImageList.Create(128, 128, ILC_COLORDDB|ILC_MASK, 20, 1); 

  m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL);

 }

 flag=(flag+1)%2;

如果CListCtrl已經用過,曾經加過圖示進去,這時就要删除上次放進m_ImageList中的Image

 for(int kk=0;kk<m_ImageList.GetImageCount();kk++)

  m_ImageList.Remove(k);

下面介紹如何向CListCtrl裡面加入行,并同時為每一行動态加入圖示:

假設m_listRowCount為要加入的行數。

 CBitmap* bitmap;

 bitmap=new CBitmap[m_list1rowCount];

 HBITMAP hbitmap; 

 for(int i = 0; i < m_listRowCount; i++)

 {

  //為每一行插入相應的縮略圖

  CFile f;

  CFileException e;  

  if( !f.Open(m_FileName, CFile::modeRead, &e )){ //m_FileName為bmp檔案名,由你來定

   hbitmap = (HBITMAP)LoadImage(NULL,path+"blank.bmp",IMAGE_BITMAP,0,0,

    LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

  }else{

   f.Close();

   hbitmap = (HBITMAP)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0,

    LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

  }

  bitmap[i].Attach(hbitmap);

  m_ImageList.Add(&bitmap[i], RGB(0, 128, 128));

  //插入行

  m_ListCtrl.InsertItem(i,m_FileName,i);

  m_ListCtrl.SetItemText(i,1,type);

  m_ListCtrl.SetItemText(i,2,m_Path);

 }

 //記得删除已經沒用的臨時檔案

 if(m_list1rowCount!=0)

  delete[] bitmap;

2。如果是ICON類型的CListCtrl,則要做一點點改動:

把綁定圖示集的代碼由

 SetImageList(&m_ImageList,LVSIL_SMALL);

改為

 SetImageList(&m_ImageList,LVSIL_NORMAL);

插入行時隻用

 InsertItem(i,mainSet.m_FileName,i);

不用

 SetItemText(i,1,type);

之類的代碼。