253 lines
5.3 KiB
C++
253 lines
5.3 KiB
C++
|
|
#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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|