1. 程式人生 > >(轉載)mfc listbox 控制元件-ListBox控制元件的使用

(轉載)mfc listbox 控制元件-ListBox控制元件的使用

2008年02月21日

   //ListBox控制元件的使用

  ListBox窗戶用來列出一系列的文字,每條則本佔一行。建立一個列表窗戶可使用成員函式:

  BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );

  其中dwStyle將指明該窗戶的風格,除了子窗戶常用的風格WS_CHILD,WS_VISIBLE外,你可以針對列表控制元件指明專門的風格。

  LBS_MULTIPLESEL 指明列表框可以同時選擇多行

  LBS_EXTENDEDSEL 可以路程經過過程按下Shift/Ctrl鍵選擇多行

  LBS_SORT 所有的行根據字母挨次進行排序

  在列表框天生後需要向其中插手或是刪除行,可以利用:

  int AddString( LPCTSTR lpszItem )新增行,

  int DeleteString( UINT nIndex )刪除指定行,

  int InsertString( int nIndex, LPCTSTR lpszItem )將行插入到指定位置。

  void ResetContent( )可以刪除列表框中所有行。

  路程經過過程呼叫int GetCount( )獲患上時下列表框中行的數量。

  要是需要獲患上/設定時下被選中的行,可以呼叫int GetCurSel( )/int SetCurSel(int iIndex)。要是你指明瞭選擇多行的風格,你就需要先呼叫int GetSelCount( )獲患上被選中的行的數量,之後int GetSelItems( int nMaxItems, LPINT rgIndex )獲患上所有選中的行,參量rgIndex為儲存安放被選中行的陣列。路程經過過程呼叫int GetLBText( int nIndex, LPTSTR lpszText )獲患上列表框內指定行的字串。

  這個之外路程經過過程呼叫int FindString( int nStartAfter, LPCTSTR lpszItem )可以在時下所有行中查尋指定的字元傳的位置,nStartAfter指明從那一行起頭進行查尋。 int SelectString( int nStartAfter, LPCTSTR lpszItem )可以選中包羅指定字串的行。

  在MFC 4.2版本中新增了CCheckListBox類,該類是由CListBox派生並擁有CListBox的所有功能,差別的是可以在每行前加之一個檢查框。必須注重的是在建立時必須指明LBS_OWNERDRAWFIXED或LBS_OWNERDRAWVARIABLE風格。

  路程經過過程void SetCheckStyle( UINT nStyle )/UINT GetCheckStyle( )可以設定/獲患上檢查框的風格,關於檢查框風格可以參考4.1 Button中先容。路程經過過程void SetCheck( int nIndex, int nCheck )/int GetCheck( int nIndex )可以設定以及獲患上某行的檢查狀況,關於檢查框狀況可以vb listbox
參考4.1 Button中先容。

  最後先容一下列表框幾種常用的訊息照射巨集:

  ON_LBN_DBLCLK 滑鼠雙擊

  ON_EN_ERRSPACE 輸入框無法分配記憶體時孕育發生

  ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在輸入框掉去/獲患上輸入焦點時孕育發生

  ON_LBN_SELCHANGE 選擇的行發生轉變

  使用以上幾種訊息照射的方法為界說原形如:afx_msg void memberFxn( );的函式,而且界說形式如ON_Notification( id, memberFxn )的訊息照射。要是在對話方塊中使用列表框,Class Wizard會不傭人的勞力列出相干的訊息,並能不傭人的勞力孕育發生訊息照射程式碼。

  CListBox 以及 CCheckListBox 簡介

  CListBox

  用來輸出一系列的文字,每條則本佔一行。

  CCheckListBox

  CCheckListBox是由CListBox派生,具有CListBox的所有功能。與CListBox獨一差別是在每一行前面加之了一個檢查框(Check Box)。要使用CCheckListBox,需要在資源檢視(resourceview)中

  ⑴ Style->Owner draw->選中Fixed

  ⑵ 選中Has Strings

  (3) 新增成員變數

  方法一:路程經過過程類嚮導(ClassWizard)給新增成員變數CListBox m_listbox;,之後手動改成CCheckListBox m_listbox;

  方法二:用SubclassDlgItem或SubclassWindow函式,子類化控制元件。

  CCheckListBox m_checkListBox;

  m_checkListBox.SubclassDlgItem(IDC_LISTBOX1,this);

  1. listbox的styles先容

  在listbox的styles中的selection中有4個選項:Single,Multiple,Extended以及None。

  Single:允許每次選擇一個item。

  Multiple:允許每次選擇多個item。

  Extended:允許按下Shift/Ctrl鍵選擇多行。

  None:選中item而不高亮之,只顯示該item獲患上焦點(item外有矩形框)。

  2. 關於在執行時轉變listbox的style

  在執行時是不克不及轉變style的,只有毀掉本來的,再新建立一個listbox。或先建立兩個listbox,隱蔽其中一個。

  3. 設定listbox程度滾動條

  int dx=0;

  CSize sz;

  CDC* pDC = m_listbox.GetDC();

  CString str;

  for (int j = 0; j < m_listbox.GetCount(); j )

  {

  m_listbox.GetText(j, str);

  sz = pDC->GetTextExtent(str);

  if ( sz.cx > dx )

  dx = sz.cx;

  }

  m_listbox.ReleaseDC(pDC);

  m_listbox.SetHorizontalExtent(dx);

  4. 匯入資料夾下所有檔案以及目錄到listbox

  TCHAR szPath [MAX_PATH] = {"c://"};

  int nReslt = DlgDirList(szPath , IDC_LISTBOX1 , 0,

  DDL_READWRITE |DDL_READONLY |

  DDL_SYSTEM | DDL_ARCHIVE | DDL_DIRECTORY );

  5. listbox插手資料時,不傭人的勞力滾動到最後

   //不傭人的勞力滾動到最後並選中最後最後一行

  m_listbox.SetCurSel(m_listbox.GetCount()-1);

   //不傭人的勞力滾動到最後

  m_listbox.SetCaretIndex(m_listbox.GetCount()-1, FALSE);

  或

  m_listbox.SetTopIndex(m_listbox.GetCount()-1);

  6.關於 SetItemDataPtr() 以及 GetItemDataPtr() 的使用

  SetItemDataPtr()是將一個32位的指標與列表框中的一個item成立相干聯,在設定後可以路程經過過程調listbox 清空
用GetItemDataPtr()而獲取。那末由此,咱們可以將列表框中的資料通外部成立聯絡了。

  在現實應用方面,比如,在列表框中的item是人的姓名,那末咱們可以成立一個數據佈局,儲存人的性別,住址,手機等相干資訊,與item成立聯絡。當取患上item時,同時咱們也取患上了該人的相干資訊。

  示例:

  struct _Person_Info {

  CString strSex;

  CString strAddress;

  CString strPhoneNumber;

  }PersonInfo;

  PersonInfo *pi;

  int nIndex = m_listbox.AddString(_T("第三者"));

  m_pPersonInfo = new PersonInfo();

  pi->strSex = _T("Male");

  pi->strAddress = _T("xxx city");

  pi->strPhoneNumber = _T("1234567678");

  m_listbox.SetItemDataPtr(nIndex, (LPVOID)pi);

  //獲取

  PersonInfo *pi = NULL;

  pi = (PersonInfo *)m_listbox.GetItemDataPtr(nIndex);

  7. 帶彩色字串 listbox

  http://www.codeguru.com/cpp/controls/listbox/color listboxes/article.php/c1611/

  http://www.codeproject.com/combobox/xlistbox.asp

  8. 違景透明 listbox

  http://www.codeguru.com/cpp/controls/listbox/color listboxes/article.php/c10413/

  9. 在listbox中使成為事實拖放

  ⑴ 在一個listbox中拖放

  http://www.codeguru.com/cpp/controls/listbox/dragd rop/article.php/c11061/

  http://www.codeguru.com/cpp/controls/listbox/dragd rop/article.php/c4747/

  ⑵ 在兩個listbox間使成為事實拖放

  http://msdn.microsoft.com/msdnmag/issues/04/10/CQA /

  http://www.codeguru.com/cpp/controls/listbox/dragd rop/article.php/c11069/

  10. CListBoxST 一個非常好的類

  http://www.codeguru.com/cpp/controls/listbox/artic le.php/c4753/

  11. 近似於 vb 屬性選擇窗戶

  http://www.codeguru.com/cpp/controls/listbox/artic le.php/c1607/

  http://www.codeproject.com/combobox/Property_List. asp

  12. 近似於 vc 的 tools->options->directories 的目錄設定窗戶

  http://www.codeguru.com/cpp/controls/listbox/artic le.php/c1613/

  13. 帶 icon 的 listbox

  http://www.codeguru.com/cpp/controls/listbox/artic le.php/c4749/

  http://www.codeguru.com/cpp/controls/listbox/artic le.php/c4753/

  14. 帶 checkbox 的listbox

  http://www.codeproject.com/combobox/CCheckListBoxU sage.asp

  15. 可編輯 item 的 listbox

  http://www.codeproject.com/combobox/lbed.asp

  16. 可 disable item 的 listbox

  http://www.codeproject.com/combobox/disableditemsl istbox.asp

  17. 一個自繪的listbox

  Q113189:

  ListDlg.exe Implements a List Box Full of Dialog Boxes

  http://support.microsoft.com/kb/113189/en-us