1. 程式人生 > >MFC 列表檢視控制元件List Control 使用一

MFC 列表檢視控制元件List Control 使用一

列表檢視控制元件的建立

MFC同樣為列表檢視控制元件的操作提供了CListCtrl類。

如果我們不想在對話方塊模板中直接拖入List Control來使用列表檢視控制元件,而是希望動態建立它,則要用到CListCtrl類的成員函式Create函式,原型如下:

virtual BOOL Create(
   DWORD dwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT nID 
);

   引數rect為列表檢視控制元件的位置和尺寸,pParentWnd為指向父視窗的指標,nID指定列表檢視控制元件的ID,最複雜的一個引數同樣還是dwStyle,它用於設定列表檢視控制元件的風格,可以是以下風格的組合:

      風格                                含義

   LVS_ALIGNLEFT        顯示格式是大圖示或小圖示時,標籤放在圖示的左邊
   LVS_ALIGNTOP         顯示格式是大圖示或小圖示時,標題放在圖示的上邊
   LVS_AUTOARRANGE      顯示格式是大圖示或小圖示時,自動排列控制元件中的列表項
   LVS_EDITLABELS       使用者可以修改標籤文字
   LVS_ICON             指定大圖示顯示格式
   LVS_LIST             指定列表顯示格式
   LVS_NOCOLUMNHEADER   在報表格式中不顯示列的表頭
   LVS_NOLABELWRAP      顯示格式是大圖示時,使標籤文字單行顯示。預設是多行顯示
   LVS_NOSCROLL         列表檢視控制元件無滾動條,此風格不能與LVS_LIST或LVS_REPORT組合使用
   LVS_NOSORTHEADER     報表格式的列表檢視控制元件的表頭不能作為排序按鈕使用
   LVS_OWNERDRAWFIXED   由控制元件的擁有者負責繪製表項
   LVS_REPORT           指定報表顯示格式
   LVS_SHAREIMAGELISTS  使列表檢視共享影象序列
   LVS_SHOWSELALWAYS    即使控制元件失去輸入焦點,仍顯示出項的選擇狀態
   LVS_SINGLESEL        指定只能有一個列表項被選中。預設時可以多項選擇
   LVS_SMALLICON        指定小圖示顯示格式
   LVS_SORTASCENDING    按升序排列列表項
   LVS_SORTDESCENDING   按降序排列列表項

 

與前面的控制元件一樣,除了以上風格一般我們還要為列表檢視控制元件設定WS_CHILD和WS_VISIBLE風格。對於直接在對話方塊模板中建立的列表檢視控制元件,其屬性頁中的屬性與上述風格是對應的,例如,屬性Alignment預設為Left,也就等價於指定了LVS_ALIGNLEFT風格。

CListCtrl類的主要成員函式

 CListCtrl類有很多成員函式,這裡就為大家介紹幾個常用的主要成員函式。

       UINT GetSelectedCount( ) const;

   該函式返回列表檢視控制元件中被選擇列表項的數量。

       POSITION GetFirstSelectedItemPosition( ) const;

   獲取列表檢視控制元件中第一個被選擇項的位置。返回的POSITION值可以用來迭代來獲取其他選擇項,可以當作引數傳入下面的GetNextSelectedItem函式來獲得選擇項的索引。如果沒有被選擇項則返回NULL。

       int GetNextSelectedItem(POSITION& pos) const;

   該函式獲取由pos指定的列表項的索引,然後將pos設定為下一個位置的POSITION值。引數pos為之前呼叫GetNextSelectedItem或GetFirstSelectedItemPosition得到的POSITION值的引用。返回值就是pos指定列表項的索引。

       int GetItemCount( ) const;

   獲取列表檢視控制元件中列表項的數量。

       int InsertColumn(int nCol,const LVCOLUMN* pColumn );
       int InsertColumn(int nCol,LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT,int nWidth = -1,int nSubItem = -1 );

   這兩個函式用於在報表式列表檢視控制元件中插入列。第一個函式中,nCol引數為插入列的索引,pColumn引數指向LVCOLUMN結構,其中包含了插入列的屬性。第二個函式中,nCol引數也是插入列的索引,lpszColumnHeading引數為列標題字串,nFormat引數為列中文字的對齊方式,可以是LVCFMT_LEFT、LVCFMT_RIGHT或LVCFMT_CENTER,nWidth引數為列寬,nSubItem為插入列對應列表子項的索引。兩個函式在成功時都返回新列的索引,失敗都返回-1。

       BOOL DeleteColumn(int nCol);

   該函式用於刪除列表檢視控制元件中的某列。引數nCol為刪除列的索引。刪除成功則返回TRUE,失敗返回FALSE。

       int InsertItem(int nItem,LPCTSTR lpszItem);

   向列表檢視控制元件中插入新的列表項。引數nItem為要插入項的索引,引數lpszItem為要插入項的標籤字串。如果插入成功則返回新列表項的索引,否則返回-1。

       BOOL DeleteItem(int nItem);

   從列表檢視控制元件中刪除某個列表項。引數nItem指定了要刪除的列表項的索引。刪除成功則返回TRUE,否則返回FALSE。

       CString GetItemText(int nItem,int nSubItem) const;

   獲取指定列表項或列表子項的顯示文字。引數nItem指定了列表項的索引,引數nSubItem指定了列表子項的索引。 

       BOOL SetItemText(int nItem,int nSubItem,LPCTSTR lpszText);

   設定指定列表項或列表子項的顯示文字。引數nItem和nSubItem同GetItemText。引數lpszText為要設定的顯示文字字串。如果設定成功則返回TRUE,否則返回FALSE。

       DWORD_PTR GetItemData(int nItem) const;

   該函式用於獲取指定列表項的附加32位資料。引數nItem為列表項的索引。返回值就是由nItem指定列表項的附加32位資料。

       BOOL SetItemData(int nItem,DWORD_PTR dwData);

   該函式用於為指定列表項設定附加32位是資料。引數nItem為列表項的索引,引數dwData為列表項的附加32位資料。

CListCtrl類應用例項

最後給大家寫一個簡單的例項,說明CListCtrl類的幾個成員函式及通知訊息等的使用方法。因為在開發中最常用的要屬報表風格的List Control了,所以雞啄米給大家寫的是一個報表List Control的例子。

此例項實現的功能:在單選列表檢視控制元件中顯示一個簡單的程式語言排行榜,然後在用滑鼠左鍵選擇某列表項時,將選中列表項的文字顯示到編輯框中。下面是具體實現步驟:

  1. 建立一個基於對話方塊的MFC工程,名稱設定為“Example29”。

  2. 在自動生成的對話方塊模板IDD_EXAMPLE29_DIALOG中,刪除“TODO: Place dialog controls here.”靜態文字控制元件、“OK”按鈕和“Cancel”按鈕。新增一個List Control控制元件,ID設定為IDC_PROGRAM_LANG_LIST,View屬性設為Report,即為報表風格,Single Selection屬性設為True。再新增一個靜態文字控制元件和一個編輯框,靜態文字控制元件的Caption屬性設為“選擇的語言:”,編輯框的ID設為IDC_LANG_SEL_EDIT,Read Only屬性設為True。此時的對話方塊模板如下圖: 

 

3為列表檢視控制元件IDC_PROGRAM_LANG_LIST新增CListCtrl型別的控制元件變數m_programLangList。

4在對話方塊初始化時,我們將程式語言排行榜加入到列表檢視控制元件中,那麼需要修改

CExample29Dlg::OnInitDialog()函式為:

BOOL CExample29Dlg::OnInitDialog()   
    {   
        CDialogEx::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)   
        {   
            BOOL bNameValid;   
            CString strAboutMenu;   
            bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   
            ASSERT(bNameValid);   
            if (!strAboutMenu.IsEmpty())   
            {   
                pSysMenu->AppendMenu(MF_SEPARATOR);   
                pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
            }   
        }   

        // 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   
        CRect rect;   

        // 獲取程式語言列表檢視控制元件的位置和大小   
        m_programLangList.GetClientRect(&rect);   

        // 為列表檢視控制元件新增全行選中和柵格風格   
        m_programLangList.SetExtendedStyle(m_programLangList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);   

        // 為列表檢視控制元件新增三列   
        m_programLangList.InsertColumn(0, _T("語言"), LVCFMT_CENTER, rect.Width()/3, 0);   
        m_programLangList.InsertColumn(1, _T("2012.02排名"), LVCFMT_CENTER, rect.Width()/3, 1);   
        m_programLangList.InsertColumn(2, _T("2011.02排名"), LVCFMT_CENTER, rect.Width()/3, 2);   

        // 在列表檢視控制元件中插入列表項,並設定列表子項文字   
        m_programLangList.InsertItem(0, _T("Java"));   
        m_programLangList.SetItemText(0, 1, _T("1"));   
        m_programLangList.SetItemText(0, 2, _T("1"));   
        m_programLangList.InsertItem(1, _T("C"));   
        m_programLangList.SetItemText(1, 1, _T("2"));   
        m_programLangList.SetItemText(1, 2, _T("2"));   
        m_programLangList.InsertItem(2, _T("C#"));   
        m_programLangList.SetItemText(2, 1, _T("3"));   
        m_programLangList.SetItemText(2, 2, _T("6"));   
        m_programLangList.InsertItem(3, _T("C++"));   
        m_programLangList.SetItemText(3, 1, _T("4"));   
        m_programLangList.SetItemText(3, 2, _T("3"));   

        return TRUE;  // return TRUE  unless you set the focus to a control   
    }

 

5我們希望在選中列表項改變時,將最新的選擇項實時顯示到編輯框中,那麼可以使用NM_CLICK通知訊息。為列表框IDC_PROGRAM_LANG_LIST的通知訊息NM_CLICK新增訊息處理函式 CExample29Dlg::OnNMClickProgramLangList,並修改如下: 

 

void CExample29Dlg::OnNMClickProgramLangList(NMHDR *pNMHDR, LRESULT *pResult)   
{   
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);   
    // TODO: Add your control notification handler code here   
    *pResult = 0;   

    CString strLangName;    // 選擇語言的名稱字串   
    NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;   

    if (-1 != pNMListView->iItem)        // 如果iItem不是-1,就說明有列表項被選擇   
    {   
        // 獲取被選擇列表項第一個子項的文字   
        strLangName = m_programLangList.GetItemText(pNMListView->iItem, 0);   
        // 將選擇的語言顯示與編輯框中   
        SetDlgItemText(IDC_LANG_SEL_EDIT, strLangName);   
    }   
}  

 

執行程式,彈出結果對話方塊,在對話方塊的列表框中用滑鼠改變選中項時,編輯框中的顯示會相應改變。效果圖如下:

 

本文參考雞啄米: 
http://www.jizhuomi.com/software/197.html