mfc 的 clistctrl 显示item的最大长度

转自:http://bbs.csdn.net/topics/80015270


需要显示快1000个字符了,但是默认的clistctrl显示不完全。

网上说重绘控件,说重载settiemtex,getitemtext的都不行。

有人说重载DrawItem的可以。

操作如下:CMyListCtrl类从CListCtrl类派生,并重载DrawItem函数,在使用的地方把CListCtrl改为CMyListCtrl,并设置CMyListCtrl成员为重画风格(或在属性中选中Owner Draw fixed复选框),肯定行。

void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rcItem(lpDrawItemStruct->rcItem);
	int nItem = lpDrawItemStruct->itemID;
	COLORREF clrTextSave, clrBkSave;
	static _TCHAR szBuff[MaxSizeOneItem];//这里是你要显示的字符串长度,想多长有多长
	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT | LVIF_STATE;//LVIF_IMAGE |
	lvi.iItem = nItem;
	lvi.iSubItem = 0;
	lvi.pszText = szBuff;
	lvi.cchTextMax = sizeof(szBuff);
	lvi.stateMask = 0xFFFF;
	GetItem(&lvi);

	BOOL bSelected = (lvi.state & LVIS_SELECTED);
	CRect rcAllLabels;
	GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);
	if (bSelected)
	{
		clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
		clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
		pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
	}
	GetItemRect(nItem, rcItem, LVIR_LABEL);
	pDC->DrawText(szBuff, -1, rcItem, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);

	LV_COLUMN lvc;
	lvc.mask = LVCF_FMT | LVCF_WIDTH;
	for (int nColumn = 1; GetColumn(nColumn, &lvc); nColumn++)
	{
		rcItem.left = rcItem.right;
		rcItem.right += lvc.cx;

		int nRetLen = GetItemText(nItem, nColumn,
			szBuff, sizeof(szBuff));
		if (nRetLen == 0)
			continue;
		UINT nJustify = DT_LEFT;
		switch (lvc.fmt & LVCFMT_JUSTIFYMASK)
		{
		case LVCFMT_RIGHT:
			nJustify = DT_RIGHT;
			break;
		case LVCFMT_CENTER:
			nJustify = DT_CENTER;
			break;
		default:
			break;
		}
		pDC->DrawText(szBuff, -1, rcItem,
			nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
	}
	if (lvi.state & LVIS_FOCUSED)
		pDC->DrawFocusRect(rcAllLabels);
	if (bSelected)
	{
		pDC->SetTextColor(clrTextSave);
		pDC->SetBkColor(clrBkSave);
	}
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MFC CListCtrl控件可以响应多种事件,以下是常见的事件及其处理函数: 1. LVN_ITEMCHANGED:当列表项的选中状态改变时触发。可以使用以下代码处理: ``` void CMyDialog::OnItemChangedListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if ((pNMListView->uChanged & LVIF_STATE) && (pNMListView->uNewState & LVIS_SELECTED)) { // 处理选中项改变事件 } *pResult = 0; } ``` 2. LVN_COLUMNCLICK:当列表头的某一列被单击时触发。可以使用以下代码处理: ``` void CMyDialog::OnColumnClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; int nColumn = pNMListView->iSubItem; // 处理列单击事件 *pResult = 0; } ``` 3. LVN_BEGINLABELEDIT:当用户开始编辑某一项时触发。可以使用以下代码处理: ``` void CMyDialog::OnBeginLabelEditListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pLvdi = (LV_DISPINFO*)pNMHDR; LVITEM* pItem = &(pLvdi->item); *pResult = FALSE; // 设置为TRUE表示禁止编辑 } ``` 4. LVN_ENDLABELEDIT:当用户完成编辑某一项时触发。可以使用以下代码处理: ``` void CMyDialog::OnEndLabelEditListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pLvdi = (LV_DISPINFO*)pNMHDR; LVITEM* pItem = &(pLvdi->item); // 处理编辑完成事件 *pResult = 0; } ``` 5. LVN_ITEMACTIVATE:当用户双击某一项或按下回车键时触发。可以使用以下代码处理: ``` void CMyDialog::OnItemActivateListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // 处理项激活事件 *pResult = 0; } ``` 6. LVN_GETDISPINFO:当控件需要获取某一项的信息时触发。可以使用以下代码处理: ``` void CMyDialog::OnGetDispInfoListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NMLVDISPINFO* pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); LVITEM& lvItem = pDispInfo->item; // 设置项的信息 *pResult = 0; } ``` 7. LVN_DELETEITEM:当某一项被删除时触发。可以使用以下代码处理: ``` void CMyDialog::OnDeleteItemListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NMLISTVIEW* pNMLV = reinterpret_cast<NMLISTVIEW*>(pNMHDR); // 处理删除项事件 *pResult = 0; } ``` 以上是常见的事件及其处理函数,开发者可以根据实际需求选择相应的事件进行处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值