📄 mylistctrl.cpp
字号:
// MyListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "MyListCtrl.h"
#include "MyLog.h"
#include <algorithm>
#include <Windowsx.h>
/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl
CMyListCtrl::CMyListCtrl()
{
m_bEnableSortByHdr=FALSE;
m_strCopyOnSelectedColumnSeperator=DEFAULT_COLUMN_SEPERATOR;
m_pIItemColorModifier=0;
m_bCopyHeader=FALSE;
m_bDisableDeleteShortKey=FALSE;
m_bSingleSelectionOnly=FALSE;
m_bEnsureVisible=FALSE;
m_pIToolTip=0;
}
CMyListCtrl::~CMyListCtrl()
{
}
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
ON_WM_KEYUP()
ON_WM_MOUSEMOVE()
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl message handlers
void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CListCtrl::OnMouseMove(nFlags, point);
if(m_pIToolTip)
{
m_pIToolTip->OnUpdateScriptTip(point);
}
}
void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 0;
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT :
{
*pResult = CDRF_NOTIFYITEMDRAW;
return;
}
// Modify item text and or background
case CDDS_ITEMPREPAINT:
{
if(m_pIItemColorModifier)
{
//try
{
lplvcd->clrTextBk = m_pIItemColorModifier->GetItemColor(this,lplvcd->nmcd.dwItemSpec);
}
//catch(...)
{
}
}
else
{
//lplvcd->clrTextBk = RGB(0,0,0);
}
// If you want the sub items the same as the item,
// set *pResult to CDRF_NEWFONT
*pResult = CDRF_NEWFONT;//CDRF_NOTIFYSUBITEMDRAW;
return;
}
// Modify sub item text and/or background
case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:
{
if(m_pIItemColorModifier)
{
//try
{
lplvcd->clrTextBk = m_pIItemColorModifier->GetItemColor(this,lplvcd->nmcd.dwItemSpec);
}
//catch(...)
{
}
}
else
{
//lplvcd->clrTextBk = RGB(0,0,0);
}
*pResult = CDRF_NEWFONT;
return;
}
}
}
CString CMyListCtrl::GetItemTextByName(
const int nItem,
const char* pszColumnName
)
{
CString strTxt;
GetItemTextByName(nItem,pszColumnName,strTxt);
return strTxt;
}
BOOL CMyListCtrl::GetItemTextByName(
const int nItem,
const char* pszColumnName,
CString& strTxt
)
{
strTxt="";
if(nItem<0)
{
return FALSE;
}
if(nItem>=GetItemCount())
{
return FALSE;
}
long lSubItemIndex=FindColumnIndex(pszColumnName);
if(lSubItemIndex<0)
{
return FALSE;
}
strTxt=GetItemText(nItem,lSubItemIndex);
return TRUE;
}
BOOL CMyListCtrl::SetItemTextByName(
const int nItem,
const char* pszColumnName,
LPCTSTR lpszText,
const ULONG ulAutoAddColumnWidth ,
const long lColumnFormat
)
{
long lSubItemIndex=FindColumnIndex(pszColumnName);
if(lSubItemIndex<0)
{
AddColumn(pszColumnName,ulAutoAddColumnWidth,lColumnFormat);
lSubItemIndex=FindColumnIndex(pszColumnName);
if(lSubItemIndex<0)
{
return FALSE;
}
}
return SetItemText(nItem,lSubItemIndex,lpszText);
}
long CMyListCtrl::FindColumnIndex(
const char *pszColumnName,
const bool bCompareNoCase
)
{
if(!GetHeaderCtrl()->GetSafeHwnd())
{
return -1;
}
long l=0;
long lCount = Header_GetItemCount(GetHeaderCtrl()->GetSafeHwnd());
if(bCompareNoCase)
{
for(l = 0; l < lCount; l++)
{
HDITEM hdi={0,};
char szTxt[1024]={0,};
hdi.mask=HDI_TEXT;
hdi.pszText=szTxt;
hdi.cchTextMax=_countof(szTxt);
Header_GetItem(GetHeaderCtrl()->GetSafeHwnd(),l, &hdi);
if (strcmp(hdi.pszText, pszColumnName) == 0)
{
return l;
}
}
}
else
{
for(l = 0; l < lCount; l++)
{
HDITEM hdi={0,};
char szTxt[1024]={0,};
hdi.mask=HDI_TEXT;
hdi.pszText=szTxt;
hdi.cchTextMax=_countof(szTxt);
Header_GetItem(GetHeaderCtrl()->GetSafeHwnd(),l, &hdi);
if (strcmpi(hdi.pszText, pszColumnName) == 0)
{
return l;
}
}
}
return -1;
}
long CMyListCtrl::AddColumn(
const char * pszColName,
const unsigned long ulColWidth,
const long lColumnFormat
)
{
long lIndex=GetHeaderCtrl()->GetItemCount();
lIndex=InsertColumn(
lIndex,
pszColName,
lColumnFormat,
ulColWidth
);
return lIndex;
}
long CMyListCtrl::AddRow(const long lInsertAfter,const bool bEnsureVisible)
{
char szTxt[64]={0,};
long lInsertAfterReal=GetItemCount();
if(lInsertAfter>=0)
{
lInsertAfterReal=lInsertAfter;
}
sprintf(szTxt,"%04u",GetItemCount());
long lRowIndex=InsertItem(
lInsertAfterReal,
szTxt
);
SetItemData(lRowIndex,lRowIndex);
if(m_bEnsureVisible||bEnsureVisible)
{
EnsureVisible(lRowIndex,FALSE);
}
return lRowIndex;
}
void CMyListCtrl::Init(long dwResIDImageList)
{
m_imageList.Create(16,16,TRUE,2,2);
m_imageList.Add(AfxGetApp()->LoadIcon(dwResIDImageList));
//
/*-----------------------------------------------------------*/
SetImageList(&m_imageList,LVSIL_SMALL);
ModifyStyle(GetSafeHwnd(),0,LVS_SHOWSELALWAYS,0);
//LVS_EX_TRACKSELECT
SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );
SetBkColor(RGB(247,247,255));
SetTextColor(RGB(0,0,255));
SetTextBkColor(RGB(247,247,255));
}
void CMyListCtrl::AutoExpandAllColumn()
{
long l=0;
NMHEADER NMHdr={0,};
NMHdr.hdr.hwndFrom=GetHeaderCtrl()->GetSafeHwnd();
NMHdr.hdr.code=HDN_DIVIDERDBLCLICKW;
for(l=0;l<GetHeaderCtrl()->GetItemCount();l++)
{
NMHdr.iItem=l;
SendMessage(WM_NOTIFY,0,(LPARAM)&NMHdr);
}
}
void CMyListCtrl::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(!m_bDisableDeleteShortKey)
{
if((nChar==VK_DELETE))
{
if(IsControlKeyDown())
{
DeleteAllItems();
}
else
{
DeleteAllSelectedItems();
}
}
}
if((nChar=='C')||(nChar=='c'))
{
if(IsControlKeyDown())
{
CopySelecteColumnDataToClipboard();
}
}
if(!m_bSingleSelectionOnly)
{
if((nChar=='A')||(nChar=='a'))
{
if(IsControlKeyDown())
{
SelectAllItems();
}
}
}
CListCtrl::OnKeyUp(nChar, nRepCnt, nFlags);
}
void CMyListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(m_bEnableSortByHdr)
{
SortByOneColumn(
pNMListView->iSubItem,
TRUE
);
}
*pResult = 0;
}
void CMyListCtrl::SortByOneColumn(
const long lColumn,
const BOOL bAscending
)
{
if(!m_bEnableSortByHdr)
{
return ;
}
SORT_PARAM SorParam={this,lColumn};
ListView_SortItems(
GetSafeHwnd(),
CompareFunction,
(LPARAM)&SorParam
);
}
int CALLBACK CMyListCtrl::CompareFunction( LPARAM lParam1, LPARAM lParam2, LPARAM lParamData )
{
SORT_PARAM *pSorParam=(SORT_PARAM *)lParamData;
return pSorParam->pMyListCtrl->CompareItems(lParam1,lParam2,pSorParam->dwColumn);
}
int CMyListCtrl::CompareItems(
const LONG lRowIndex1,
const LONG lRowIndex2,
const DWORD dwColumn
)
{
CString strTxt1=GetItemText(lRowIndex1,dwColumn);
if(strTxt1.IsEmpty())
{
return 1;
}
CString strTxt2=GetItemText(lRowIndex2,dwColumn);
if(strTxt2.IsEmpty())
{
return -1;
}
return strcmp(strTxt1,strTxt2);
}
void CMyListCtrl::SetSingleSelectionOnly(const BOOL bEnable)
{
if(bEnable)
{
ModifyStyle(GetSafeHwnd(),0,LVS_SINGLESEL,0);
}
else
{
ModifyStyle(GetSafeHwnd(),LVS_SINGLESEL,0,0);
}
m_bSingleSelectionOnly=bEnable;
}
void CMyListCtrl::CopySelecteColumnDataToClipboard()
{
if(m_CopyOnSelectedColumnNameList.size()<1)
{
return;
}
long l=0;
CString strTxt;
CString strTxtAll;
if(m_bCopyHeader)
{
if(!strTxtAll.IsEmpty())
{
strTxtAll+="\n";
}
for(l=0;l<m_CopyOnSelectedColumnNameList.size();l++)
{
if(0!=l)
{
strTxtAll+=m_strCopyOnSelectedColumnSeperator;
}
strTxtAll+=m_CopyOnSelectedColumnNameList[l].c_str();
}
}
POSITION pos=GetFirstSelectedItemPosition();
while(NULL!=pos)
{
int nItem = GetNextSelectedItem(pos);
if(!strTxtAll.IsEmpty())
{
strTxtAll+="\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -