www.pudn.com > ODBCApi.rar > ListCtrlEx.cpp


// ListCtrlEx.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "ListCtrlEx.h" 
#include ".\listctrlex.h" 
#define IDC_EDIT 1002 
#define IDC_COMBOBOX 1003 
#define MAX_ITEM 100 
IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl) 
CListCtrlEx::CListCtrlEx() 
{ 
} 
 
CListCtrlEx::~CListCtrlEx() 
{ 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i=0; ipWnd; 
			delete pItemControl; 
			pItemControl = NULL; 
		} 
	} 
} 
 
 
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl) 
	ON_NOTIFY_REFLECT(NM_CLICK, OnNMClick) 
	ON_NOTIFY(HDN_BEGINTRACKA, 0, OnHdnBegintrack) 
	ON_NOTIFY(HDN_BEGINTRACKW, 0, OnHdnBegintrack) 
	ON_MESSAGE(EN_EDIT, OnEnEdit) 
	ON_MESSAGE(CN_CHANGE, OnCnChange) 
	ON_WM_CREATE() 
	ON_NOTIFY(HDN_ENDTRACKA, 0, OnHdnEndtrack) 
	ON_NOTIFY(HDN_ENDTRACKW, 0, OnHdnEndtrack) 
	ON_WM_VSCROLL() 
	ON_WM_HSCROLL() 
	ON_WM_MOUSEWHEEL() 
END_MESSAGE_MAP() 
 
 
 
// CListCtrlEx 消息处理程序 
 
void CListCtrlEx::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	NMLISTVIEW* pNmListview= (LPNMLISTVIEW)pNMHDR; 
	int nItem = pNmListview->iItem; 
	int nSubItem = pNmListview->iSubItem; 
	CRect rcItem; 
	if(nItem==-1) 
	{ 
		return; 
	} 
	if(-1==GetSubItemRect(nItem, nSubItem, LVIR_LABEL, rcItem)) 
	{ 
		return; 
	} 
 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i=0; inType; 
		switch(nType) 
		{ 
		case EDIT: 
			{ 
				CItemEdit* pEdit = (CItemEdit*)pCtrl->pWnd; 
				pEdit->ShowWindow(FALSE); 
			} 
			break; 
		case COMBOBOX: 
			{ 
				CItemComboBox* pComboBox = (CItemComboBox*)pCtrl->pWnd; 
				pComboBox->ShowWindow(FALSE); 
			} 
			break; 
		} 
	} 
 
 
	nCount = (int)m_ptrArray.GetSize(); 
	for(int i=0; inCol==nSubItem) 
		{ 
			int nType = pCtrl->nType; 
			pCtrl->nItem = nItem; 
			switch(nType) 
			{ 
			case EDIT: 
				{ 
					CItemEdit* pEdit = (CItemEdit*)pCtrl->pWnd; 
					CString str = GetItemText(nItem, nSubItem); 
					pEdit->SetWindowText(str); 
					pEdit->MoveWindow(rcItem); 
					pEdit->ShowWindow(SW_SHOW); 
					pEdit->SetSel(-1); 
					pEdit->SetFocus(); 
				} 
				break; 
			case COMBOBOX: 
				{ 
					CItemComboBox* pComboBox = (CItemComboBox*)pCtrl->pWnd; 
					CString str = GetItemText(nItem, nSubItem); 
					pComboBox->MoveWindow(rcItem); 
					pComboBox->ShowWindow(SW_SHOW); 
					pComboBox->SetWindowText(str); 
					pComboBox->SetFocus(); 
				} 
				break; 
			} 
		} 
	} 
} 
void CListCtrlEx::OnHdnBegintrack(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
	LPNMHEADER phdr = reinterpret_cast(pNMHDR); 
	int nCol = phdr->iItem; 
	CRect rcHeader; 
	CRect rcItem; 
	CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)GetHeaderCtrl(); 
	pHeaderCtrl->GetItemRect(nCol, rcHeader); 
 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i=0; inCol; 
			int nItem = pItemControl->nItem; 
			int nType = pItemControl->nType; 
			if(-1!=GetSubItemRect(nItem, nSubItem,  LVIR_LABEL, rcItem)) 
			{ 
				switch(nType) 
				{ 
				case EDIT: 
					{ 
						CItemEdit* pEdit = (CItemEdit*)pItemControl->pWnd; 
						pEdit->MoveWindow(rcItem); 
						pEdit->ShowWindow(FALSE); 
					} 
				case COMBOBOX: 
					{ 
						CItemComboBox* pComboBox = (CItemComboBox*)pItemControl->pWnd; 
						pComboBox->MoveWindow(rcItem); 
						pComboBox->ShowWindow(FALSE); 
					} 
					break; 
				} 
			} 
		} 
	} 
} 
 
HRESULT CListCtrlEx::OnEnEdit(WPARAM wParam,LPARAM lParam) 
{ 
	CString str; 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i =0; inType==EDIT) 
			{ 
				CItemEdit* pItemEdit = (CItemEdit*)pItemControl->pWnd; 
				if(pItemEdit->m_hWnd!=NULL) 
				{ 
					pItemEdit->GetWindowText(str); 
					SetItemText(pItemControl->nItem, pItemControl->nCol, str); 
				} 
			} 
		} 
	} 
	return TRUE; 
} 
 
HRESULT CListCtrlEx::OnCnChange(WPARAM wParam,LPARAM lParam) 
{ 
	CString str; 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i =0; inType==COMBOBOX) 
			{ 
				CItemComboBox* pItemComboBox = (CItemComboBox*)pItemControl->pWnd; 
				if(pItemComboBox->m_hWnd!=NULL) 
				{ 
					int nSel = pItemComboBox->GetCurSel(); 
					if(nSel!=-1) 
					{ 
						pItemComboBox->GetLBText(nSel, str); 
						SetItemText(pItemControl->nItem, pItemControl->nCol, str); 
					} 
				} 
			} 
		} 
	} 
	return TRUE; 
} 
 
int CListCtrlEx::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CListCtrl::OnCreate(lpCreateStruct) == -1) 
	{ 
		return -1; 
	} 
	CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl(); 
	int nCount = (int)pHeaderCtrl->GetItemCount(); 
	InsertItem(0, ""); 
	for(int i=1; inType = EDIT; 
	pItemControl->nCol = nCol; 
	pItemControl->pWnd = (CWnd*)pEdit; 
	m_ptrArray.Add(pItemControl); 
} 
void CListCtrlEx::SetComboBox(CComboBox* pComboBox, int nCol) 
{ 
	ItemControl* pItemControl = new ItemControl; 
	pItemControl->nType = COMBOBOX; 
	pItemControl->nCol = nCol; 
	pItemControl->pWnd = (CWnd*)pComboBox; 
	m_ptrArray.Add(pItemControl); 
} 
 
void CListCtrlEx::OnHdnEndtrack(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
	LPNMHEADER phdr = reinterpret_cast(pNMHDR); 
	int nCol = phdr->iItem; 
	CRect rcHeader; 
	CRect rcItem; 
	CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)GetHeaderCtrl(); 
	pHeaderCtrl->GetItemRect(nCol, rcHeader); 
 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i=0; inCol; 
			int nItem = pItemControl->nItem; 
			int nType = pItemControl->nType; 
			if(-1!=GetSubItemRect(nItem, nSubItem,  LVIR_LABEL, rcItem)) 
			{ 
				switch(nType) 
				{ 
				case EDIT: 
					{ 
						CItemEdit* pEdit = (CItemEdit*)pItemControl->pWnd; 
						pEdit->MoveWindow(rcItem); 
						pEdit->ShowWindow(FALSE); 
					} 
					break;		 
				case COMBOBOX: 
					{ 
						CItemComboBox* pComboBox = (CItemComboBox*)pItemControl->pWnd; 
						pComboBox->MoveWindow(rcItem); 
						pComboBox->ShowWindow(FALSE); 
					} 
					break; 
				} 
			} 
		} 
	} 
	Invalidate(); 
} 
 
void CListCtrlEx::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
	CRect rcItem; 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i=0; inCol; 
			int nItem = pItemControl->nItem; 
			int nType = pItemControl->nType; 
			if(-1!=GetSubItemRect(nItem, nSubItem,  LVIR_LABEL, rcItem)) 
			{ 
				switch(nType) 
				{ 
				case EDIT: 
					{ 
						CItemEdit* pEdit = (CItemEdit*)pItemControl->pWnd; 
						pEdit->MoveWindow(rcItem); 
						pEdit->ShowWindow(FALSE); 
					} 
					break;		 
				case COMBOBOX: 
					{ 
						CItemComboBox* pComboBox = (CItemComboBox*)pItemControl->pWnd; 
						pComboBox->MoveWindow(rcItem); 
						pComboBox->ShowWindow(FALSE); 
					} 
					break; 
				} 
			} 
		} 
	} 
	Invalidate(); 
	CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar); 
} 
 
void CListCtrlEx::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
	// TODO: 在此添加消息处理程序代码和/或调用默认值 
	CRect rcItem; 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i=0; inCol; 
			int nItem = pItemControl->nItem; 
			int nType = pItemControl->nType; 
			if(-1!=GetSubItemRect(nItem, nSubItem,  LVIR_LABEL, rcItem)) 
			{ 
				switch(nType) 
				{ 
				case EDIT: 
					{ 
						CItemEdit* pEdit = (CItemEdit*)pItemControl->pWnd; 
						pEdit->MoveWindow(rcItem); 
						pEdit->ShowWindow(FALSE); 
					} 
					break;		 
				case COMBOBOX: 
					{ 
						CItemComboBox* pComboBox = (CItemComboBox*)pItemControl->pWnd; 
						pComboBox->MoveWindow(rcItem); 
						pComboBox->ShowWindow(FALSE); 
					} 
					break; 
				} 
			} 
		} 
	} 
	Invalidate(); 
	CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar); 
} 
 
BOOL CListCtrlEx::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{ 
	int nCount = (int)m_ptrArray.GetSize(); 
	for(int i=0; inType; 
		switch(nType) 
		{ 
		case EDIT: 
			{ 
				CItemEdit* pEdit = (CItemEdit*)pCtrl->pWnd; 
				pEdit->ShowWindow(FALSE); 
			} 
			break; 
		case COMBOBOX: 
			{ 
				CItemComboBox* pComboBox = (CItemComboBox*)pCtrl->pWnd; 
				pComboBox->ShowWindow(FALSE); 
			} 
			break; 
		} 
	} 
	Invalidate(); 
	return CListCtrl::OnMouseWheel(nFlags, zDelta, pt); 
}