MFC List Control 控件

您所在的位置:网站首页 mfc编辑 MFC List Control 控件

MFC List Control 控件

2024-07-13 22:27| 来源: 网络整理| 查看: 265

tips:使用list Control控件的目的是:让数据进行多列展示。这里有一个需要注意:不能使用list Box,List Box 的多列展示,是指数据在一列展示不完的前提下,折叠到第二列进行展示。

1.多列设置

设置多个列头,类似平时我们word中所用列表的列头。

void knowledgeBaseDlg::AddCols(UINT id) { CRect rect; CWnd *wnd = NULL; wnd = GetDlgItem(id); if (NULL == wnd) { MessageBox(_T("相应控件不存在")); } wnd->GetWindowRect(&rect); ScreenToClient(&rect); int width = ((int)rect.right - (int)rect.left) / 5; m_list.InsertColumn(0, _T("跨径长度"), LVCFMT_CENTER, width, -1);// 插入列 m_list.InsertColumn(1, _T("参数名称"), LVCFMT_CENTER, width, -1); m_list.InsertColumn(2, _T("变量类型"), LVCFMT_CENTER, width, -1); m_list.InsertColumn(3, _T("变量值"), LVCFMT_CENTER, width, -1); m_list.InsertColumn(4, _T("变量代号"), LVCFMT_CENTER, width, -1); }

解释:1.在自己编辑的dialog中拖入list control控件

           2.为控件定义一个control类型的变量,名为m_list

           3.定义设置列头的函数,名为 AddCols(UINT id); id为当前编辑list control控件的id值。

           4.利用InsertColumn()函数,进行列头的设置,第一个参数代表列索引号,第二个代表你要填入列中的字符串,第三个代表字符串居中模式,该列的宽度。

tips:本文对列宽的设置,是对整个list的宽度求平均。也可以自行设置。可将

2.数据插入

在已有列头的前提下,对每个列中插入相应的数据。

void knowledgeBaseDlg::AddNewRols() { vector * m_vecMessage = NULL; m_vecMessage = new vector ;//定义一个容器,用来存放每一条记录 //查找数据库,获得数据类表 m_vecMessage->push_back(_T("6")); m_vecMessage->push_back(_T("台宽")); m_vecMessage->push_back(_T("公式")); m_vecMessage->push_back(_T("M+100")); m_vecMessage->push_back(_T("tdb")); //NormalMessageVector(A2W(sTempVaule.c_str()), m_vecMessage); for (int i = 0; i < 10; ++i) { m_list.InsertItem(i, m_vecMessage->at(0));//插入行 m_list.SetItemText(i, 1, m_vecMessage->at(1)); m_list.SetItemText(i, 2, m_vecMessage->at(2)); m_list.SetItemText(i, 3, m_vecMessage->at(3)); m_list.SetItemText(i, 4, m_vecMessage->at(4)); } }

解释:1.定义数据插入函数名为:AddNewRols()

           2.借助InsertItem()和SetItemText()对当前行进行数值插入。其中InsertItem()是插入新的一行的。SetItemText()是对新插入的这一行进行每列值的输入。这两个函数前两个参数代表第i行,第j列,第三个参数代表所要输入的数据值。这里数据值的类型为Cstring。

3.整行删除

void knowledgeBaseDlg::OnMenu1DeleteARow() { // TODO: 在此添加命令处理程序代码 删除整行选中的=============== int count = m_list.GetSelectedCount(); if(count > 0) { POSITION pos = m_list.GetFirstSelectedItemPosition(); while (pos != NULL) { int delId = m_list.GetNextSelectedItem(pos); m_list.DeleteItem(delId); } } }

解释:本文的做法是为list control控件添加一个菜单。在菜单中分别加入:删除、插入、编辑三个子菜单。

       1.首先在资源视图下加入一个Menu按钮。

       2.在当前菜单下加入三个删除、插入、编辑三个子菜单。并分别为每个子菜单添加事件处理程序

       3.在删除事件处理程序中,完成,查找当前所点击的行的索引值,再按照索引值进行删除的操作。

4.整行插入值

整行插入值,也就是插入当前行的每一列。本文具体操作的核心思想是,当进行插入、编辑操作时,进入到新的对话框,进行变量获取,从子对话框输入的值,直接存入到父对话框中,完成对列表中数值的编辑。

a.首先,添加新的dialog,在新的对话框中设计界面,设计所需要输入的变量,为每一个变量设计一个edit控件,并为每一edit控件添加一个CString类型的值。

b.在新的dialog中添加ok按钮,在ok按钮中,完成从编辑框取值,再将取到的值插入到父对话框中的list列表中去。

void ZSKInsert::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CEdit len;CEdit name;CEdit type;CEdit value;CEdit tag; knowledgeBaseDlg * parent = (knowledgeBaseDlg*)GetParent(); int nNowRow = parent->m_list.GetSelectedCount();//获取父列表当前被选中的列序号 CString len = L"", name = L"", type = L"", value = L"", tag = L""; GetDlgItemText(IDC_EDIT1, len);//获取用户输入的内容 GetDlgItemText(IDC_EDIT2, name); GetDlgItemText(IDC_EDIT3, type);//获取用户输入的内容 GetDlgItemText(IDC_EDIT4, value); GetDlgItemText(IDC_EDIT5, tag);//获取用户输入的内容 int nRow = parent->m_list.InsertItem(nNowRow, len);//插入的是某行的首列位置,返回的是该行的位置。 parent->m_list.SetItemText(nRow, 1, name);//写入某行第二列内容信息 parent->m_list.SetItemText(nRow, 2, type);//写入某行第二列内容信息 parent->m_list.SetItemText(nRow, 3, value);//写入某行第二列内容信息 parent->m_list.SetItemText(nRow, 4, tag);//写入某行第二列内容信息 CDialogEx::OnOK(); }

       c.为父对话框中的菜单中的子菜单-插入的事件响应程序引入子对话框这个实例,并将子对话框进行展示。

void knowledgeBaseDlg::OnMenu2InsertARow() { // TODO: 在此添加命令处理程序代码 ZSKInsert* dlg = new ZSKInsert(); dlg->Create(IDD_ZSKInsert_DIALOG, this); dlg->ShowWindow(SW_SHOW); }

5.对选中行进行编辑

这一项和整行插入相比,只多了一部分,就是将选中行的值展示在新的dialog的编辑框中。

如何将选中行的值展示在子对话框中,需要以下几步:1.在编辑菜单的事件处理函数中,获取当前所选取行的值,并将这些值传入到子对话框对象中;

void knowledgeBaseDlg::OnMenu3EditARow() { // TODO: 在此添加命令处理程序代码 CString len = _T(""), name = _T(""), type = _T(""), value = _T(""), tag = _T(""); //1.获取list当前所指向的行编号 //2.获得该行下的每一个str //3.将获得的str传递给子窗口 int nowRow = m_list.GetSelectedCount(); len = m_list.GetItemText(nowRow, 0); name = m_list.GetItemText(nowRow, 1); type = m_list.GetItemText(nowRow, 2); value = m_list.GetItemText(nowRow, 3); tag = m_list.GetItemText(nowRow, 4); ZSKInsert* dlg = new ZSKInsert(); dlg->m_len = len; dlg->m_name = name; dlg->m_tag = tag; dlg->m_type = type; dlg->m_value = value; dlg->Create(IDD_ZSKInsert_DIALOG, this); dlg->ShowWindow(SW_SHOW); }

2.在子对话框中的OnInitial()函数中,完成将值显示在编辑对话框中。

BOOL ZSKInsert::OnInitDialog() { CDialogEx::OnInitDialog(); //在子对话框中为每个编辑框添加变量 //将父对话框传入到子对话框的值显示出来 // TODO: 在此添加额外的初始化 SetDlgItemText(IDC_EDIT1, m_len); SetDlgItemText(IDC_EDIT2, m_name); SetDlgItemText(IDC_EDIT3, m_type); SetDlgItemText(IDC_EDIT4, m_value); SetDlgItemText(IDC_EDIT5, m_tag); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }

剩下的步骤可以参考插入的步骤,进行编辑

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3