MFC程式設計(四)

calong發表於2020-10-28

列表框的使用

頁面佈局如下
MFC程式設計(四)

  • 使用類:
    • CWnd:組建基類
    • CListBox:列表框
  • 使用函式:
    • CWnd::UpdateData(bool):
      • 引數為true:獲取控制元件中的資料
      • 引數為false:更新控制元件的資料顯示
    • CListBox::AddString():<int>:向列表中新增資料並返回該資料的索引值
    • CListBox::DeleteString(int):從列表中刪除指定索引值的項
    • CListBox::SetItemDataPtr(int, *xxx):設定指定索引值的關聯項指標
    • CListBox::GetItemDataPtr(int):<*xxx>:獲取指定索引值的關聯項指標
    • CListBox::GetCurSel():<int>:獲取當前選擇項的索引值
    • CListBox::FindStringExact(int, string):[LB_ERR]:從指定位置搜尋列表中是否含有某項值

在DemoDlg中定義儲存資料的結構體

class CDemoDlg : public CDialog
{
...
private:
    struct student {
        CString name;
        long no;
        CString sex;
        int age;
        CString clazz;
    };
};

編寫新增事件

void CDemoDlg::OnInsert() 
{
    // 處理姓名
    this->UpdateData();
    if (this->m_name.IsEmpty()) {
        MessageBox("學生姓名不能為空!");
        return;
    }
    m_name.TrimLeft();
    m_name.TrimRight();
    // 搜尋是否已經錄入
    if ((m_list.FindStringExact(-1, m_name))!=LB_ERR) {
        MessageBox("該學生已被錄入,不可重複新增!");
        return;
    }
    // 處理其他屬性
    m_class.TrimLeft();
    m_class.TrimRight();
    m_sex.TrimLeft();
    m_sex.TrimRight();
    //新增到列表
    int index = m_list.AddString(m_name);
    student std;
    std.name = m_name;
    std.sex = m_sex;
    std.age = m_age;
    std.clazz = m_class;
    std.no = m_no;
    m_list.SetItemDataPtr(index, new student(std));
}

編寫刪除事件

void CDemoDlg::OnDelete() 
{
    // 獲取當前選擇項的索引
    int index = m_list.GetCurSel();
    if (index != LB_ERR) {
        delete (student *)m_list.GetItemDataPtr(index);
        m_list.DeleteString(index);
        // 清空顯示資料
        m_name = m_class = m_sex = "";
        m_no = m_age = 0;
        // 更新資料顯示
        UpdateData();
    } else
        MessageBox("沒有選擇列表項!");
}

編寫列表框選擇事件

void CDemoDlg::OnSelchangeStudentList() 
{
    int index = m_list.GetCurSel();
    if (index != LB_ERR) {
        // 獲得當前選擇的列表項的關聯結構體
        student *pst = (student *)m_list.GetItemDataPtr(index);
        m_name = pst->name;
        m_age = pst->age;
        m_class = pst->clazz;
        m_no = pst->no;
        m_sex = pst->sex;
        // 更新視窗資料顯示
        UpdateData();
    }
}

編寫退出事件

void CDemoDlg::OnCancel() 
{
    // 清除記憶體中的所有垃圾資料
    for (int index = m_list.GetCount() - 1; index >= 0; index--) {
        delete (student *)m_list.GetItemDataPtr(index);
    }
    CDialog::OnCancel();
}

執行結果
MFC程式設計(四)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章