VC中CListCtrl的报表设置

1 基本设置

右键属性,View设置为Report

添加标题,删除原始数据,设置字体,设置行高

cpp 复制代码
   //删除数据
	myList.DeleteAllItems();
	while (myList.DeleteColumn(0)) {}

	// 设置报表风格
	LONG lStyle = GetWindowLong(myList.m_hWnd, GWL_STYLE);
	lStyle &= ~LVS_TYPEMASK; 
	lStyle |= LVS_REPORT;
	SetWindowLong(myList.m_hWnd, GWL_STYLE, lStyle);	

	// 配置扩展样式
	DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
	myList.SetExtendedStyle(dwExStyle);

	/*CFont f; 
	f.CreatePointFont(160,"仿宋");
	myList.SetFont(&f);*/

    //设置行高
	CImageList   m_l;   
	m_l.Create(1,38,TRUE|ILC_COLOR32,1,0);  //38是行高 
	myList.SetImageList(&m_l,LVSIL_SMALL); 


	// 添加列标题
	//行号
	myList.InsertColumn(0, _T("行号"), LVCFMT_CENTER, 60);

	//类型:1、2字节,itype,空或者为-1,-2,...,-n
	myList.InsertColumn(1, _T("类型"), LVCFMT_CENTER, 60);

	//结点名称: 4个A6,     
	myList.InsertColumn(2, _T("结点1"), LVCFMT_CENTER, 80);	 
	myList.InsertColumn(3, _T("结点2"), LVCFMT_CENTER, 80);
	myList.InsertColumn(5, _T("结点3"), LVCFMT_CENTER, 70);	 
	myList.InsertColumn(6, _T("结点4"), LVCFMT_CENTER, 70);

2 添加数据

cpp 复制代码
value.Format("  %d",it->first);

//插入最后一行,并设置0列数
int nRow = myList.InsertItem(myList.GetItemCount(), _T(value));

//设置插入行的后几列数据
for(UINT j=0;j<myVector.size();++j)
{ 						
  value=myVector[j].Trim();
  myList.SetItemText(nRow, 1+j, _T(value));
}			

3 设置斑马效果(不同行不同颜色)

添加Customdraw事件

cpp 复制代码
void DialogParseAtp::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
	*pResult = CDRF_DODEFAULT;

	if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
	{
		*pResult = CDRF_NOTIFYITEMDRAW;
	}
	else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
	{
		*pResult = CDRF_NOTIFYSUBITEMDRAW;
	}
	else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
	{

		COLORREF clrNewTextColor, clrNewBkColor;

		int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );

		POSITION pos = myList.GetFirstSelectedItemPosition();
		int index = myList.GetNextSelectedItem(pos);

		if (index == nItem)//如果要刷新的项为当前选择的项,则将文字设为白色,背景色设为蓝色
		{
			clrNewTextColor = RGB(255,255,255);  //Set the text to white
			clrNewBkColor = RGB(49,106,197);     //Set the background color to blue
		}
		else if (nItem % 2) //奇偶行隔行变色
		{
			clrNewTextColor = RGB(0,0,255);      //set the text black
			clrNewBkColor = RGB(250,250,245);    //leave the background color white
		}
		else
		{
			clrNewTextColor = RGB(0,0,0);        //set the text black
			clrNewBkColor = RGB(255,255,255);    //leave the background color white
		}

		pLVCD->clrText = clrNewTextColor;
		pLVCD->clrTextBk = clrNewBkColor;

		*pResult = CDRF_DODEFAULT;
	}
}

4 设置双击修改单元格(本质是移动创建的编辑框,双击时定位显示,回车写入,其他时候隐藏)

先添加控件,定义变量,设置回车响应函数(默认是窗口的OK按钮,CTRL+D编号为1的按钮)

Default Button-->True ;Visible-->False

CEdit myEdit;

int m_Col;

int m_Row;

cpp 复制代码
void DialogParseAtp::OnBnClickedOk()
{	
	if(m_Row >=0 && m_Col >=0) // 选择子项
	{
		CString mystr;
		myEdit.GetWindowText(mystr);
		mystr=mystr.Trim();
		myList.SetItemText(m_Row, m_Col,mystr.GetBuffer());
		
		myEdit.ShowWindow(SW_HIDE); 

		m_Row=-1;
		m_Col=-1;

		AfxMessageBox("修改成功!");
	}
}

然后 添加双击事件

cpp 复制代码
void DialogParseAtp::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

	// 获取选中位置
	m_Row = pNMItemActivate->iItem;  // 行号
	m_Col = pNMItemActivate->iSubItem; // 列号

	myEdit.ShowWindow(SW_HIDE);
	myTxtEdit.SetWindowText("");

	if(m_Row >=0 && m_Col >=1) // 选择子项
	{
		CRect rc;
		// 获取单元格矩形区域
		myList.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);

		// 创建并显示编辑控件
		myEdit.SetParent(&myList);
		myEdit.MoveWindow(rc);
		myEdit.SetWindowText(myList.GetItemText(m_Row, m_Col));
		myEdit.ShowWindow(SW_SHOW);
		myEdit.SetFocus();
		
	}
	*pResult = 0;
}
相关推荐
wuchen10049 个月前
MFC 的 CListCtrl 控件,使用SetItemState 方法来设置选中某个 item,如何达到效果和鼠标点击一致
mfc·clistctrl·选中背景
shanql2 年前
CListCtrl中高亮插入行,条目上移下移
clistctrl