예제 #1
0
/**********************************
*	函数名称:	SetColTextColor(int col,COLORREF color)
*	函数类型:	void
*	参数说明:	int col,COLORREF color:列号,颜色值
*	函数功能:	设置列表某一列的文本颜色
**********************************/
void CMyListCtrl::SetColTextColor(int col,COLORREF color)
{
	COLORREF cr;
	stColor Color;
	Color.nCol=col;
	Color.rgb=color;
	int nRet=FindColTextColor(col,cr);
	if(nRet>=0)
	{
		if(color==cr)
			return;
		m_colTextColor.RemoveAt(nRet,1);
	}
	m_colTextColor.Add(Color);
}
예제 #2
0
void 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) ;
	}

}
예제 #3
0
//CListCtrl控件的DrawItem消息
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

	// TODO:  添加您的代码以绘制指定项
	TCHAR lpBuffer[CELL_MAXLEN];
	int nRow=lpDrawItemStruct->itemID;
	
	LV_ITEM 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++)
	{
		HEADCELL* pHead=m_Head.FindHeadCell(nCol);
		CELLVALUE* pCell=m_val.GetAt(nRow,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;
		}

		//背景色
		CRect rcBk,rct;
		GetCellRect(nRow,nCol,rct);
		rcBk=rct;
		//////////////////////////////////////////////////////////////////////////
		if(nRow==0)	rcBk.top-=1;
		else		rcBk.top+=1;
		rcBk.bottom-=1;
		//////////////////////////////////////////////////////////////////////////
		COLORREF color;
		color = GetBkColor();
		pDC->FillSolidRect(rcBk,color);
		if(color==RGB(212,208,200)){
			rct.top-=1;
			rct.right+=1;
			pDC->DrawEdge(&rct,BDR_RAISEDINNER | EDGE_RAISED ,BF_RECT);
		}

		//列
		if(FindColColor(nCol,color)>-1)
		{
			pDC->FillSolidRect(rcBk,color);
			if(color==RGB(212,208,200)){
				rct.top-=1;
				rct.right+=1;
				pDC->DrawEdge(&rct,BDR_RAISEDINNER | EDGE_RAISED ,BF_RECT);
			}
		}
		//行
		if(FindRowColor(nRow,color)>-1)
		{
			pDC->FillSolidRect(rcBk,color);
			if(color==RGB(212,208,200)){
				rct.top-=1;
				rct.right+=1;
				pDC->DrawEdge(&rct,BDR_RAISEDINNER | EDGE_RAISED ,BF_RECT);
			}
		}
		//单元格
		if(FindItemColor(nCol,nRow,color)>-1)
		{
			pDC->FillSolidRect(rcBk,color);
			if(color==RGB(212,208,200)){
				rct.top-=1;
				rct.right+=1;
				pDC->DrawEdge(&rct,BDR_RAISEDINNER | EDGE_RAISED ,BF_RECT);
			}
		}
		//////////////////////////////////////////////////////////////////////////
		COLORREF colorBack=color;
		//////////////////////////////////////////////////////////////////////////

		UINT   uFormat = DT_CENTER;

		if (pHead && pHead->cFormat==0)
		{
			uFormat = DT_LEFT;
		}
		else if (pHead && pHead->cFormat==1)
		{
			uFormat = DT_CENTER;
		}
		else if (pHead && pHead->cFormat==2)
		{
			uFormat = DT_RIGHT;
		}
		TEXTMETRIC metric;
		pDC->GetTextMetrics(&metric);
		int ofst;
		ofst = rcItem.Height() - metric.tmHeight;
		rcItem.OffsetRect(0,ofst/2);
		//文本颜色!
		pDC->SetTextColor(RGB(0,0,0));

		//列
		if(FindColTextColor(nCol,color)>-1)
		{
			pDC->SetTextColor(color);
		}
		//行
		if(FindRowTextColor(nRow,color)>-1)
		{
			pDC->SetTextColor(color);
		}
		//单元格
		if(FindItemTextColor(nCol,nRow,color)>-1)
		{
			pDC->SetTextColor(color);
		}
		////////////////////////////////////////////////////////////////
		//选中状态!
		//if ( lpDrawItemStruct->itemState & ODS_SELECTED )//选中状态!
		////////////////////////////////////////////////////////////////
		//选中一列
		if(m_bColSelectedMode)
		{
			if(nCol==m_nColSelected)
			{
				this->GetSubItemRect(nRow,nCol,LVIR_BOUNDS,rct);
				pDC->FillSolidRect(&rct,RGB(234,236,245));

				if(nRow==0)
				{
					pDC->FillSolidRect(rct.left+2,rct.top+1,rct.Width()-3,2,RGB(10,36,106));
					pDC->FillSolidRect(rct.left+2,rct.top+1,2,rct.Height()+1,RGB(10,36,106));
					pDC->FillSolidRect(rct.right-3,rct.top+1,2,rct.Height()+1,RGB(10,36,106));
				}
				else if(nRow==GetItemCount()-1)
				{
					pDC->FillSolidRect(rct.left+2,rct.bottom-3,rct.Width()-3,2,RGB(10,36,106));
					pDC->FillSolidRect(rct.left+2,rct.top+1,2,rct.Height()-2,RGB(10,36,106));
					pDC->FillSolidRect(rct.right-3,rct.top+1,2,rct.Height()-2,RGB(10,36,106));
				}
				else
				{
					pDC->FillSolidRect(rct.left+2,rct.top,2,rct.Height()+1,RGB(10,36,106));
					pDC->FillSolidRect(rct.right-3,rct.top,2,rct.Height()+1,RGB(10,36,106));
				}
			}
		}
		//行选中
		if ( m_nCurSelected!=-1 && m_nCurSelected==nRow )
		{
			//选中一行
			if(m_bLineSelected)
			{
				CPen pen,*pOld;
				pen.CreatePen(PS_SOLID,2,RGB(10,36,106));
				CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建空画刷,防止遮挡内容;
				CBrush *pOldBrush;

				//先是每个单元绘制背景,然后再画一个透明背景的一行矩形框
				if(m_bLineSelectBkColor)
				{
					if(colorBack!=RGB(212,208,200) || nCol != 0){
						this->GetSubItemRect(nRow,nCol,LVIR_BOUNDS,rct);
						pDC->FillSolidRect(&rct,RGB(234,236,245));
					}
				}

				pOld=pDC->SelectObject(&pen);
				pOldBrush=pDC->SelectObject(pBrush);

				CRect rct;
				this->GetItemRect(nRow,&rct,LVIR_BOUNDS);
				FindColColor(0,colorBack);
				if(colorBack==RGB(212,208,200)){
					GetCellRect(nRow,0,rcBk);
					rct.left+=rcBk.Width();
				}
				//////////////////////////////////////////////////
				rct.top+=1;
				rct.left+=2;
				rct.bottom-=1;
				rct.right-=1;
				pDC->Rectangle(&rct);
				pDC->SetTextColor(RGB(0,0,255));
				pDC->SelectObject(pOldBrush);
				pDC->SelectObject(pOld);
				pen.DeleteObject();
			}
			//选中某一个单元
			else
			{
				if(m_nCurSelCol!=-1 && m_nCurSelCol==nCol)
				{
					CPen pen,*pOld;
					pen.CreatePen(PS_SOLID,2,RGB(10,36,106));
					CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建空画刷,防止遮挡内容
					CBrush *pOldBrush;

					pOld=pDC->SelectObject(&pen);
					pOldBrush=pDC->SelectObject(pBrush);

					CRect rct;
					rct=rcTemp;
					rct.top+=1;
					rct.left+=2;
					rct.bottom-=1;
					rct.right-=1;
					pDC->Rectangle(&rct);
			
					pDC->SelectObject(pOldBrush);
					pDC->SelectObject(pOld);
					pen.DeleteObject();
				}
			}
		}
		/////////////////////////////////////////////////////////////////
		//贴位图!
		CBitmap bmp,*pOldBmp;
		CDC memDC;
		memDC.CreateCompatibleDC(pDC);
		if(pCell)
		{
			CRect rect;
			GetCellRect(pCell->dwRow,pCell->dwCol,rect);
			if(pCell->nIDResource>0 && bmp.LoadBitmap(pCell->nIDResource))
			{
				BITMAP bm;
				bmp.GetBitmap(&bm);
				pOldBmp=memDC.SelectObject(&bmp);
				int offH=rect.Height()-bm.bmHeight;
				int offW=rect.Width()-bm.bmWidth;
				if(offH>0)
				{
					rect.top+=offH/2;
					rect.bottom-=(offH-offH/2);
				}
				if(offW>0)
				{
					rect.left+=offW/2;
					rect.right-=(offW-offW/2);
				}
				//显示
				pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,\
					bm.bmWidth,bm.bmHeight,SRCCOPY);
				//Clean
				memDC.SelectObject(pOldBmp);
				bmp.DeleteObject();
			}
		}
		//Clean
		memDC.DeleteDC();
		///////////////////////////////////////////////
		//文本字体
		CFont * pOldFont=NULL; 
		if(m_pFont!=NULL)
			pOldFont = pDC->SelectObject(m_pFont);

		int nFontID=FindColFont(nCol);
		if(nFontID>=0)
		{
			pDC->SelectObject(pOldFont);
			pOldFont=pDC->SelectObject(&m_pItemFont[nFontID].font);
		}

		nFontID=FindItemFont(nRow,nCol);
		if(nFontID>=0)
		{
			pDC->SelectObject(pOldFont);
			pOldFont=pDC->SelectObject(&m_pItemFont[nFontID].font);
		}
		//输出文本
		pDC->DrawText(lpBuffer,&rcItem,uFormat);
		//恢复字体
		if(pOldFont!=NULL)
			pDC->SelectObject(pOldFont);
		///////////////////////////////////////////////
		//更新
		if(pCell)
		{
			Update(nRow,nCol,lpBuffer);
		}
		///////////////////////////////////////////////
		//控件
	}
}