赞
踩
MFC列表控件ListCtrl如图:
列表控件ListCtrl样式属性(风格)有:
Icon大图标,SmallIcon小图标、List列表、Report报告 ,但今天只谈Report报告样式:
1.
(1)InsertItem --- 插入一个主项(行) (2)DeleteItem --- 删除一个主项 (行) (3)InsertColumn --- 插入一个列 (4)DeleteColumn --- 删除一个列 (索引从0开始) (5)SetItemText --- 设置子项文本 (6)GetItemText --- 获得子项文本 (7)GetItemCount --- 获得项目的总数(总行数目) (8)SetImageList --- 把图像列表与列表控件关联(设置列表图标需要) ------------------------------------------------------- 用法: (1)InsertItem() //插入一行 // 可以插入图片(失败则图片不能显示) int InsertItem(const LVITEM* pItem); // 插入文字 int InsertItem( int nItem, //第几行 LPCTSTR lpszItem //该行第1列的文字 ); ------------------------------------------------------- (2)DeleteItem(iItem); //根据行号删除某行。 注意:若要删除多行时,需要从后面开始删除,因为如果从前面开始删除的话,下面的行会往上移,原来第1行就变成了第0行。 错误删法: m_listctrl.DeleteItem(0); m_listctrl.DeleteItem(1) 正确删法: m_listctrl.DeleteItem(1); m_listctrl.DeleteItem(0); ------------------------------------------------------- (3)InsertColumn() //插入1列 int InsertColumn( int nCol, // 第几列 LPCTSTR lpszColumnHeading, //列名 int nFormat = LVCFMT_LEFT, // 对齐的方式 int nWidth = -1, //该列的宽度 int nSubItem = -1 //子项的索引与列(一般缺省默认即可,可不填) ); 对齐的方式有3种: LVCFMT_LEFT (左对齐) LVCFMT_CENTER (居中) LVCFMT_RIGHT (右对齐) ------------------------------------------------------- (4)DeleteColumn --- 删除一个列 (索引从0开始) //注意:删除多列要从后往前删,否则出错 for(int k=2;k>=0;k--) m_ListCtrl.DeleteColumn(k); ------------------------------------------------------- (5)SetItemText() //设置文字 BOOL SetItemText( int nItem, //第几行 int nSubItem, //低级列 LPCTSTR lpszText //文字内容 ); -------------------------------------------------------
2.设置列表控件的扩展样式
SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES) ;
常用的扩展样式:
LVS_EX_GRIDLINES---网格线
LVS_EX_CHECKBOXES---每一行的最前面带个复选框
LVS_EX_FULLROWSELECT---整行选中
LVS_EX_HEADERDRAGDROP---列表头可以拖动(改变位置)
1.如图,布局界面
2.关联变量
“备注”编辑框ID改为:IDC_EDIT_DATA5
“总数”编辑框ID改为:IDC_EDIT2_TOTAL
3.在对话框初始化函数OnInitDialog()中设置列表控件的风格、插入表头、设置列宽等
代码如下:
BOOL CTestListCtrlDlg::OnInitDialog() { CDialog::OnInitDialog(); //XXXXXX //默认代码 //XXXXXX // TODO: Add extra initialization here EnableWindowSet(FALSE); //默认某些按钮初始化为禁用 //属性:网格线、整行选中、CheckBox、列表头可以拖动(改变位置) m_ListData.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES |LVS_EX_HEADERDRAGDROP); //插入表头/列名 m_ListData.InsertColumn(0,_T("日期"),LVCFMT_CENTER); m_ListData.InsertColumn(1,_T("星期"),LVCFMT_CENTER); m_ListData.InsertColumn(2,_T("时间"),LVCFMT_CENTER); m_ListData.InsertColumn(3,_T("Data1"),LVCFMT_CENTER); m_ListData.InsertColumn(4,_T("Data2"),LVCFMT_CENTER); m_ListData.InsertColumn(5,_T("Data3"),LVCFMT_CENTER); m_ListData.InsertColumn(6,_T("Data4"),LVCFMT_CENTER); m_ListData.InsertColumn(7,_T("备注"),LVCFMT_CENTER); //设置列宽 m_ListData.SetColumnWidth(0,80); m_ListData.SetColumnWidth(1,80); m_ListData.SetColumnWidth(2,80); m_ListData.SetColumnWidth(3,95); m_ListData.SetColumnWidth(4,95); m_ListData.SetColumnWidth(5,95); m_ListData.SetColumnWidth(6,95); m_ListData.SetColumnWidth(7,80); if (m_ListData.GetItemCount()<=0) { //总数默认为0 GetDlgItem(IDC_EDIT2_TOTAL)->SetWindowText(_T("0")); } return TRUE; // return TRUE unless you set the focus to a control }
4.为按钮“插入数据”添加单击事件:
void CTestListCtrlDlg::OnButtonInsert()
{
EnableWindowSet(TRUE); //启用右边按钮等控件
}
EnableWindowSet函数:
//禁用或启用相关控件 void CTestListCtrlDlg:: EnableWindowSet(BOOL show) { if (show) { GetDlgItem(IDC_STATIC1)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_DATA1)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC2)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_DATA2)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC3)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_DATA3)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC4)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_DATA4)->EnableWindow(TRUE); GetDlgItem(IDC_Tip)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_DATA5)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_ENSURE_INSERT)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_OK)->EnableWindow(TRUE); }else{ GetDlgItem(IDC_STATIC1)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_DATA1)->EnableWindow(FALSE); GetDlgItem(IDC_STATIC2)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_DATA2)->EnableWindow(FALSE); GetDlgItem(IDC_STATIC3)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_DATA3)->EnableWindow(FALSE); GetDlgItem(IDC_STATIC4)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_DATA4)->EnableWindow(FALSE); GetDlgItem(IDC_Tip)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_DATA5)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_ENSURE_INSERT)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_OK)->EnableWindow(FALSE); } }
隐藏或显示相关控件为:
5.“插入数据”按钮:
//确定插入数据 void CTestListCtrlDlg::OnButtonEnsureInsert() { //或取系统时间 SYSTEMTIME SystemTime; GetLocalTime(&SystemTime); //年月日 CString strDate; strDate.Format(_T("%d/%d/%d"),SystemTime.wYear,SystemTime.wMonth,SystemTime.wDay); //星期 CString strDayOfWeek; switch(SystemTime.wDayOfWeek) { case 1 :strDayOfWeek = _T("星期一"); break; case 2 :strDayOfWeek = _T("星期二"); break; case 3 :strDayOfWeek = _T("星期三"); break; case 4 :strDayOfWeek = _T("星期四"); break; case 5 :strDayOfWeek = _T("星期五"); break; case 6 :strDayOfWeek = _T("星期六"); break; case 7 :strDayOfWeek = _T("星期日"); break; default:; } //从右侧编辑框中获取输入的数据,再插入到列表框中 CString TempmData1; CString TempmData2; CString TempmData3; CString TempmData4; CString TempmData5; GetDlgItem(IDC_EDIT_DATA1)->GetWindowText(TempmData1); GetDlgItem(IDC_EDIT_DATA2)->GetWindowText(TempmData2); GetDlgItem(IDC_EDIT_DATA3)->GetWindowText(TempmData3); GetDlgItem(IDC_EDIT_DATA4)->GetWindowText(TempmData4); GetDlgItem(IDC_EDIT_DATA5)->GetWindowText(TempmData5); int Num = m_ListData.GetItemCount();//获取项目的总数(总行数目) CString str; str.Format(_T(" %d"),Num+1); GetDlgItem(IDC_EDIT2_TOTAL)->SetWindowText(str); TempmData5+=str; //插入数据 注意:ListView控件第一列无法居中,如果需要第一列居中,则第一列宽度设为0,从第二开始使用。 CString strTime; strTime.Format(_T("%2d:%02d:%2d"),SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond); m_ListData.InsertItem(0,strDate);//插入一个主项(行) 并将数据(日期)写入第一列 m_ListData.SetItemText(0,1,strDayOfWeek);//设置子项文本:星期 m_ListData.SetItemText(0,2,strTime); //时间 m_ListData.SetItemText(0,3,TempmData1); m_ListData.SetItemText(0,4,TempmData2); m_ListData.SetItemText(0,5,TempmData3); m_ListData.SetItemText(0,6,TempmData4); m_ListData.SetItemText(0,7,TempmData5); CString strWarn; strWarn = m_ListData.GetItemText(0, 7);//获得子项文本:第一行第7个内容 //AfxMessageBox(strWarn); GetDlgItem(IDC_EDIT_DATA5)->SetWindowText(_T(""));//清空备注 UpdateData(FALSE); }
6.“完成”按钮:
void CTestListCtrlDlg::OnButtonOk()
{
EnableWindowSet(FALSE); //禁用右边按钮等控件
}
运行,点击“插入数据”按钮,右边控件启用,输入数据及备注,点击插入即可完成数据的插入:
注意:表头有复选框是因为初始化时,LVS_EX_CHECKBOXES 风格的作用:
m_ListData.SetExtendedStyle(
LVS_EX_GRIDLINES|
LVS_EX_FULLROWSELECT|
LVS_EX_CHECKBOXES //复选框
7.增加“全选”,“反选”,“全不选”功能:
添加3个单选框radio,通过类向导为其添加点击事件:
“全选”:
void CTestListCtrlDlg::OnRADIO_AllSELECT()
{
for (int i=0;i<m_ListData.GetItemCount();i++)
{
m_ListData.SetCheck(i,TRUE); //全部设置为选中状态
m_ListData.SetItemState(i,LVIS_SELECTED, LVIS_SELECTED);
}
}
“反选”
void CTestListCtrlDlg::OnRadio_Unselect() { BOOL state; for (int i=0;i<m_ListData.GetItemCount();i++) { state = m_ListData.GetCheck(i);//获取复选框的状态(打钩否) if (state == FALSE) //若未选中,则全选中 { m_ListData.SetCheck(i,TRUE);//设置复选框的状态(打钩否) m_ListData.SetItemState(i,LVIS_SELECTED, LVIS_SELECTED);//设置某一行的状态(选中否) //GetItemState()获取某一行的状态(选中否) }else { m_ListData.SetItemState(i, ~LVIS_SELECTED, LVIS_SELECTED); m_ListData.SetCheck(i, FALSE); } } }
“全不选”
void CTestListCtrlDlg::OnRADIO_AllNOSELECT()
{
for (int i=0;i<m_ListData.GetItemCount();i++)
{
m_ListData.SetCheck(i,FALSE);
m_ListData.SetItemState(i,LVIS_SELECTED, LVIS_SELECTED);
}
}
8.增加“删除选中”功能:
void CTestListCtrlDlg::OnButtonDeletedata() { int nItem; POSITION pos; while (pos = m_ListData.GetFirstSelectedItemPosition()) { nItem = -1; nItem = m_ListData.GetNextSelectedItem(pos); if (nItem >= 0 && m_ListData.GetSelectedCount() > 0) { m_ListData.DeleteItem(nItem); CString strNum1; strNum1.Format(_T("%d"),nItem+1); // AfxMessageBox(strNum1); int i=m_ListData.GetSelectionMark();//获得选中行的行标 // m_ListData.SetSelectionMark(-1);//取消选中行 CString strNum; strNum.Format(_T("%d"),i); GetDlgItem(IDC_EDIT_LINENUM)->SetWindowText(strNum) ; //m_List.GetItemState();//从后向前遍历数据,获取被选中行的行号iItem } } }
运行,插入数据:
点击“删除选中”
可同时删除多行:
点击“删除选中”:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。