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

📄 listctrlex.cpp

📁 ODBC API访问数据库的文章却少之又少。虽然用ODBC访问数据库比较麻烦
💻 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; i<nCount; i++)
	{
		ItemControl* pItemControl = (ItemControl*)m_ptrArray.GetAt(i);
		if(pItemControl!=NULL)
		{
			delete pItemControl->pWnd;
			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; i<nCount; i++)
	{
		ItemControl* pCtrl = (ItemControl*)m_ptrArray.GetAt(i);
		int nType = pCtrl->nType;
		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; i<nCount; i++)
	{
		ItemControl* pCtrl = (ItemControl*)m_ptrArray.GetAt(i);
		if(pCtrl->nCol==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<LPNMHEADER>(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; i<nCount; i++)
	{
		ItemControl* pItemControl = (ItemControl*)m_ptrArray.GetAt(i);
		if(pItemControl!=NULL)
		{
			int nSubItem = pItemControl->nCol;
			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; i<nCount; i++)
	{
		ItemControl* pItemControl = (ItemControl*)m_ptrArray.GetAt(i);
		if(pItemControl!=NULL)
		{
			if(pItemControl->nType==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; i<nCount; i++)
	{
		ItemControl* pItemControl = (ItemControl*)m_ptrArray.GetAt(i);
		if(pItemControl!=NULL)
		{
			if(pItemControl->nType==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; i<nCount-1; i++)
	{
		SetItemText(0, i, "");	
	}
	return 0;
}

void CListCtrlEx::SetEdit(CEdit* pEdit, int nCol)
{
	ItemControl* pItemControl = new ItemControl;
	pItemControl->nType = 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<LPNMHEADER>(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; i<nCount; i++)
	{
		ItemControl* pItemControl = (ItemControl*)m_ptrArray.GetAt(i);
		if(pItemControl!=NULL)
		{
			int nSubItem = pItemControl->nCol;
			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; i<nCount; i++)
	{
		ItemControl* pItemControl = (ItemControl*)m_ptrArray.GetAt(i);
		if(pItemControl!=NULL)
		{
			int nSubItem = pItemControl->nCol;
			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; i<nCount; i++)
	{
		ItemControl* pItemControl = (ItemControl*)m_ptrArray.GetAt(i);
		if(pItemControl!=NULL)
		{
			int nSubItem = pItemControl->nCol;
			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; i<nCount; i++)
	{
		ItemControl* pCtrl = (ItemControl*)m_ptrArray.GetAt(i);
		int nType = pCtrl->nType;
		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);
}

⌨️ 快捷键说明

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