天天看點

MFC清單控件(ListControl)

1. CListCtrl 樣式及設定

LVS_ICON: 每個item顯示大圖示
 LVS_SMALLICON: 每個item顯示小圖示
 LVS_LIST: 顯示一列帶有小圖示的item
 LVS_REPORT: 顯示item詳細資料
 如windows資料總管,“檢視”标簽下的“大圖示,小圖示,清單,詳細資料”
 LONG lStyle;
 lStyle=GetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE); //擷取目前視窗style
 lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
 lStyle |= LVS_REPORT; //設定style
 SetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE, lStyle); //設定style
           

2. 擴充樣式設定

DWORD dwStyle = m_ListCtrl.GetExtendedStyle(); //擷取目前擴充樣式
 dwStyle |= LVS_EX_FULLROWSELECT; //選中某行使整行高亮(report風格時)
 dwStyle |= LVS_EX_GRIDLINES; //網格線(report風格時)
 dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件
 m_ListCtrl.SetExtendedStyle(dwStyle); //設定擴充風格
           

3. 資料插入

m_ListCtrl.InsertColumn(0,"名稱",LVCFMT_LEFT,50); //插入列
 m_ListCtrl.InsertColumn(1,"備注",LVCFMT_LEFT,50);
 //直接插入:
 int nRow=m_ListCtrl.InsertItem(0, "VC++");        //插入行
 m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0");  //設定資料
 //LVITEM 結構插入:
 LVITEM item={0};
 item.iItem=0;  //行号
 item.mask=LVIF_TEXT; /*LVIF_IMAGE支援圖示*/;
 item.cchTextMax=15;//插入字元串長度
 item.pszText="Visual C++ 6.0";
 int nRow=m_ListCtrl.InsertItem(&item);
 m_ListCtrl.SetItemText(nRow,1,"Visual C++ 6.0");
           

4. 一直選中Item

選中style中的 Show selection always,
 或者添加擴充樣式 LVS_SHOWSELALWAYS
           

5. 選中和取消選中Item

int nIndex = 0;
 //選中
  m_ListCtrl.SetItemState(nIndex,LVIS_SELECTED|
  LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
 //取消選中
  m_ListCtrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);
           

6. 得到CListCtrl中所有行的checkbox的狀态

CString str;
 for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
 {
   if(m_ListCtrl.GetItemState(i, LVIS_SELECTED)==
    LVIS_SELECTED || m_ListCtrl.GetCheck(i))
   {
     str.Format(_T("第%d行的checkbox為選中狀态"), i);
     AfxMessageBox(str);
    }
  }
           

7. 得到CListCtrl中所有選中行的序号

//方法一:
  CString str;
  for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
  {
    if(m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
    {
      str.Format(_T("選中了第%d行"), i);
      AfxMessageBox(str);
     }
   }
 //方法二:
  POSITION pos=m_ListCtrl.GetFirstSelectedItemPosition();
  if(pos==NULL)
   TRACE0("No items were selected!/n");
  else
  {
   while(pos)
    {
      int nItem=m_ListCtrl.GetNextSelectedItem(pos);
      TRACE1("Item %d was selected!/n", nItem);
      //添加其他操作
     }
   }
           

8. 得到item的資訊

TCHAR szBuf[1024];
 LVITEM lvi;
 lvi.iItem = nItemIndex;
 lvi.iSubItem = 0;
 lvi.mask = LVIF_TEXT;
 lvi.pszText = szBuf;
 lvi.cchTextMax = 1024;
 m_ListCtrl.GetItem(&lvi);
           

9. 得到CListCtrl的所有列的header字元串内容

LVCOLUMN lvcol;
 char  str[256];
 int   nColNum;
 CString strColumnName[3];//假如有3列
 nColNum = 0;
 lvcol.mask = LVCF_TEXT;
 lvcol.pszText = str;
 lvcol.cchTextMax = 256;
 while(m_list.GetColumn(nColNum, &lvcol))
 { 
   strColumnName[nColNum] = lvcol.pszText;
   nColNum++;
  }
           

10. 使CListCtrl中一項可見,即滾動滾動條

m_ListCtrl.EnsureVisible(i, FALSE);
           

11. 得到CListCtrl列數

int nHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount();
           

12. 删除所有列

方法一:
  while(m_ListCtrl.DeleteColumn(0))
  //因為你删除了第一列後,後面的列會依次向上移動。
 方法二:
  int nColumns = 3; //列數
  for(int i=nColumns-1; i>=0; i--)
   m_ListCtrl.DeleteColumn(i);
           

13. 得到單擊的CListCtrl的行列号

添加listctrl控件的NM_CLICK消息相應函數
 void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
 {
  //方法一:
  DWORD dwPos=GetMessagePos();
  CPoint point( LOWORD(dwPos), HIWORD(dwPos));
  m_ListCtrl.ScreenToClient(&point);
  LVHITTESTINFO lvinfo;
  lvinfo.pt=point;
  lvinfo.flags=LVHT_ABOVE;
  int nItem=m_ListCtrl.SubItemHitTest(&lvinfo);
  if(nItem!=-1)
  {
    CString strtemp;
    strtemp.Format("單擊的是第%d行第%d列",
    lvinfo.iItem, lvinfo.iSubItem);
    AfxMessageBox(strtemp);
   }
  // 方法二:
  NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
  if(pNMListView->iItem!=-1)
  {
    CString strtemp;
    strtemp.Format("單擊的是第%d行第%d列",
    pNMListView->iItem, pNMListView->iSubItem);
    AfxMessageBox(strtemp);
   }
   *pResult = 0;
 }
           

14. 判斷是否點選在CListCtrl的checkbox上

添加listctrl控件的NM_CLICK消息相應函數
 void CMyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
 {
   DWORD dwPos=GetMessagePos();
   CPoint point(LOWORD(dwPos), HIWORD(dwPos));
   m_ListCtrl.ScreenToClient(&point);
   LVHITTESTINFO lvinfo;
   lvinfo.pt=point;
   lvinfo.flags=LVHT_ABOVE;
   UINT nFlag;
   int nItem=m_ListCtrl.HitTest(point, &nFlag);
   //判斷是否點在checkbox上
   if(nFlag==LVHT_ONITEMSTATEICON)
   {
     AfxMessageBox("點在listctrl的checkbox上");
   } 
   *pResult = 0;
 }
           

15. 右鍵點選CListCtrl的item彈出菜單

添加CListCtrl控件的NM_RCLICK消息相應函數
 void CMyDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
 {
   NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
   if(pNMListView->iItem!=-1)
   {
     DWORD dwPos = GetMessagePos();
     CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
     CMenu menu;
     VERIFY( menu.LoadMenu( IDR_MENU1 ) );
     CMenu* popup = menu.GetSubMenu(0);
     ASSERT( popup != NULL );
     popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
     point.x, point.y, this );
    } 
    *pResult = 0;
 }
           

16. CListCtrl進行大資料量更新時,避免閃爍

m_ListCtrl.SetRedraw(FALSE);
 //更新内容
 m_ListCtrl.SetRedraw(TRUE);
 m_ListCtrl.Invalidate();
 m_ListCtrl.UpdateWindow();
           

 //或者參考  位址

17.舉例

BOOL CImageDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    // Add "About..." menu item to system menu.
    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
  {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
     }
   }
    DWORD dwStyle = m_list.GetExtendedStyle(); //擷取目前擴充樣式
    dwStyle |= LVS_EX_FULLROWSELECT; //選中某行使整行高亮(report風格時)
    dwStyle |= LVS_EX_GRIDLINES; //網格線(report風格時)
    m_list.SetExtendedStyle(dwStyle); //設定擴充風格
    m_list.InsertColumn(0,"ID");
    m_list.InsertColumn(1,"位置(X)");
    m_list.InsertColumn(2,"位置(Y)");
    m_list.InsertColumn(3,"旋轉角度(Angle)");
    m_list.InsertColumn(4,"比對分數(Score)");
    CRect rect;
    m_list.GetClientRect(rect);
    m_list.SetColumnWidth(0,rect.Width()/5);
    m_list.SetColumnWidth(1,rect.Width()/5);
    m_list.SetColumnWidth(2,rect.Width()/5);
    m_list.SetColumnWidth(3,rect.Width()/5);
    m_list.SetColumnWidth(4,rect.Width()/5);</span>
    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);// Set big icon
    SetIcon(m_hIcon, FALSE);// Set small icon
    // TODO: Add extra initialization here
    return TRUE;  // return TRUE  unless you set the focus to a control
}
           
MFC清單控件(ListControl)

以上是本人做項目知識記錄,部分内容來自網絡,本着知識共享原則,不侵犯任何人權益!