天天看點

VS2010-MFC(常用控件:清單框控件ListBox)

轉自:http://www.jizhuomi.com/software/186.html

       清單框控件簡介

       清單框給出了一個選項清單,允許使用者從中進行單項或多項選擇,被選中的項會高亮顯示。清單框可分為單選清單框和多選清單框,顧名思義,單選清單框中一次隻能選擇一個清單項,而多選清單框可以同時選擇多個清單項。

       清單框也會向父視窗發送通知消息。這些通知消息及含義如下:

       LBN_DBLCLK :使用者用滑鼠輕按兩下了一清單項,隻有具有LBS_NOTIFY 的清單框才能發送該消息

       LBN_ERRSPACE :清單框不能申請足夠的動态記憶體來滿足需要

       LBN_KILLFOCUS :清單框失去輸入焦點

       LBN_SELCANCEL: 目前的選擇被取消,隻有具有LBS_NOTIFY 的清單框才能發送該消息

       LBN_SELCHANGE:單擊滑鼠選擇了一清單項,隻有具有LBS_NOTIFY 的清單框才能發送該消息

       LBN_SETFOCUS:清單框獲得輸入焦點

       WM_CHARTOITEM:當清單框收到WM_CHAR 消息後, 向父視窗發送該消息, 隻有具有LBS_WANTKEYBOARDINPUT 風格的清單框才會發送該消息

       WM_VKEYTOITEM:當清單框收到WM_KEYDOWN 消息後,向父視窗發送該消息,隻有具有LBS_WANTKEYBOARDINPUT 風格的清單框才會發送該消息

       清單框控件的建立

       MFC将清單框控件的所有操作都封裝到了CListBox類中。

        建立清單框控件時,可以在對話框模闆中直接拖入清單框控件Listbox,然後添加控件變量使用。但如果需要動态建立清單框,就要用到CListBox類的Create成員函數了。Create成員函數的原型如下:

virtual BOOL Create(

   DWORD dwStyle,

   const RECT& rect,

   CWnd* pParentWnd,

   UINT nID 

);

       參數rect指定了清單框的位置和尺寸,pParentWnd為父視窗的指針,nID用于指定清單框控件的ID。最後重點講講參數dwStyle,它指定了清單框控件的風格,以下是各種風格說明:

       LBS_EXTENDEDSEL:支援多重選擇,在點選清單項時按住Shift 鍵或Ctrl 鍵即可選擇多個項

       LBS_HASSTRINGS:指定一個含有字元串的自繪式清單框

       LBS_MULTICOLUMN:指定一個水準滾動的多列清單框, 通過調用CListBox::SetColumnWidth 來設定每列的寬度

       LBS_MULTIPLESEL:支援多重選擇。清單項的選擇狀态随着使用者對該項單擊或輕按兩下滑鼠而翻轉

       LBS_NOINTEGRALHEIGHT:清單框的尺寸由應用程式而不是Windows 指定。通常,Windows指定尺寸會使清單項的某些部分隐藏起來

       LBS_NOREDRAW:當選擇發生變化時防止清單框被更新,可發送消息改變該風格

       LBS_NOTIFY:當使用者單擊或輕按兩下滑鼠時通知父視窗

       LBS_OWNERDRAWFIXED:指定自繪式清單框,即由父視窗負責繪制清單框的内容,并且清單項有相同的高度

       LBS_OWNERDRAWVARIABLE:指定自繪式清單框,并且清單項有不同的高度

       LBS_SORT:使插入清單框中的項按升序排列

       LBS_STANDARD:相當于指定了WS_BORDER|WS_VSCROLL|LBS_SORT

       LBS_USETABSTOPS:使清單框在顯示清單項時識别并擴充制表符(‘\t’),預設的制表寬度是32 個對話框機關

       LBS_WANTKEYBOARDINPUT:允許清單框的父視窗接收WM_VKEYTOITEM 和WM_CHARTOITEM 消息,以響應鍵盤輸入

       LBS_DISABLENOSCROLL:使清單框在不需要滾動時顯示一個禁止的垂直滾動條

       dwStyle可以是以上所列風格的組合。與其他控件一樣,除了這些風格一般還要為清單框控件設定WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_BORDER、WS_VSCROLL等風格。一般建立單選清單框時,風格要設定為:WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_STANDARD,如果不希望清單框項排序顯示則應去掉LBS_STANDARD。建立多選清單框時,隻需要在單選清單框風格後添加LBS_MULTIPLESEL或LBS_EXTENDEDSEL風格。

       對于對話框模闆中直接添加的清單框控件,其屬性頁中的屬性包含了以上風格,例如屬性Multicolumn對應的就是LBS_MULTICOLUMN風格。

       CListBox類的主要成員函數

       int GetCount( ) const;

       傳回值:傳回清單框中清單項的數目,如果發生錯誤則傳回LB_ERR。

       int GetSel(int nIndex) const;

       參數:nIndex指定某個清單項的索引。

       傳回值:傳回nIndex指定清單項的狀态。如果此清單項被選擇了則傳回一個正值,否則傳回0,若發生錯誤則傳回LB_ERR。

       int SetSel(int nIndex,BOOL bSelect = TRUE);

       此函數隻用于多選清單框,使用它可以選擇或取消選擇指定的清單項。

       參數:nIndex指定某個清單項的索引,若為-1則相當于指定了所有清單項。bSelect為TRUE時選擇指定清單項,否則取消選擇指定清單項。

       傳回值:如果發生錯誤則傳回LB_ERR。

       int AddString(LPCTSTR lpszItem);

       此函數用來向清單框中添加字元串。如果清單框指定了LBS_SORT風格,字元串就被以排序順序插入到清單框中,如果沒有指定LBS_SORT風格,字元串就被添加到清單框的結尾。

       參數:lpszItem指定了要添加的字元串。

       傳回值:傳回字元串在清單框中添加的位置。如果發生錯誤則傳回LB_ERR,記憶體不夠則傳回LB_ERRSPACE。

       int InsertString(int nIndex, LPCTSTR lpszItem);

       該函數用來在清單框中的指定位置插入字元串。與AddString函數不同的是,InsertString函數不會導緻LBS_SORT風格的清單框重新排序。不要在具有LBS_SORT風格的清單框中使用InsertString函數,以免破壞清單項的次序。

       參數:。參數nIndex 給出了插入位置(索引),如果值為-1,則字元串将被添加到清單的末尾。參數lpszItem 指定了要插入的字元串。

       傳回值:傳回實際的插入位置,若發生錯誤,會傳回LB_ERR 或LB_ERRSPACE。

       int DeleteString(UINT nIndex);

       該函數用于删除指定的清單項。

       參數:nIndex 指定了要删除項的索引。

       傳回值:函數的傳回值為剩下的清單項數目,如果nIndex 超過了實際的表項總數,則傳回LB_ERR。

       void ResetContent();

       該函數用于清除所有清單項。

       int GetText(int nIndex,LPTSTR lpszBuffer) const;

       void GetText(int nIndex,CString& rString) const;

       這兩個成員函數用于擷取指定清單項的字元串。參數nIndex 指定了清單項的索引。參數lpszBuffer 指向一個接收字元串的緩沖區。引用參數rString 則指定了接收字元串的CString對象。第一個版本的函數會傳回獲得的字元串的長度,若出錯,則傳回LB_ERR;第二個版本的函數則不會。

       int GetTextLen(int nIndex) const;

       該函數傳回指定清單項的字元串的位元組長度。

       參數:nIndex 指定了清單項的索引。

       傳回值:若出錯則傳回LB_ERR。

       int GetCurSel() const;

       該函數僅适用于單選清單框,用來傳回目前被選擇項的索引,如果沒有清單項被選擇或有錯誤發生,則函數傳回LB_ERR。

       int SetCurSel(int nSelect);

       該函數僅适用于單選清單框,用來選擇指定的清單項。該函數會滾動清單框以使選擇項可見。參數nIndex 指定了清單項的索引,若為-1,那麼将清除清單框中的選擇。若出錯函數傳回LB_ERR。

       int GetSelCount() const;

       該函數僅用于多重選擇清單框,它傳回選擇項的數目,若出錯函數傳回LB_ERR。

       int FindString(int nStartAfter,LPCTSTR lpszItem) const;

       該函數用于對清單項進行與大小寫無關的搜尋。參數nStartAfter 指定了開始搜尋的位置,合理指定nStartAfter 可以加快搜尋速度,若nStartAfter 為-1,則從頭開始搜尋整個清單。參數lpszItem 指定了要搜尋的字元串。函數傳回與lpszItem 指定的字元串相比對的清單項的索引,若沒有找到比對項或發生了錯誤,則會傳回LB_ERR。FindString 函數先從nStartAfter指定的位置開始搜尋,若沒有找到比對項,則會從頭開始搜尋清單。隻有找到比對項,或對整個清單搜尋完一遍後,搜尋過程才會停止,是以不必擔心會漏掉要搜尋的清單項。

       int SelectString(int nStartAfter,LPCTSTR lpszItem);

       該函數僅适用于單選清單框,用來選擇與指定字元串相比對的清單項。該函數會滾動清單框以使選擇項可見。參數的意義及搜尋的方法與函數FindString 類似。如果找到了比對的項,函數傳回該項的索引,如果沒有比對的項,函數傳回LB_ERR 并且目前的選擇不被改變。

        CListBox類應用執行個體

       最後給大家寫一個簡單的執行個體,說明CListBox的幾個成員函數及通知消息等的使用方法。此執行個體實作的功能:在單選清單框中顯示一個網站清單,然後在用滑鼠左鍵選擇某清單項時,将選中清單項的文本顯示到編輯框中。下面是具體實作步驟:

       1. 建立一個基于對話框的MFC工程,名稱設定為“Example24”。

       2. 在自動生成的對話框模闆IDD_EXAMPLE24_DIALOG中,删除“TODO: Place dialog controls here.”靜态文本控件、“OK”按鈕和“Cancel”按鈕。添加一個Listbox控件,ID設定為IDC_WEB_LIST,Sort屬性設為False,以取消排序顯示。再添加一個靜态文本控件和一個編輯框,靜态文本控件的Caption屬性設為“您選擇的站點:”,編輯框的ID設為IDC_SEL_WEB_EDIT,Read Only屬性設為True。此時的對話框模闆如下圖:

VS2010-MFC(常用控件:清單框控件ListBox)

       3. 為清單框IDC_WEB_LIST添加CListBox類型的控件變量m_listBox。

       4. 在對話框初始化時,我們将站點名加入到清單框中,那麼需要修改CExample24Dlg::OnInitDialog()函數為:

C++代碼

BOOL CExample24Dlg::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   
    m_listBox.AddString(_T("新浪"));        // 在清單框結尾添加字元串“新浪”   
    m_listBox.AddString(_T("雞啄米"));      // 在清單框結尾添加字元串“雞啄米”   
    m_listBox.AddString(_T("貓撲"));        // 在清單框結尾添加字元串“貓撲”   
    m_listBox.InsertString(2, _T("百度"));  // 在清單框中索引為2的位置插入字元串“百度”   
  
    return TRUE;  // return TRUE  unless you set the focus to a control   
}        

       5. 我們希望在選中清單項改變時,将最新的選擇項實時顯示到編輯框中,那麼這就要用到LBN_SELCHANGE通知消息。為清單框IDC_WEB_LIST的通知消息LBN_SELCHANGE添加消息處理函數CExample24Dlg::OnLbnSelchangeWebList(),并修改如下:

void CExample24Dlg::OnLbnSelchangeWebList()   
{   
    // TODO: Add your control notification handler code here   
    CString strText;   
    int nCurSel;   
       
    nCurSel = m_listBox.GetCurSel();           // 擷取目前選中清單項   
    m_listBox.GetText(nCurSel, strText);       // 擷取選中清單項的字元串   
    SetDlgItemText(IDC_SEL_WEB_EDIT, strText); // 将選中清單項的字元串顯示到編輯框中   
}        

       6. 運作程式,彈出結果對話框,在對話框的清單框中用滑鼠改變選中項時,編輯框中的顯示會相應改變。效果圖如下:

VS2010-MFC(常用控件:清單框控件ListBox)
VS2010-MFC(常用控件:清單框控件ListBox)

       關于清單框ListBox的講解就到此為止了。大家如果想試驗更多的清單框成員函數,可以在上面的小例子中加入更多的功能來體會。

轉載于:https://www.cnblogs.com/Tang-tangt/p/9460061.html