如题,当然不在ListCtrl中也可以,只要有方法可以实现就好。
效果的例子就和资源管理器搜索后会标出目标文件内的搜索字符一类。
有看到简单重绘发现只有一行的颜色信息做不到具体部分文本的颜色更改。
http://www.codeproject.com/Articles/29064/CGridListCtrlEx-Grid-Control-Based-on-CListCtrl
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
}
}
}
运行,插入数据:
点击“删除选中”
可同时删除多行:
点击“删除选中”: