CListCtrl 自定义栅格(vc6)

本文介绍了一种自定义CListCtrl样式的实现方法,通过重写OnPaint函数并手动绘制每一项,实现了对列表视图背景、边框颜色及宽度的定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候需要自定义CListCtrl 的栅格,比如其颜色,宽度等,但是如果通过自定义画,宿主画均不能达到这种效果,这个时候只能通过自己来处理WM_PAINT消息来达到这种效果了,代码如下:

void CMyList::OnPaint() 
{
	
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here

	// Do not call CListCtrl::OnPaint() for painting messages
	CRect rect,txtRect;
	CPoint mypoint; 
	int chunk_height=GetCountPerPage();
	int nStart=GetTopIndex();

	CPen pen(PS_SOLID,1,RGB(200,200,100));

	dc.SelectObject(&pen);
	CFont *ft=GetFont();
	dc.SelectObject(ft);
	dc.SetBkMode(TRANSPARENT);

	CRect itemRC;
	GetClientRect(itemRC);
	for (int i=nStart;i<= (nStart + chunk_height);i++)
	{
		int nWidth=GetColumnWidth(0);
		GetItemPosition(i,&mypoint);
		rect.left = mypoint.x -2;
		rect.top  = mypoint.y-2;
		rect.right = mypoint.x + nWidth -2;
		GetItemPosition(i+1,&mypoint);
		rect.bottom =mypoint.y;

		dc.Rectangle(rect);

		CString szText=GetItemText(i,0);
		txtRect = rect;
		txtRect.DeflateRect(6,0);
		dc.DrawText(szText,txtRect,DT_LEFT );

		rect.left = rect.right ;
		nWidth=GetColumnWidth(1);
		rect.right = rect.left + nWidth ;		
		dc.Rectangle(rect);

		rect.left = rect.right ;
		nWidth=GetColumnWidth(2);
		rect.right = rect.left + nWidth ;		
		dc.Rectangle(rect);	
	

		rect.left = rect.right;
		rect.right = itemRC.right;
		dc.Rectangle(rect);	
	}
}


程序效果如下:

可修改颜色的一个CListCtrlCl类 部分函数如下所示 public: 行高 int m nRowHeight; int InsertColumn int nCol LPCTSTR lpszColumnHeading int nFormat LVCFMT LEFT int nWidth 1 int nSubItem 1 ; public: Gradient 渐变系数 立体背景用 不用渐变设为0 void SetHeaderBKColor int R int G int B int Gradient ; public: 设置表头高度 void SetHeaderHeight float Height ; CPtrList m ptrListCol; 保存列颜色 CPtrList m ptrListItem; 保存Item颜色表 CPtrList m colTextColor; 保存列字体颜色 CPtrList m ItemTextColor; 保存单元格字体颜色 bool FindColColor int col COLORREF &color ; 查找列颜色 bool FindItemColor int col int row COLORREF &color ; bool FindColTextColor int col COLORREF &color ; 查找列字体颜色 bool FindItemTextColor int col int row COLORREF &color ; void SetColColor int col COLORREF color ; 设置列颜色 void SetItemColor int col int row COLORREF color ; 设置Item颜色 void SetColTextColor int col COLORREF color ; 设置列文本颜色 void SetItemTextColor int col int row COLORREF color ; void SetRowHeigt int nHeight ; 设置行高 void SetHeaderFontHW int nHeight int nWith ; 设置表头字体大小 void SetHeaderTextColor COLORREF color ; COLORREF m color; BOOL SetTextColor COLORREF cr ; void SetFontHW int nHeight int nWith ; 设置字体的高和宽 void EraseItemColor int col int row ; stColor FindItemColor2 int col int row COLORREF &color ; void EraseAllColor ;">可修改颜色的一个CListCtrlCl类 部分函数如下所示 public: 行高 int m nRowHeight; int InsertColumn int nCol LPCTSTR lpszColumnHeading int nFormat LVCFMT LEFT int nWidth 1 int nSubItem 1 ; public: Gradient 渐变系数 立体背景用 不用渐变设为0 [更多]
VC6 CListCtrl继承类例子 oid CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 TCHAR lpBuffer[256]; LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM ; lvi.iItem = lpDrawItemStruct->itemID ; lvi.iSubItem = 0; lvi.pszText = lpBuffer ; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); LV_COLUMN lvc, lvcprev ; ::ZeroMemory(&lvc, sizeof(lvc)); ::ZeroMemory(&lvcprev, sizeof(lvcprev)); lvc.mask = LVCF_WIDTH | LVCF_FMT; lvcprev.mask = LVCF_WIDTH | LVCF_FMT; CDC* pDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rtClient; GetClientRect(&rtClient); for ( int nCol=0; GetColumn(nCol, &lvc); nCol++) { if ( nCol > 0 ) { // Get Previous Column Width in order to move the next display item GetColumn(nCol-1, &lvcprev) ; lpDrawItemStruct->rcItem.left += lvcprev.cx ; lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; } CRect rcItem; if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem)) continue; ::ZeroMemory(&lvi, sizeof(lvi)); lvi.iItem = lpDrawItemStruct->itemID; lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iSubItem = nCol; lvi.pszText = lpBuffer; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); CRect rcTemp; rcTemp = rcItem; if (nCol==0) { rcTemp.left -=2; } if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ; pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ; } else { COLORREF color; color = GetBkColor(); pDC->FillSolidRect(rcTemp,color); if (FindColColor(nCol,color)) { pDC->FillSolidRect(rcTemp,color); } if (FindItemColor(nCol,lpDrawItemStruct->itemID,color)) { pDC->FillSolidRect(rcTemp,color); } //pDC->SetTextColor(m_color); } pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT)); UINT uFormat = DT_CENTER ; if (m_Header.m_Format[nCol]=='0') { uFormat = DT_LEFT; } else if (m_Header.m_Format[nCol]=='1') { uFormat = DT_CENTER; } else if (m_Header.m_Format[nCol]=='2') { uFormat = DT_RIGHT; } TEXTMETRIC metric; pDC->GetTextMetrics(&metric); int ofst; ofst = rcItem.Height() - metric.tmHeight; rcItem.OffsetRect(0,ofst/2); pDC->SetTextColor(m_color); COLORREF color; if (FindColTextColor(nCol,color)) { pDC->SetTextColor(color); } if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color)) { pDC->SetTextColor(color); } CFont nFont ,* nOldFont; nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 nOldFont = pDC->SelectObject(&nFont); DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &rcItem, uFormat) ; pDC->SelectStockObject(SYSTEM_FONT) ; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值