VC++----ListBox控件的使用

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

posted @ 2012-11-27 17:00  郑文亮  阅读(6294)  评论(0编辑  收藏  举报