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

📄 listeditview.cpp

📁 Visual C++图形用户界面开发指南 李博轩等编著 配套源码光盘
💻 CPP
字号:
// ListEditView.cpp : implementation of the CListEditView class
//
// Reg Anderson June 5 1998.

#include "stdafx.h"
#include "ListEditView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLVEdit

BEGIN_MESSAGE_MAP(CLVEdit, CEdit)
	//{{AFX_MSG_MAP(CLVEdit)
	ON_WM_WINDOWPOSCHANGING()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CLVEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
{
	lpwndpos->x=m_x;
	lpwndpos->y=m_y;
	CEdit::OnWindowPosChanging(lpwndpos);
}

/////////////////////////////////////////////////////////////////////////////
// CListEditView

IMPLEMENT_DYNCREATE(CListEditView, CListView)

BEGIN_MESSAGE_MAP(CListEditView, CListView)
	//{{AFX_MSG_MAP(CListEditView)
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_SETFOCUS()
	ON_WM_KILLFOCUS()
	ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
	ON_NOTIFY_REFLECT(LVN_BEGINLABELEDIT, OnBeginLabelEdit)	
	//}}AFX_MSG_MAP
	// Standard printing commands
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListEditView construction/destruction

CListEditView::CListEditView()
{
	m_cx=0;
	m_nEdit=-1;
}

CListEditView::~CListEditView()
{
}

BOOL CListEditView::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style|=LVS_REPORT|
				 LVS_SINGLESEL|
				 LVS_SHOWSELALWAYS|
				 LVS_EDITLABELS|
				 LVS_OWNERDRAWFIXED;

	return CListView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CListEditView diagnostics

#ifdef _DEBUG
void CListEditView::AssertValid() const
{
	CListView::AssertValid();
}

void CListEditView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CListEditView methods

LPCTSTR CListEditView::MakeShortString(CDC* pDC, LPCTSTR lpszLong, int nColumnLen)
{
	static _TCHAR szLVStaticTemp[1024];

	static const _TCHAR szThreeDots[]=_T("...");

	int nStringLen=lstrlen(lpszLong);

	if(nStringLen==0 || pDC->GetTextExtent(lpszLong,nStringLen).cx<=nColumnLen)
		return(lpszLong);

	lstrcpy(szLVStaticTemp,lpszLong);
	int nAddLen=pDC->GetTextExtent(szThreeDots,sizeof(szThreeDots)).cx;

	for(int i=nStringLen-1; i>0; i--)
	{
		szLVStaticTemp[i]=0;
		if(pDC->GetTextExtent(szLVStaticTemp,i).cx+nAddLen<=nColumnLen)
			break;
	}

	lstrcat(szLVStaticTemp,szThreeDots);

	return(szLVStaticTemp);
}

#define OFFSET_FIRST	2
#define OFFSET_OTHER	6

void CListEditView::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	int nItem=lpDIS->itemID;

	CDC* pDC=CDC::FromHandle(lpDIS->hDC);
		
	CRect rcAllLabels;
	GetListCtrl().GetItemRect(nItem,rcAllLabels,LVIR_BOUNDS);

	CRect rcItem;
	GetListCtrl().GetItemRect(nItem,rcItem,LVIR_LABEL);

	rcAllLabels.left=rcItem.left;
	if(rcAllLabels.right<m_cx)
		rcAllLabels.right=m_cx-2;

	LV_ITEM lvi;
	lvi.mask=LVIF_STATE;
	lvi.iItem=nItem;
	lvi.iSubItem=0;
	lvi.stateMask=0xFFFF;		
	GetListCtrl().GetItem(&lvi);

	BOOL bFocus=(GetFocus()==this);
	BOOL bSelected=(lvi.state&LVIS_SELECTED && 
						(GetStyle()&LVS_SHOWSELALWAYS));						 
	bSelected=bSelected||(lvi.state&LVIS_DROPHILITED);

	int nOldDCMode=pDC->SaveDC();

	if(bSelected && m_nEdit==-1)
	{	
		pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
		pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
		pDC->FillRect(rcAllLabels,&CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
	}
	else
	{	
		pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
		pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
		pDC->FillRect(rcAllLabels,&CBrush(::GetSysColor(COLOR_WINDOW)));
	}
	
	UINT nJustify=DT_LEFT;
	UINT nFormat=DT_SINGLELINE|DT_NOPREFIX|DT_VCENTER;

	CString sText;

	if(m_nEdit!=0)
	{
		sText=MakeShortString(pDC,GetListCtrl().GetItemText(nItem,0),rcItem.Width());
		pDC->DrawText(sText,-1,&rcItem,nFormat|nJustify);
	}

	rcItem.left+=OFFSET_FIRST;
	rcItem.right-=OFFSET_FIRST;

	LV_COLUMN lvc;
	lvc.mask=LVCF_FMT|LVCF_WIDTH;

	for(int nCol=1; GetListCtrl().GetColumn(nCol,&lvc); nCol++)
	{
		switch(lvc.fmt&LVCFMT_JUSTIFYMASK)
		{
			case LVCFMT_RIGHT:
				nJustify=DT_RIGHT;
				break;
			case LVCFMT_CENTER:
				nJustify=DT_CENTER;
				break;
			default:
				nJustify=DT_LEFT;
				break;
		}

		rcItem.left=rcItem.right;
		rcItem.right+=lvc.cx;

		rcItem.left+=OFFSET_OTHER;
		rcItem.right-=OFFSET_OTHER;

		if(m_nEdit!=nCol)
		{	
			sText=MakeShortString(pDC,GetListCtrl().GetItemText(nItem,nCol),rcItem.Width());
			pDC->DrawText(sText,-1,&rcItem,nFormat|nJustify);
		}

		rcItem.right+=OFFSET_OTHER;
	}
	
	if(lvi.state&LVIS_FOCUSED && bFocus)
		pDC->DrawFocusRect(rcAllLabels);

	pDC->RestoreDC(nOldDCMode);	
}

void CListEditView::RepaintSelectedItems()
{
	CRect rcItem;
	CRect rcLabel;

	CListCtrl* pList=&GetListCtrl();

	int nItem=pList->GetNextItem(-1,LVNI_FOCUSED);

	if(nItem!=-1)
	{
		pList->GetItemRect(nItem,rcItem,LVIR_BOUNDS);
		pList->GetItemRect(nItem,rcLabel,LVIR_LABEL);
		rcItem.left=rcLabel.left;

		InvalidateRect(rcItem,FALSE);
	}

	if(!(GetStyle()&LVS_SHOWSELALWAYS))
	{
		for(nItem=pList->GetNextItem(-1,LVNI_SELECTED);
			 nItem!=-1; 
			 nItem=pList->GetNextItem(nItem,LVNI_SELECTED))
		{
			pList->GetItemRect(nItem,rcItem,LVIR_BOUNDS);
			pList->GetItemRect(nItem,rcLabel,LVIR_LABEL);
			rcItem.left=rcLabel.left;

			InvalidateRect(rcItem,FALSE);
		}
	}

	UpdateWindow();
}

/////////////////////////////////////////////////////////////////////////////
// CListEditView message handlers

void CListEditView::OnSize(UINT nType, int cx, int cy) 
{
	m_cx=cx;
	CListView::OnSize(nType, cx, cy);
}

void CListEditView::OnPaint() 
{
	CRect rcAllLabels;
	CListCtrl* pList=&GetListCtrl();

	pList->GetItemRect(0,rcAllLabels,LVIR_BOUNDS);

	if(rcAllLabels.right<m_cx)
	{
		CPaintDC dc(this);

		CRect rcClip;
		dc.GetClipBox(rcClip);

		rcClip.left=min(rcAllLabels.right-1,rcClip.left);
		rcClip.right=m_cx;

		InvalidateRect(rcClip,FALSE);
	}

	CListView::OnPaint();
}

void CListEditView::OnSetFocus(CWnd* pOldWnd) 
{
	CListView::OnSetFocus(pOldWnd);

	if(pOldWnd!=NULL && pOldWnd->GetParent()==this)
		return;
	
	RepaintSelectedItems();	
}

void CListEditView::OnKillFocus(CWnd* pNewWnd) 
{
	CListView::OnKillFocus(pNewWnd);

	if(pNewWnd!=NULL && pNewWnd->GetParent()==this)
		return;

	RepaintSelectedItems();		
}

void CListEditView::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo=(LV_DISPINFO*)pNMHDR;
	
	CString sEdit=pDispInfo->item.pszText;

	if(!sEdit.IsEmpty())
	{
		GetListCtrl().SetItemText(pDispInfo->item.iItem,
										  m_nEdit,
										  sEdit);
	}

	m_nEdit=-1;

	VERIFY(m_LVEdit.UnsubclassWindow()!=NULL);

	GetListCtrl().SetItemState(pDispInfo->item.iItem,0,LVNI_FOCUSED|LVNI_SELECTED);

	*pResult=0;
}

void CListEditView::OnBeginLabelEdit(NMHDR* pNMHDR,LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo=(LV_DISPINFO*)pNMHDR;

	*pResult=1;
	
	CPoint posMouse;
	GetCursorPos(&posMouse);
	ScreenToClient(&posMouse);

	LV_COLUMN lvc;
	lvc.mask=LVCF_WIDTH;

	CRect rcItem;
	GetListCtrl().GetItemRect(pDispInfo->item.iItem,rcItem,LVIR_LABEL);

	if(rcItem.PtInRect(posMouse))
		m_nEdit=0;	

	int nCol=1;
	while(m_nEdit==-1 && GetListCtrl().GetColumn(nCol,&lvc))
	{	
		rcItem.left=rcItem.right;
		rcItem.right+=lvc.cx;

		if(rcItem.PtInRect(posMouse))
			m_nEdit=nCol;	

		nCol++;	
	}

	if(m_nEdit==-1)
		return;
			
	HWND hWnd=(HWND)SendMessage(LVM_GETEDITCONTROL);
	ASSERT(hWnd!=NULL);
	VERIFY(m_LVEdit.SubclassWindow(hWnd));

	m_LVEdit.m_x=rcItem.left;
	m_LVEdit.m_y=rcItem.top-1;

	m_LVEdit.SetWindowText(GetListCtrl().GetItemText(pDispInfo->item.iItem,m_nEdit));

	*pResult=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -