⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfxlistctrl.cpp

📁 一个多线程的网络数据采集系统(客户端)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	COLORREF crBck = crBackSel;
	COLORREF crBaseTextColor = bSelected ? GetSysColor(COLOR_HIGHLIGHTTEXT) : GetSysColor(COLOR_BTNTEXT);

	clrTextSave = pDC->SetTextColor(crBaseTextColor);

	int isCategory = pCategoryManager->IsListItemACategory(lvi.lParam);

	if (m_bitmap.m_hObject != NULL)
	{
		int isdc = pDC->SaveDC();

		CDC tempDC;
		tempDC.CreateCompatibleDC(pDC);
		tempDC.SelectObject(&m_bitmap);

		CRect rcClient;
		GetClientRect(&rcClient);

		CRgn rgnBitmap;
		CRect rcTmpBmp(rcItem);
		rcTmpBmp.right = rcClient.right;
		// We also need to check whether it is the last item
		// The update region has to be extended to the bottom if it is
		if (nItem == GetItemCount() - 1) rcTmpBmp.bottom = rcClient.bottom;

		rgnBitmap.CreateRectRgnIndirect(&rcTmpBmp);
		pDC->SelectClipRgn(&rgnBitmap);
		rgnBitmap.DeleteObject();
		
		if (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL)
		{
			pDC->SelectPalette(&m_pal, FALSE);
			pDC->RealizePalette();
		}

		CRect rcFirstItem;
		GetItemRect(0, rcFirstItem, LVIR_BOUNDS);
		for (int i = rcFirstItem.left; i < rcClient.right; i += m_cxBitmap)
			for (int j = rcFirstItem.top; j < rcClient.bottom; j += m_cyBitmap)
				pDC->BitBlt( i, j, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY);

		pDC->RestoreDC(isdc);
	}


	if (bSelected)
	{
		clrBkSave=pDC->SetBkColor(crBck);

		if (!bBlendBitmap || m_bitmap.m_hObject == NULL || isCategory >= 0)
			pDC->FillSolidRect(rcAllLabels, crBck);
		else
		{
			CRect rcFirstItem;
			GetItemRect(0, rcFirstItem, LVIR_BOUNDS);

			int isdc = pDC->SaveDC();

			CRgn rgnBitmap;
			rgnBitmap.CreateRectRgnIndirect(&rcAllLabels);
			pDC->SelectClipRgn(&rgnBitmap);
			rgnBitmap.DeleteObject();

			for (int i = rcAllLabels.left; i < rcAllLabels.right; i += m_cxBitmap)
				for (int j = rcFirstItem.top; j < rcAllLabels.bottom; j += m_cyBitmap)
					if (j + m_cyBitmap > rcAllLabels.top) cBackImage.Draw(pDC, 0, CPoint(i, j), ILD_BLEND25);
			
			pDC->RestoreDC(isdc);
		}
	}
	else if (isCategory >= 0)
	{
		clrBkSave=pDC->SetBkColor(cr3dFace);
		pDC->FillSolidRect(rcAllLabels, cr3dFace);
	}
	else if (m_bitmap.m_hObject == NULL) pDC->FillSolidRect(rcAllLabels, m_clrTextBk);

	if (isCategory >= 0)
	{
		CRect rcButton(rcAllLabels.left + 3, rcAllLabels.top + (rcAllLabels.Height() - 12) / 2, rcAllLabels.left + 15, rcAllLabels.top + (rcAllLabels.Height() - 12) / 2 + 12);
		pDC->Draw3dRect(rcButton, RGB(255,255,255), RGB(0,0,0));
		rcButton.InflateRect(-1,-1);
		pDC->Draw3dRect(rcButton, RGB(192,192,192),RGB(128,128,128));
		rcButton.InflateRect(-1,-1);
		pDC->FillSolidRect(rcButton, RGB(192,192,192));
		CPen cBlackPen(PS_SOLID, 1, RGB(0,0,0));
		CPen cDkGrayPen(PS_SOLID, 1, RGB(128,128,128));
		CPen * open = pDC->SelectObject(&cBlackPen);
		
		pDC->MoveTo(rcAllLabels.left + 5, rcButton.top + 3);
		pDC->LineTo(rcAllLabels.left + 5 + 7, rcButton.top + 3);;

		if (!(pCategoryManager->pCategory[isCategory].bExpanded))
		{
			pDC->MoveTo(rcAllLabels.left + 8, rcButton.top);
			pDC->LineTo(rcAllLabels.left + 8, rcButton.top + 7);

			pDC->SelectObject(&cDkGrayPen);
			pDC->MoveTo(rcAllLabels.left, rcItem.bottom - 1);
			pDC->LineTo(rcAllLabels.right-1, rcItem.bottom - 1);
		}
		else
		{
			pDC->SelectObject(&cDkGrayPen);
			pDC->MoveTo(rcAllLabels.left+16, rcItem.bottom - 1);
			pDC->LineTo(rcAllLabels.right-1, rcItem.bottom - 1);
		}

		pDC->SelectObject(open);

		rcAllLabels.left += 20;
		pDC->DrawText(csItem, -1, rcAllLabels, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
		return;
	}

	if(lvi.state & LVIS_CUT)
	{
		clrImage=m_clrBkgnd;
		uiFlags|=ILD_BLEND50;
	}
	else if (bSelected)
	{
		clrImage=crBck;
		uiFlags|=ILD_BLEND50;
	}

	UINT nStateImageMask=lvi.state & LVIS_STATEIMAGEMASK;
	if(nStateImageMask)
	{
		int nImage=(nStateImageMask>>12)-1;
		pImageList=GetImageList(LVSIL_STATE);
		if(pImageList) pImageList->Draw(pDC,nImage,CPoint(rcItem.left,rcItem.top),ILD_TRANSPARENT);
	}
	CRect rcIcon;
	GetItemRect(nItem,rcIcon,LVIR_ICON);
	pImageList=GetImageList(LVSIL_SMALL);
	if(pImageList)
	{
		UINT nOvlImageMask=lvi.state & LVIS_OVERLAYMASK;
		if(rcItem.left<rcItem.right-1) ImageList_DrawEx(pImageList->m_hImageList,lvi.iImage,pDC->m_hDC,rcIcon.left,rcIcon.top,16,rcIcon.Height()-1,m_clrBkgnd,clrImage,uiFlags | nOvlImageMask);
	}
	LV_COLUMN lvc;
	lvc.mask=LVCF_FMT | LVCF_WIDTH;
	GetColumn(0,&lvc);
	UINT nJustify1 = DT_LEFT;
	switch(lvc.fmt & LVCFMT_JUSTIFYMASK)
	{
	case LVCFMT_RIGHT: nJustify1=DT_RIGHT;
					   break;
	case LVCFMT_CENTER:nJustify1=DT_CENTER;
					   break;
	}
	
	GetItemRect(nItem, rcItem,LVIR_LABEL);
	rcItem.right -= m_cxStateImageOffset;
//	MakeShortString(pDC, csItem, rcItem.right-rcItem.left, 2*OFFSET_FIRST);
	rcLabel = rcItem;
	rcLabel.left += OFFSET_FIRST;
	rcLabel.right -= OFFSET_FIRST;

	CFont * oldFont = pDC->SelectObject(&ftNormal);

	clrTextSave = pDC->SetTextColor(crBaseTextColor);

	LXHDREX	lxhd;

	int iFirstColISubItem = GetColumnIndex(0);

	if (dwFlag&fExInfo)
	{
		lxhd.iNotifyCode = NTEX_ITEMINFO;
		lxhd.CtrlId = iCtrlId < 0 ? GetDlgCtrlID() : iCtrlId;
		lxhd.iItem = nItem;
		lxhd.iSubItem = iFirstColISubItem;
		lxhd.dwFlag = 0;
		lxhd.dwItemData = dwItemData;
	}

	int cxLittleBox = 0;
	{
		if (NeedColExInfo(0)) AskForInfo(&lxhd, pDC);

		if (dwFlag&fShowSelCell && iSubItemFocus == 0 && lvi.state&LVIS_FOCUSED)
		{
			if (!(dwFlag&fExInfo && lxhd.dwFlag&LXHDREX::exTextColor))
				pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
		}
//		if (iSubItemFocus == 0 && lvi.state&LVIS_FOCUSED) pDC->FillSolidRect(rcLabel, m_clrTextBk);
		if (isCategory < 0)
		{
			CRect rcLittleBox(rcLabel);
			rcLittleBox.left = 0;
			pDC->FillSolidRect(rcLittleBox, cr3dFace);
			cxLittleBox = rcLittleBox.Width();
			CPen cDkGrayPen(PS_SOLID, 1, RGB(128,128,128));
			CPen * open = pDC->SelectObject(&cDkGrayPen);
			
			pDC->MoveTo(rcLittleBox.right, rcLittleBox.top);
			pDC->LineTo(rcLittleBox.right, rcLittleBox.bottom);

			pDC->SelectObject(open);
		}
		if (rcItem.left < clipBox.right && rcItem.right > clipBox.left)
		{
			if (dwFlag&fSubItemImages && dwhImages & 1 << iFirstColISubItem) 
			{
				int nImage = atoi(csItem);
				pImageList=pItemImageList;
			}
		}

		if ((dwFlag&fExInfo && lxhd.dwFlag&LXHDREX::exTextColor) && !(dwFlag&fExInfoOnRow)) 
			pDC->SetTextColor(crBaseTextColor);
	}

	int nColumnCount = GetColumnCount();

	bool bVert = dwFlag & fVertGrid ? true : false;
	bool bHorz = dwFlag & fHorizGrid ? true : false;


	for (int nColumn = 1; nColumn < nColumnCount; nColumn++)
	{
		GetColumn(nColumn,&lvc);
		rcItem.left=rcItem.right;
		rcItem.right+=lvc.cx;

		if (rcItem.left < clipBox.right && rcItem.right > clipBox.left)
		{
			GetItemTextEx(nItem, nColumn, csItem, &dwItemData);

			if (csItem != "")
			{
//				MakeShortString(pDC, csItem, rcItem.right-rcItem.left,2*OFFSET_OTHER);

				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;
				}

				rcLabel=rcItem;
				rcLabel.left+=OFFSET_OTHER;
				rcLabel.right-=OFFSET_OTHER;

				if (dwFlag&fShowSelCell && iSubItemFocus == nColumn && lvi.state&LVIS_FOCUSED) pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT)); else pDC->SetTextColor(crBaseTextColor);

				if (NeedColExInfo(nColumn))
				{
					lxhd.iNotifyCode = NTEX_ITEMINFO;
					lxhd.iSubItem = GetColumnIndex(nColumn);
					AskForInfo(&lxhd, pDC);
				}

				if (dwFlag&fShowSelCell && iSubItemFocus == nColumn && lvi.state&LVIS_FOCUSED)
				{
					rcItem.left --;
					pDC->FillSolidRect(rcItem, m_clrTextBk);
					rcItem.left ++;
				}

				if (dwFlag&fSubItemImages && dwhImages & 1 << GetColumnIndex(nColumn)) 
				{
					int nImage = atoi(csItem);
					pImageList=pItemImageList;
					if(pImageList)
					{
						IMAGEINFO ii;
						pImageList->GetImageInfo(nImage, &ii);
						CRect rcIma(ii.rcImage);

						int x = rcLabel.left + (rcLabel.Width() - rcIma.Width()) / 2;
						int y = rcLabel.top + (rcLabel.Height() - rcIma.Height()) / 2;

						UINT nOvlImageMask=lvi.state & LVIS_OVERLAYMASK;
						if(rcLabel.left<rcLabel.right-1) 
							ImageList_DrawEx(pImageList->m_hImageList,nImage,pDC->m_hDC,x,y,rcIma.Width(),rcIma.Height()-1,m_clrBkgnd,clrImage,uiFlags | nOvlImageMask);
					}
				}
				else
				{
					pDC->DrawText(csItem,-1,rcLabel,nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER | DT_END_ELLIPSIS);
				}

				if (dwFlag&fExInfo && lxhd.dwFlag&LXHDREX::exTextColor) pDC->SetTextColor(crBaseTextColor);
				else if (iSubItemFocus >= 0 && lvi.state&LVIS_FOCUSED)
				{
					pDC->SetTextColor(crBaseTextColor);
				}
			}
			else
			{
				if (dwFlag&fShowSelCell && iSubItemFocus == nColumn && lvi.state&LVIS_FOCUSED)
					pDC->FillSolidRect(rcItem, m_clrTextBk);
			}
			if (bVert)
			{
				pDC->MoveTo(rcItem.right-1, rcItem.bottom - 1);
				pDC->LineTo(rcItem.right-1, rcItem.top-1);
			}
		}
		else 
		{
			if (rcItem.left >= clipBox.right) break;
		}
	}
	if (dwFlag & fAllowDivider)
	{
		LXHDREX_DIV lxhd1(&lxhd);
		lxhd1.iNotifyCode = NTEX_DIVIDER;
		lxhd1.rcItem = rcAllLabels;
		lxhd1.pDC = pDC;

		if (!SendInfoExMsg((LXHDREX *)(&lxhd1)))
		{
			if (bHorz)
			{
				pDC->MoveTo(rcAllLabels.left + cxLittleBox, rcItem.bottom - 1);
				pDC->LineTo(rcAllLabels.right-1, rcItem.bottom - 1);
			}
		}
	}
	else
	{
		if (bHorz)
		{
			pDC->MoveTo(rcAllLabels.left + cxLittleBox, rcItem.bottom - 1);
			pDC->LineTo(rcAllLabels.right-1, rcItem.bottom - 1);
		}
	}

	if (lvi.state&LVIS_FOCUSED) 
	{
		if (isCategory < 0) rcAllLabels.left += cxLittleBox;
		pDC->SetTextColor(RGB(0,0,0));
		rcAllLabels.bottom --;
		pDC->FrameRect(rcAllLabels, pDC->GetHalftoneBrush());
	}

	if(bSelected) pDC->SetBkColor(clrBkSave);

	pDC->SetTextColor(clrTextSave);
	pDC->SelectObject(opn);

	pDC->SelectObject(oldFont);
}


void CGfxListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	if (pCategoryManager)
	{
		DrawItemCategory(lpDrawItemStruct);
		return;
	}

	CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rcItem(lpDrawItemStruct->rcItem);
	UINT uiFlags=ILD_TRANSPARENT;
	CImageList* pImageList;
	int nItem=lpDrawItemStruct->itemID;
	BOOL bFocus=(GetFocus()==this);
	COLORREF clrTextSave, clrBkSave;
	COLORREF clrImage=m_clrBkgnd;

	LV_ITEM lvi;
	lvi.mask=LVIF_IMAGE | LVIF_STATE;
	lvi.iItem=nItem;
	lvi.iSubItem=0;
	lvi.stateMask=0xFFFF;		// get all state flags
	GetItem(&lvi);

	CRect clipBox;
	pDC->GetClipBox(clipBox);

	CString csItem;
	DWORD dwItemData = GetItemData(nItem);
	GetItemTextEx(nItem, 0, csItem, &dwItemData);

	BOOL bSelected=(bFocus || (GetStyle() & LVS_SHOWSELALWAYS)) && lvi.state & LVIS_SELECTED;
	bSelected=bSelected || (lvi.state & LVIS_DROPHILITED);
	CRect rcAllLabels;
	GetItemRect(nItem,rcAllLabels,LVIR_BOUNDS);
	CRect rcLabel;
	GetItemRect(nItem,rcLabel,LVIR_LABEL);
	rcAllLabels.bottom -= iAutoPreviewHeight;
	rcLabel.bottom -= iAutoPreviewHeight;

	if (dwFlag&fHighRowSelect && rcAllLabels.right<m_cxClient) rcAllLabels.right = m_cxClient;

	CPen *opn = pDC->SelectObject(gpn);

	COLORREF crBck = crBackSel;

	COLORREF crBaseTextColor = bSelected ? GetSysColor(COLOR_HIGHLIGHTTEXT) : GetSysColor(COLOR_BTNTEXT);

	clrTextSave = pDC->SetTextColor(crBaseTextColor);


	if (m_bitmap.m_hObject != NULL)
	{
		CDC tempDC;
		tempDC.CreateCompatibleDC(pDC);
		tempDC.SelectObject(&m_bitmap);

		CRect rcClient;
		GetClientRect(&rcClient);

		int isdc = pDC->SaveDC();

		CRgn rgnBitmap;
		CRect rcTmpBmp(rcAllLabels);
		rcTmpBmp.bottom += iAutoPreviewHeight;
		if (rcTmpBmp.right < m_cxClient) rcTmpBmp.right = m_cxClient;
		if (nItem == GetItemCount() - 1) rcTmpBmp.bottom = rcClient.bottom;

		rgnBitmap.CreateRectRgnIndirect(&rcTmpBmp);
		pDC->SelectClipRgn(&rgnBitmap);
		rgnBitmap.DeleteObject();
		
		if (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL)
		{
			pDC->SelectPalette(&m_pal, FALSE);
			pDC->RealizePalette();
		}

		CRect rcFirstItem;
		GetItemRect(0, rcFirstItem, LVIR_BOUNDS);

		for (int i = rcFirstItem.left; i < rcTmpBmp.right; i += m_cxBitmap)
			for (int j = rcFirstItem.top; j < rcTmpBmp.bottom; j += m_cyBitmap)
				pDC->BitBlt(i, j, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY);

		pDC->RestoreDC(isdc);
	}


	if (bSelected)
	{
		clrBkSave = pDC->SetBkColor(crBck);

		if (!bBlendBitmap || m_bitmap.m_hObject == NULL)
			pDC->FillSolidRect(rcAllLabels, crBck);
		else
		{
			CRect rcFirstItem;
			GetItemRect(0, rcFirstItem, LVIR_BOUNDS);

			int isdc = pDC->SaveDC();

			CRgn rgnBitmap;
			rgnBitmap.CreateRectRgnIndirect(&rcAllLabels);
			pDC->SelectClipRgn(&rgnBitmap);
			rgnBitmap.DeleteObject();

			rcAllLabels.bottom += iAutoPreviewHeight;
//			for (int i = 0; i < rcAllLabels.right; i += m_cxBitmap)
//				for (int j = 0; j < rcAllLabels.bottom; j += m_cyBitmap)
//					if (j + m_cyBitmap > rcAllLabels.top) cBackImage.Draw(pDC, 0, CPoint(i, j), ILD_BLEND25);
			for (int i = rcAllLabels.left; i < rcAllLabels.right; i += m_cxBitmap)
				for (int j = rcFirstItem.top; j < rcAllLabels.bottom; j += m_cyBitmap)
					if (j + m_cyBitmap > rcAllLabels.top) cBackImage.Draw(pDC, 0, CPoint(i, j), ILD_BLEND25);
			
			rcAllLabels.bottom -= iAutoPreviewHeight;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -