VC++之List Box/Check List Box控件
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 GetLBText( int nIndex, LPTSTR lpszText ) 得到列表框内指定行的字符串 int GetSelItems( int nMaxItems, LPINT rgIndex ) 得到所有选中的行,参数rgIndex为存放被选中行的数组 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 )可以设置和得到某行的检查状态,关于检查框状态可以参考4.1 Button中介绍。
列表框几种常用的消息映射宏:
ON_LBN_DBLCLK 鼠标双击 ON_EN_ERRSPACE 输入框无法分配内存时产生 ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在输入框失去/得到输入焦点时产生 ON_LBN_SELCHANGE 选择的行发生改变
下面举个例子来说明 列表框 的使用:
例1:CListBox
假设我们在自己的对话框中使用“工具栏”ListBox建立了一个列表框 ID:IDC_LIST1
1.利用指针变量直接使用 CListBox *plist=(CListBox*)GetDlgItem(IDC_LIST1); plist->AddString("test.mp3"); plist->AddString("test2.mp3"); 向列表框中加入两个因子 2.在对话框类中声明一个CListBox 成员变量,再在对话框类的DoDataExchange中使用DDX_Control连接成员变量到此控件 (利用 MFC ClassWizard 的 Member Variables 可以自动实现) 对话框类的 .h 文件中: // Dialog Data //{{AFX_DATA(CKylinMP3Dlg) enum { IDD = IDD_KYLINMP3_DIALOG }; CListBox m_listbox; ..... 对话框类的 .cpp 文件中: void CKylinMP3Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CKylinMP3Dlg) DDX_Control(pDX, IDC_LIST1, m_listbox); //}}AFX_DATA_MAP } m_listbox.AddString(("test2.mp3"); CString buff; m_listbox.GetCurSel(); // 得到被选中项的索引号 m_listbox.GetText(m_listbox.GetCurSel(),buff); //buff=选中项的字符串 //SetDlgItemText(IDC_STATIC2,buff);
例2:检查列表框 CCheckListBox
检查列表框在很多的安装程序中得到广泛使用,它的效果看起来是将一个检查框放入到一个列表框当中,比如win98安装附件程序时的窗口主体就是一个检查列表框,它的每一项由一行文本或一个小图标与前面一个检查框组成。下面就让我们来实现它。
实现思想:根据面向对象的方法,我们只需将一个检查列表框的类对象加入到欲含有检查列表框的窗口对象中,然后在窗口对象的初始化函数中绘制它。
具体步骤:
1.为你的应用程序相应的对话框中加入一个列表框,值为IDC_LIST_RPTTIME,在“style”属性栏中将它的“owner draw”属性设为“Fixed”,如下图:
2.用Class wizard为列表框 IDC_LIST_RPTTIME 添加成员变量m_rpttime
3.找到添加的对话框的类定义处,将CListoBox类型改为CCheckListBox类型:
CListBox m_rpttime; //它的数据类型为CListBox。
改成: CCheckListBox m_rpttime;
4.为对话框的WM_INITDIALOG消息添加消息处理函数,OnMylnlt并添加代码如下:
m_rpttime.Addstring(_T("ITEM1"));
m_rpttime.Addstring(_T("ITEM2"));
m_rpttime.Addstring(_T("ITEM3"));
m_rpttime.SetCheckStyle(BS_AUTO3STATE);
5. 其成员函数基本和CListBox相同