⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mylistctrl.cpp

📁 SQLBig5BugTool 宽字符操作问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -