📄 gfxlistctrl.cpp
字号:
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 + -