📄 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; 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 + -