
列表框控件(ListBox)是MFC中常用的一种控件,它是一个窗口,可以在其中列出一些项目,在这些项目中,用户可以选择一个或多个项目。在应用程序中,列表框通常用于显示和选择一组选项,或者在其中显示一个文件列表等。
列表框控件可以用于许多应用场景,例如:
- 显示和选择一个项目列表,如字体、颜色、文件名等。
- 显示一个文件夹中的文件列表。
- 显示一个数据库的记录集合。
- 显示一个应用程序中的对象列表。
- 显示一组可执行的菜单项。
在MFC中,列表框控件可以通过CListBox类来操作,在使用列表框控件前需要进行以下操作:
1. 在资源编辑器中添加一个列表框控件,如图所示:

2. 为列表框控件添加列表项,可以通过向列表框控件对象(指针)调用AddString()来实现:
```cpp
CListBox* pListbox = (CListBox*)GetDlgItem(IDC_LIST1);
pListbox->AddString(_T("Item 1"));
pListbox->AddString(_T("Item 2"));
pListbox->AddString(_T("Item 3"));
```
3. 为列表框控件选择一个默认选项,可以调用SetCurSel()方法:
```cpp
CListBox* pListbox = (CListBox*)GetDlgItem(IDC_LIST1);
pListbox->SetCurSel(0);
```
4. 处理列表框控件的选择事件,可以添加响应函数:
```cpp
void CMyDlg::OnLbnSelchangeList1()
{
CListBox* pListbox = (CListBox*)GetDlgItem(IDC_LIST1);
int nIndex = pListbox->GetCurSel();
if (nIndex != LB_ERR)
{
CString str;
pListbox->GetText(nIndex, str);
// TODO: 处理选中项的事件
}
}
```
在实际应用中,列表框控件的使用更为复杂,可以设置列表框的样式、添加滚动条、设置多选、添加菜单等,这里不再一一介绍,具体可参考MFC帮助文档。
接下来,我们来看一个使用列表框控件的示例应用程序。
案例说明
本案例实现了一个简单的学生信息管理系统,可以添加、删除和修改学生信息,并在列表框控件中显示和选择。
1. 创建MFC应用程序,添加一个对话框,为其添加以下控件:
- 一个列表框控件(IDC_STUDENT_LIST)用于显示学生信息。
- 一组编辑框(IDC_NAME_EDIT、IDC_AGE_EDIT、IDC_MAJOR_EDIT)用于添加、修改和删除学生信息。
- 一个添加按钮(IDC_ADD_BUTTON)、一个删除按钮(IDC_DELETE_BUTTON)和一个修改按钮(IDC_MODIFY_BUTTON)用于操作学生信息。
添加学生信息:
- 将学生信息记录到STUDENT结构体变量中,将其添加到列表框控件中。
```cpp
// 将学生信息添加到列表框中
void CStudentDlg::AddStudent(const CString& strName, int nAge, const CString& strMajor)
{
STUDENT s = { strName, nAge, strMajor };
int nIndex = m_listStudent.AddString(strName);
m_vecStudent.insert(m_vecStudent.begin() + nIndex, s);
}
void CStudentDlg::OnBnClickedAddButton()
{
UpdateData(TRUE);
AddStudent(m_strName, m_nAge, m_strMajor);
m_listStudent.SetCurSel(m_listStudent.GetCount() - 1);
UpdateData(FALSE);
}
```
删除学生信息:
- 从列表框控件中删除选中行,从学生信息向量中删除对应的STUDENT结构体变量。
```cpp
// 将学生信息从列表框中删除
void CStudentDlg::DeleteStudent(int nIndex)
{
m_vecStudent.erase(m_vecStudent.begin() + nIndex);
m_listStudent.DeleteString(nIndex);
}
void CStudentDlg::OnBnClickedDeleteButton()
{
int nIndex = m_listStudent.GetCurSel();
if (nIndex != LB_ERR)
{
DeleteStudent(nIndex);
}
}
```
修改学生信息:
- 通过选中列表框控件中的行,获取对应的学生信息,在编辑框中显示学生信息。
- 修改学生信息,更新列表框控件中的行和学生信息向量中的STUDENT结构体变量。
```cpp
// 更新列表框中的学生信息
void CStudentDlg::UpdateStudent(int nIndex, const CString& strName, int nAge, const CString& strMajor)
{
m_vecStudent[nIndex].strName = strName;
m_vecStudent[nIndex].nAge = nAge;
m_vecStudent[nIndex].strMajor = strMajor;
m_listStudent.DeleteString(nIndex);
m_listStudent.InsertString(nIndex, strName);
}
void CStudentDlg::OnBnClickedModifyButton()
{
int nIndex = m_listStudent.GetCurSel();
if (nIndex != LB_ERR)
{
UpdateData(TRUE);
UpdateStudent(nIndex, m_strName, m_nAge, m_strMajor);
m_listStudent.SetCurSel(nIndex);
UpdateData(FALSE);
}
}
```
完整的代码示例如下:
```cpp
// StudentDlg.h
#pragma once
#include  typedef struct tagSTUDENT {     CString strName;     int nAge;     CString strMajor; } STUDENT; class CStudentDlg : public CDialogEx { public:     CStudentDlg(CWnd* pParent = nullptr);     // 对话框数据 #ifdef AFX_DESIGN_TIME     enum { IDD = IDD_STUDENT_DIALOG }; #endif protected:     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持     DECLARE_MESSAGE_MAP()     // 控件变量和消息响应函数 public:     virtual BOOL OnInitDialog();     afx_msg void OnBnClickedAddButton();     afx_msg void OnBnClickedDeleteButton();     afx_msg void OnBnClickedModifyButton();     afx_msg void OnLbnSelchangeStudentList(); private:     void AddStudent(const CString& strName, int nAge, const CString& strMajor);     void DeleteStudent(int nIndex);     void UpdateStudent(int nIndex, const CString& strName, int nAge, const CString& strMajor);     void ShowStudentInfo(int nIndex);     CListBox m_listStudent;     CString m_strName;     int m_nAge;     CString m_strMajor;     std::vector }; // StudentDlg.cpp #include "pch.h" #include "Student.h" #include "StudentDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CStudentDlg::CStudentDlg(CWnd* pParent /*=nullptr*/)     : CDialogEx(IDD_STUDENT_DIALOG, pParent)     , m_strName(_T(""))     , m_nAge(0)     , m_strMajor(_T("")) {     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CStudentDlg::DoDataExchange(CDataExchange* pDX) {     CDialogEx::DoDataExchange(pDX);     DDX_Control(pDX, IDC_STUDENT_LIST, m_listStudent);     DDX_Text(pDX, IDC_NAME_EDIT, m_strName);     DDX_Text(pDX, IDC_AGE_EDIT, m_nAge);     DDX_Text(pDX, IDC_MAJOR_EDIT, m_strMajor); } BEGIN_MESSAGE_MAP(CStudentDlg, CDialogEx)     ON_BN_CLICKED(IDC_ADD_BUTTON, &CStudentDlg::OnBnClickedAddButton)     ON_BN_CLICKED(IDC_DELETE_BUTTON, &CStudentDlg::OnBnClickedDeleteButton)     ON_BN_CLICKED(IDC_MODIFY_BUTTON, &CStudentDlg::OnBnClickedModifyButton)     ON_LBN_SELCHANGE(IDC_STUDENT_LIST, &CStudentDlg::OnLbnSelchangeStudentList) END_MESSAGE_MAP() BOOL CStudentDlg::OnInitDialog() {     CDialogEx::OnInitDialog();     // 设置窗口图标     SetIcon(m_hIcon, TRUE);     SetIcon(m_hIcon, FALSE);     // 添加表头     m_listStudent.AddString(_T("姓名\t年龄\t专业"));     m_listStudent.AddString(_T(""));     // 初始化编辑框     m_strName = _T("");     m_nAge = 0;     m_strMajor = _T("");     UpdateData(FALSE);     return TRUE; } void CStudentDlg::AddStudent(const CString& strName, int nAge, const CString& strMajor) {     STUDENT s = { strName, nAge, strMajor };     int nIndex = m_listStudent.AddString(strName);     m_vecStudent.insert(m_vecStudent.begin() + nIndex, s); } void CStudentDlg::DeleteStudent(int nIndex) {     m_vecStudent.erase(m_vecStudent.begin() + nIndex);     m_listStudent.DeleteString(nIndex); } void CStudentDlg::UpdateStudent(int nIndex, const CString& strName, int nAge, const CString& strMajor) {     m_vecStudent[nIndex].strName = strName;     m_vecStudent[nIndex].nAge = nAge;     m_vecStudent[nIndex].strMajor = strMajor;     m_listStudent.DeleteString(nIndex);     m_listStudent.InsertString(nIndex, strName); } void CStudentDlg::ShowStudentInfo(int nIndex) {     if (nIndex >= 0 && nIndex < m_vecStudent.size())     {         m_strName = m_vecStudent[nIndex].strName;         m_nAge = m_vecStudent[nIndex].nAge;         m_strMajor = m_vecStudent[nIndex].strMajor;         UpdateData(FALSE);     }     else     {         m_strName = _T("");         m_nAge = 0;         m_strMajor = _T("");         UpdateData(FALSE);     } } void CStudentDlg::OnBnClickedAddButton() {     UpdateData(TRUE);     AddStudent(m_strName, m_nAge, m_strMajor);     m_listStudent.SetCurSel(m_listStudent.GetCount() - 1);     UpdateData(FALSE); } void CStudentDlg::OnBnClickedDeleteButton() {     int nIndex = m_listStudent.GetCurSel();     if (nIndex != LB_ERR)     {         DeleteStudent(nIndex);         ShowStudentInfo(m_listStudent.GetCurSel());     } } void CStudentDlg::OnBnClickedModifyButton() {     int nIndex = m_listStudent.GetCurSel();     if (nIndex != LB_ERR)     {         UpdateData(TRUE);         UpdateStudent(nIndex, m_strName, m_nAge, m_strMajor);         m_listStudent.SetCurSel(nIndex);         UpdateData(FALSE);     } } void CStudentDlg::OnLbnSelchangeStudentList() {     int nIndex = m_listStudent.GetCurSel();     if (nIndex != LB_ERR)     {         ShowStudentInfo(nIndex);     } } ``` 运行程序后,效果如下:  本案例仅演示了列表框控件的简单用法,实际使用中还可以结合其他控件如按钮、编辑框等进行更加复杂的操作。                            如果你喜欢我们三七知识分享网站的文章,
欢迎您分享或收藏知识分享网站文章
欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
                        
                
                
                
发表评论 取消回复