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