列表框控件(ListBox)是MFC中常用的一种控件,它是一个窗口,可以在其中列出一些项目,在这些项目中,用户可以选择一个或多个项目。在应用程序中,列表框通常用于显示和选择一组选项,或者在其中显示一个文件列表等。
列表框控件可以用于许多应用场景,例如:
- 显示和选择一个项目列表,如字体、颜色、文件名等。
- 显示一个文件夹中的文件列表。
- 显示一个数据库的记录集合。
- 显示一个应用程序中的对象列表。
- 显示一组可执行的菜单项。
在MFC中,列表框控件可以通过CListBox类来操作,在使用列表框控件前需要进行以下操作:
1. 在资源编辑器中添加一个列表框控件,如图所示:
![ListBox](https://user-images.githubusercontent.com/67394115/134302765-ba5a139d-5a1f-4688-be4e-bab50fc9b5d3.png)
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); } } ``` 运行程序后,效果如下: ![Student](https://user-images.githubusercontent.com/67394115/134306012-8ffe0dec-c6aa-40f2-bdc5-f4d4f9c8c4f7.png) 本案例仅演示了列表框控件的简单用法,实际使用中还可以结合其他控件如按钮、编辑框等进行更加复杂的操作。 如果你喜欢我们三七知识分享网站的文章,
欢迎您分享或收藏知识分享网站文章
欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复