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

📄 gfxlistctrl.cpp

📁 一个多线程的网络数据采集系统(客户端)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			pDC->RestoreDC(isdc);
		}
	}
	else if (m_bitmap.m_hObject == NULL) pDC->FillSolidRect(rcAllLabels, m_clrTextBk);

	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);
	rcIcon.OffsetRect(0, -iAutoPreviewHeight / 2);

	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.bottom -= iAutoPreviewHeight;

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

	if (NeedColExInfo(0)) AskForInfo(&lxhd, pDC);

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

//	if (rcItem.left < clipBox.right && rcItem.right > clipBox.left)
	{
		if (dwFlag&fShowSelCell && iSubItemFocus == 0 && lvi.state&LVIS_FOCUSED)
		{
			if (!(dwFlag&fExInfo && lxhd.dwFlag&LXHDREX::exTextColor))
				pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));

			if (rcLabel.right > rcLabel.left + 4) pDC->FillSolidRect(rcLabel, m_clrTextBk);
		}
		

		if (rcItem.left < clipBox.right && rcItem.right > clipBox.left && rcItem.right > rcItem.left)
		{
			if (dwFlag&fSubItemImages && dwhImages & 1 << iFirstColISubItem) 
			{
				int nImage = atoi(csItem);
				pImageList=pItemImageList;
				if(pImageList)
				{
					UINT nOvlImageMask=lvi.state & LVIS_OVERLAYMASK;
					if(rcLabel.left<rcLabel.right-1) ImageList_DrawEx(pImageList->m_hImageList,nImage,pDC->m_hDC,rcLabel.left,rcLabel.top,16,rcLabel.Height()-1,m_clrBkgnd,clrImage,uiFlags | nOvlImageMask);
				}
			}
			else pDC->DrawText(csItem, -1, rcLabel, nJustify1 | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
		}

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

		if (bVert)
		{
			pDC->MoveTo(rcLabel.right-1, rcLabel.bottom - 1);
			pDC->LineTo(rcLabel.right-1, rcLabel.top-1);
		}
	}

	int nColumnCount = GetColumnCount();

	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 && rcItem.right > rcItem.left)
		{
			GetItemTextEx(nItem, nColumn, csItem, &dwItemData);

			if (csItem != "")
			{
				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;//GetImageList(LVSIL_SMALL);
					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 (iAutoPreviewHeight > 0)
	{
		LXHDREX_DIV lxhd1(&lxhd);
		lxhd1.iNotifyCode = NTEX_AUTOPREVIEW;
		lxhd1.rcItem = rcAllLabels;
		lxhd1.rcItem.top = lxhd1.rcItem.bottom;
		lxhd1.rcItem.bottom += iAutoPreviewHeight;
		if (m_bitmap.m_hObject == NULL) pDC->FillSolidRect(lxhd1.rcItem, m_clrTextBk);
		lxhd1.pDC = pDC;
		pDC->SelectObject(&ftNormal);
		SendInfoExMsg((LXHDREX *)(&lxhd1));
		pDC->MoveTo(rcAllLabels.left, lxhd1.rcItem.bottom - 1);
		pDC->LineTo(rcAllLabels.right-1, lxhd1.rcItem.bottom - 1);
	}
	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, rcItem.bottom - 1);
				pDC->LineTo(rcAllLabels.right-1, rcItem.bottom - 1);
			}
		}
	}
	else
	{
		if (bHorz)
		{
			pDC->MoveTo(rcAllLabels.left, rcItem.bottom - 1);
			pDC->LineTo(rcAllLabels.right-1, rcItem.bottom - 1);
		}
	}

	if (lvi.state&LVIS_FOCUSED) 
	{
		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);
}

bool CGfxListCtrl::AskForInfo(LXHDREX * pLx, CDC *pDC)
{
	CWnd * pWnd = GetReciper();
	pLx->dwFlag = 0;
//	if (pWnd->SendMessage(WM_LISTEX_NOTIFY, 0, (LPARAM) pLx))
	if (SendInfoExMsg(pLx))
	{
		if (pLx->dwFlag&LXHDREX::exHFont) ::SelectObject(pDC->GetSafeHdc(), (HGDIOBJ) pLx->hfText);
		else if (pLx->dwFlag&LXHDREX::exBold) pDC->SelectObject(&ftBold);
		else if (pLx->dwFlag&LXHDREX::exItalic) pDC->SelectObject(&ftItalic);
		else if (pLx->dwFlag&LXHDREX::exUnderline) pDC->SelectObject(&ftUnderline);
		else pDC->SelectObject(&ftNormal);

		if (pLx->dwFlag&LXHDREX::exTextColor) pDC->SetTextColor(pLx->crText);

		return true;
	}
	return false;
}

long CGfxListCtrl::SendInfoExMsg(LXHDREX * pLx)
{
	CWnd * pWnd = GetReciper();
	if (m_fpExInfoFun) return (GetParent()->*m_fpExInfoFun)(pLx);
	return pWnd->SendMessage(WM_LISTEX_NOTIFY, 0, (LPARAM) pLx);
}

void CGfxListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	*pResult = 0;

	if (dwFlag & fAutoSort)
	{
		CWaitCursor tom;
		if (bDaoBind && pRecordSet)
		{
			if (pNMListView->iSubItem == 0) return;

			if (pCategoryManager != NULL) pCategoryManager->ResetList(this);

			bool bAsc = wndHeader.GetSortOrder(pNMListView->iSubItem);
			bAsc = !bAsc;
			wndHeader.SetSortImage(pNMListView->iSubItem, bAsc);

			CDaoFieldInfo fieldinfo;
			pRecordSet->GetFieldInfo(pNMListView->iSubItem - 1, fieldinfo);

			pRecordSet->m_strSort = fieldinfo.m_strName;
			if (!bAsc) pRecordSet->m_strSort += " DESC";
			pRecordSet->Requery();
			pRecordSet->MoveLast();
			Invalidate();
			if (pCategoryManager != NULL) pCategoryManager->SetupList(this);
		}
		else
		{

			if (pManager != NULL)
			{
				int col = pManager->FindColumnById(GetColumnIndex(pNMListView->iSubItem));
				if (col >= 0)
				{
					if (!(pManager->pColumnData[col].dwData&fhSortAble)) return;
				}
			}

			if (pCategoryManager != NULL) pCategoryManager->ResetList(this);

			bool bAsc = wndHeader.GetSortOrder(pNMListView->iSubItem);
			bAsc = !bAsc;
			wndHeader.SetSortImage(pNMListView->iSubItem, bAsc);
			
			{
				CSortClass csc(this, pNMListView->iSubItem, dwhNumeric & (1 << GetColumnIndex(pNMListView->iSubItem)) ? true : false, dwhValute & (1 << GetColumnIndex(pNMListView->iSubItem)) ? true : false);
				csc.Sort(bAsc);
			}

			if (pCategoryManager != NULL) pCategoryManager->SetupList(this);
			else
			{
				int idx = GetNextItem(-1, LVNI_SELECTED);
				if (idx >= 0) EnsureVisible(idx, false);
			}
		}
	}
}


int CGfxListCtrl::CellRectFromPoint(CPoint & point, RECT * cellrect, int * col) const
{
	int colnum;
	if ((GetStyle() & LVS_TYPEMASK) != LVS_REPORT) return -1;

	int row = GetTopIndex();
	int bottom = row + GetCountPerPage();
	if (bottom > GetItemCount()) bottom = GetItemCount();
	int nColumnCount = GetColumnCount();
	for (;row <=bottom; row++)
	{
		CRect rect;
		GetItemRect(row, &rect, LVIR_BOUNDS);
		rect.bottom -= iAutoPreviewHeight;

		if (rect.PtInRect(point))
		{
			for (colnum = 0; colnum < nColumnCount; colnum++)
			{
				int colwidth = GetColumnWidth(colnum);
				if (point.x >= rect.left && point.x <= (rect.left + colwidth))
				{
					RECT rectClient;
					GetClientRect(&rectClient);
					if (point.x > rectClient.right) return -1;
					if (col) *col = colnum;
					rect.right = rect.left + colwidth;
					if (rect.right > rectClient.right) rect.right = rectClient.right;
					*cellrect = rect;
					return row;
				}
				rect.left += colwidth;
			}
		}
	}
	return -1;
}

void CGfxListCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
	if (dwFlag & fCellToolTip && nFlags == 0 && wndToolTip.GetSafeHwnd() && GetFocus() == this)
	{
		int row, col;
		RECT cellrect;
		row = CellRectFromPoint(point, &cellrect, &col );
		if (row != -1)
		{
			DWORD dw = GetItemData(row);
			if (pCategoryManager != NULL)
			{
				if (col == 0 || pCategoryManager->IsListItemACategory(dw) >= 0) return;
			}
			int offset = 6;
			if (col == 0) 
			{
				CRect rcLabel;
				GetItemRect(row, &rcLabel, LVIR_LABEL);
				offset = rcLabel.left - cellrect.left + offset / 2;
			}
			cellrect.top--;
			if (!(dwFlag&fSubItemImages) || !(dwhImages & 1 << GetColumnIndex(col)))
			{
				CString csItem;
				GetItemTextEx(row, col, csItem, &dw);
				wndToolTip.Show(cellrect, csItem, offset-1);

//				wndToolTip.Show(cellrect, GetItemText( row, col ), offset-1);
			}
		}
	}
	
	CListCtrl::OnMouseMove(nFlags, point);
}

void CGfxListCtrl::ModifyFlag(const DWORD dwRemove, const DWORD dwAdd, const UINT dwRedraw)
{
	if (dwRemove != 0) dwFlag &= ~dwRemove;
	if (dwAdd != 0) dwFlag |= dwAdd;
	if (GetSafeHwnd())
	{
		if (dwRedraw != 0) SetWindowPos(0,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|dwRedraw);
		else Invalidate();
	}
}

void CGfxListCtrl::OnSize(UINT nType, int cx, int cy) 
{
/*	CWnd * pf = GetFocus();
	if (pf != this && IsChild(pf)) SetFocus();
*/
	CListCtrl::OnSize(nType, cx, cy);
	m_cxClient = cx;	

	int iItemCount = GetItemCount();
	if (dwFlag&fScrollBarAlways)
	{
		ShowScrollBar(SB_BOTH);
		int iPageItem = GetCountPerPage();
		if (iItemCount < iPageItem) EnableScrollBar(SB_VERT, ESB_DISABLE_BOTH);
		else EnableScrollBar(SB_VERT, ESB_ENABLE_BOTH);

		if (iItemCount > 0)
		{
			CRect rcAllLabels;
			GetItemRect(0,rcAllLabels,LVIR_BOUNDS);
			EnableScrollBar(SB_HORZ, rcAllLabels.Width() < cx ? ESB_DISABLE_BOTH : ESB_ENABLE_BOTH);
		}
		else EnableScrollBar(SB_HORZ, ESB_DISABLE_BOTH);
	}

	CPoint pt;
	GetCursorPos(&pt);
	ScreenToClient(&pt);
	int iCol, i = HitTestEx(pt, &iCol);
	if (i > 0)
	{
		CRect rc;
		GetSubItemRect(i,iCol,rc);
		InvalidateRect(rc, true);
		if (i > 0)
		{
			GetSubItemRect(i-1,iCol,rc);
			InvalidateRect(rc, true);
		}
		if (i < iItemCount - 1)

⌨️ 快捷键说明

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