MFC List Control 控件 |
您所在的位置:网站首页 › mfc编辑 › MFC List Control 控件 |
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 |