VS2010 MFC编程入门之二十四(常用控件:列表框控件ListBox)

列表框控件(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 m_vecStudent;

};

// 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/

点赞(16) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部