Files

253 lines
5.3 KiB
C++
Raw Permalink Normal View History

2026-03-03 13:56:44 +08:00
#include "StdAfx.h"
#include "ListControl.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><EFBFBD><EAB6A8>
//<2F>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>
#define LIST_STYTE LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_FLATSB
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
struct tagSortParameter
{
bool bAscendSort; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
WORD wColumnIndex; //λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CListControl * pListControl; //<2F>б<EFBFBD><D0B1>ؼ<EFBFBD>
};
//////////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CListHeaderCtrl, CHeaderCtrl)
ON_WM_PAINT()
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CListControl, CListCtrl)
ON_WM_ERASEBKGND()
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CListHeaderCtrl::CListHeaderCtrl()
{
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CListHeaderCtrl::~CListHeaderCtrl()
{
}
//<2F>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>
VOID CListHeaderCtrl::OnPaint()
{
CPaintDC dc(this);
//<2F><>ȡλ<C8A1><CEBB>
CRect rcRect;
GetClientRect(&rcRect);
//<2F><><EFBFBD><EFBFBD> DC
dc.SetBkMode(TRANSPARENT);
dc.SelectObject(GetFont());
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
CRect rcItem;
HDITEM HDItem;
TCHAR szBuffer[64];
for (INT i=0;i<GetItemCount();i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HDItem.mask=HDI_TEXT;
HDItem.pszText=szBuffer;
HDItem.cchTextMax=CountArray(szBuffer);
//<2F><>ȡ<EFBFBD><C8A1>Ϣ
GetItem(i,&HDItem);
GetItemRect(i,&rcItem);
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
dc.DrawFrameControl(&rcItem,DFC_BUTTON,DFCS_BUTTONPUSH);
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
rcItem.DeflateRect(3,1,3,1);
const UINT uFormat=DT_WORDBREAK|DT_EDITCONTROL|DT_END_ELLIPSIS|DT_SINGLELINE|DT_VCENTER|DT_CENTER;
dc.DrawText(szBuffer,lstrlen(szBuffer),&rcItem,uFormat);
}
return;
}
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CListControl::CListControl()
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bAscendSort=true;
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CListControl::~CListControl()
{
}
//<2F>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
VOID CListControl::PreSubclassWindow()
{
__super::PreSubclassWindow();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SetBkColor(CR_NORMAL_BK);
SetExtendedStyle(LIST_STYTE);
//<2F>󶨿ؼ<F3B6A8BF>
m_ListHeaderCtrl.SubclassWindow(GetHeaderCtrl()->GetSafeHwnd());
//<2F><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
InitListControl();
return;
}
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
VOID CListControl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CRect rcItem=lpDrawItemStruct->rcItem;
CDC * pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
INT nItemID=lpDrawItemStruct->itemID;
INT nColumnCount=m_ListHeaderCtrl.GetItemCount();
//<2F><>ȡ<EFBFBD><C8A1>ɫ
tagListItemColor ListItemColor;
GetListItemColor(lpDrawItemStruct->itemData,lpDrawItemStruct->itemState,ListItemColor);
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
CRect rcClipBox;
pDC->GetClipBox(&rcClipBox);
//<2F><><EFBFBD><EFBFBD> DC
pDC->SetBkColor(ListItemColor.rcBackColor);
pDC->SetTextColor(ListItemColor.rcTextColor);
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
for (INT i=0;i<nColumnCount;i++)
{
//<2F><>ȡλ<C8A1><CEBB>
CRect rcSubItem;
GetSubItemRect(nItemID,i,LVIR_LABEL,rcSubItem);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶
if ((i==0)&&(rcItem.left<rcSubItem.left))
{
INT nYFill=rcItem.bottom-rcItem.top;
INT nXFill=rcSubItem.left-rcItem.left;
pDC->FillSolidRect(rcItem.left,rcItem.top,nXFill,nYFill,ListItemColor.rcBackColor);
}
//<2F><EFBFBD>ж<EFBFBD>
if (rcSubItem.left>rcClipBox.right) break;
if (rcSubItem.right<rcClipBox.left) continue;
if (rcSubItem.left==rcSubItem.right) continue;
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
pDC->FillSolidRect(&rcSubItem,ListItemColor.rcBackColor);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
TCHAR szString[256]=TEXT("");
GetItemText(nItemID,i,szString,CountArray(szString));
//<2F><>ȡ<EFBFBD><C8A1>ʽ
HDITEM HDItem;
HDItem.mask=HDI_FORMAT;
m_ListHeaderCtrl.GetItem(i,&HDItem);
//<2F><><EFBFBD>ø<EFBFBD>ʽ
UINT uFormat=0;
if (HDItem.fmt&HDF_LEFT) uFormat|=DT_LEFT;
if (HDItem.fmt&HDF_RIGHT) uFormat|=DT_RIGHT;
if (HDItem.fmt&HDF_CENTER) uFormat|=DT_CENTER;
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
rcSubItem.left+=5;
pDC->DrawText(szString,lstrlen(szString),&rcSubItem,uFormat|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
}
//<2F>ѡ<E6BBAD><D1A1>
if (lpDrawItemStruct->itemState&ODS_FOCUS) pDC->DrawFocusRect(&rcItem);
return;
}
//<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD>
INT CALLBACK CListControl::SortFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamList)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagSortParameter * pSortParameter=(tagSortParameter *)lParamList;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wColumnIndex=pSortParameter->wColumnIndex;
CListControl * pListControl=pSortParameter->pListControl;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT nResult=pListControl->SortListItemData(lParam1,lParam2,wColumnIndex);
return (pSortParameter->bAscendSort)?nResult:-nResult;
}
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
BOOL CListControl::OnEraseBkgnd(CDC * pDC)
{
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
if (m_ListHeaderCtrl.m_hWnd!=NULL)
{
//<2F><>ȡλ<C8A1><CEBB>
CRect rcClient;
CRect rcHeaderCtrl;
GetClientRect(&rcClient);
m_ListHeaderCtrl.GetWindowRect(&rcHeaderCtrl);
//<2F><EFBFBD><E6BBAD><EFBFBD><EFBFBD>
rcClient.top=rcHeaderCtrl.Height();
pDC->FillSolidRect(&rcClient,GetBkColor());
return TRUE;
}
return __super::OnEraseBkgnd(pDC);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
VOID CListControl::OnColumnclick(NMHDR * pNMHDR, LRESULT * pResult)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NM_LISTVIEW * pNMListView=(NM_LISTVIEW *)pNMHDR;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagSortParameter SortParameter;
ZeroMemory(&SortParameter,sizeof(SortParameter));
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
SortParameter.pListControl=this;
SortParameter.bAscendSort=m_bAscendSort;
SortParameter.wColumnIndex=pNMListView->iSubItem;
//<2F><><EFBFBD><EFBFBD>״̬
m_bAscendSort=!m_bAscendSort;
//<2F><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
SortItems(SortFunction,(LPARAM)&SortParameter);
return;
}
//////////////////////////////////////////////////////////////////////////////////