📄 xlistctrl.cpp
字号:
///////////////////////////////////////////////////////////////////////////////
// GetCheckbox
int CXListCtrl::GetCheckbox(int nItem, int nSubItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return -1;
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return -1;
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return -1;
}
return pXLCD[nSubItem].nCheckedState;
}
///////////////////////////////////////////////////////////////////////////////
// GetEnabled
//
// Note that GetEnabled and SetEnabled only Get/Set the enabled flag from
// subitem 0, since this is a per-row flag.
//
BOOL CXListCtrl::GetEnabled(int nItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
return pXLCD[0].bEnabled;
}
///////////////////////////////////////////////////////////////////////////////
// SetEnabled
BOOL CXListCtrl::SetEnabled(int nItem, BOOL bEnable)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
pXLCD[0].bEnabled = bEnable;
CRect rect;
GetItemRect(nItem, &rect, LVIR_BOUNDS);
// InvalidateRect(&rect);
UpdateWindow();
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// SetBold
BOOL CXListCtrl::SetBold(int nItem, int nSubItem, BOOL bBold)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return FALSE;
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
// update bold flag
pXLCD[nSubItem].bBold = bBold;
UpdateSubItem(nItem, nSubItem);
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// GetBold
BOOL CXListCtrl::GetBold(int nItem, int nSubItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return FALSE;
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
// update bold flag
return pXLCD[nSubItem].bBold;
}
///////////////////////////////////////////////////////////////////////////////
// SetComboBox
//
// Note: SetItemText may also be used to set the initial combo selection.
//
BOOL CXListCtrl::SetComboBox(int nItem,
int nSubItem,
BOOL bEnableCombo,
CStringArray *psa,
int nComboListHeight,
int nInitialComboSel)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return FALSE;
ASSERT(psa);
if (!psa)
return FALSE;
ASSERT(nComboListHeight > 0);
ASSERT(nInitialComboSel >= 0 && nInitialComboSel < psa->GetSize());
if ((nInitialComboSel < 0) || (nInitialComboSel >= psa->GetSize()))
nInitialComboSel = 0;
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
// update flag
pXLCD[nSubItem].bCombo = bEnableCombo;
if (bEnableCombo)
{
pXLCD[nSubItem].psa = psa;
pXLCD[nSubItem].nComboListHeight = nComboListHeight;
pXLCD[nSubItem].nInitialComboSel = nInitialComboSel;
if (pXLCD[nSubItem].psa)
{
int index = 0;
if ((pXLCD[nSubItem].nInitialComboSel >= 0) &&
(pXLCD[nSubItem].psa->GetSize() > pXLCD[nSubItem].nInitialComboSel))
{
index = pXLCD[nSubItem].nInitialComboSel;
CString str;
str = pXLCD[nSubItem].psa->GetAt(index);
SetItemText(nItem, nSubItem, str);
}
}
}
UpdateSubItem(nItem, nSubItem);
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// GetComboText
//
// Actually this does nothing more than GetItemText()
//
CString CXListCtrl::GetComboText(int nItem, int nSubItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return _T("");
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return _T("");
CString str;
str = _T("");
str = GetItemText(nItem, nSubItem);
return str;
}
///////////////////////////////////////////////////////////////////////////////
// SetCurSel
BOOL CXListCtrl::SetCurSel(int nItem)
{
return SetItemState(nItem, LVIS_FOCUSED | LVIS_SELECTED,
LVIS_FOCUSED | LVIS_SELECTED);
}
///////////////////////////////////////////////////////////////////////////////
// GetCurSel - returns selected item number, or -1 if no item selected
//
// Note: for single-selection lists only
//
int CXListCtrl::GetCurSel()
{
POSITION pos = GetFirstSelectedItemPosition();
int nSelectedItem = -1;
if (pos != NULL)
nSelectedItem = GetNextSelectedItem(pos);
return nSelectedItem;
}
///////////////////////////////////////////////////////////////////////////////
// UpdateSubItem
void CXListCtrl::UpdateSubItem(int nItem, int nSubItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return;
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return;
CRect rect;
if (nSubItem == -1)
{
GetItemRect(nItem, &rect, LVIR_BOUNDS);
}
else
{
GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
}
// InvalidateRect(&rect);
// UpdateWindow();
}
///////////////////////////////////////////////////////////////////////////////
// GetColumns
int CXListCtrl::GetColumns()
{
return GetHeaderCtrl()->GetItemCount();
}
///////////////////////////////////////////////////////////////////////////////
// GetItemData
//
// The GetItemData and SetItemData functions allow for app-specific data
// to be stored, by using an extra field in the XLISTCTRLDATA struct.
//
DWORD CXListCtrl::GetItemData(int nItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return 0;
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return 0;
}
return pXLCD->dwItemData;
}
///////////////////////////////////////////////////////////////////////////////
// SetItemData
BOOL CXListCtrl::SetItemData(int nItem, DWORD dwData)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
pXLCD->dwItemData = dwData;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// GetHeaderCheckedState
//
// The GetHeaderCheckedState and SetHeaderCheckedState may be used to toggle
// the checkbox in a column header.
// 0 = no checkbox
// 1 = unchecked
// 2 = checked
//
int CXListCtrl::GetHeaderCheckedState(int nSubItem)
{
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return -1;
HDITEM hditem;
// use the image index (0 or 1) to indicate the checked status
hditem.mask = HDI_IMAGE;
m_HeaderCtrl.GetItem(nSubItem, &hditem);
return hditem.iImage;
}
///////////////////////////////////////////////////////////////////////////////
// SetHeaderCheckedState
BOOL CXListCtrl::SetHeaderCheckedState(int nSubItem, int nCheckedState)
{
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return FALSE;
ASSERT(nCheckedState == 0 || nCheckedState == 1 || nCheckedState == 2);
HDITEM hditem;
hditem.mask = HDI_IMAGE;
hditem.iImage = nCheckedState;
// hditem.iImage=nCheckedState+1; 4.16
m_HeaderCtrl.SetItem(nSubItem, &hditem);
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// OnColumnClick
BOOL CXListCtrl::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW* pnmlv = (NMLISTVIEW*)pNMHDR;
int nSubItem = pnmlv->iSubItem;
int nCheckedState = GetHeaderCheckedState(nSubItem);
// 0 = no checkbox
if (nCheckedState != XHEADERCTRL_NO_IMAGE)
{
nCheckedState = (nCheckedState == 1) ? 2 : 1;
SetHeaderCheckedState(nSubItem, nCheckedState);
if(nCheckedState == 1)
{
return 1;
}
if(nCheckedState == 2)
{
this->GetParent()->PostMessage(WM_CHECKALL,0,0);
}
m_HeaderCtrl.UpdateWindow();
for (int nItem = 0; nItem < GetItemCount(); nItem++)
{
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
continue;
}
if (pXLCD[nSubItem].nCheckedState != -1)
{
pXLCD[nSubItem].nCheckedState = nCheckedState - 1;
UpdateSubItem(nItem, nSubItem);
}
}
}
*pResult = 0;
return FALSE; // return FALSE to send message to parent also -
// NOTE: MSDN documentation is incorrect
}
///////////////////////////////////////////////////////////////////////////////
// CountCheckedItems
int CXListCtrl::CountCheckedItems(int nSubItem)
{
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return 0;
int nCount = 0;
for (int nItem = 0; nItem < GetItemCount(); nItem++)
{
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
continue;
}
if (pXLCD[nSubItem].nCheckedState == 1)
nCount++;
}
return nCount;
}
///////////////////////////////////////////////////////////////////////////////
// OnSysColorChange
void CXListCtrl::OnSysColorChange()
{
CListCtrl::OnSysColorChange();
m_cr3DFace = ::GetSysColor(COLOR_3DFACE);
m_cr3DHighLight = ::GetSysColor(COLOR_3DHIGHLIGHT);
m_cr3DShadow = ::GetSysColor(COLOR_3DSHADOW);
m_crBtnFace = ::GetSysColor(COLOR_BTNFACE);
m_crBtnShadow = ::GetSysColor(COLOR_BTNSHADOW);
m_crBtnText = ::GetSysColor(COLOR_BTNTEXT);
m_crGrayText = ::GetSysColor(COLOR_GRAYTEXT);
m_crHighLight = ::GetSysColor(COLOR_HIGHLIGHT);
m_crHighLightText = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
m_crWindow = ::GetSysColor(COLOR_WINDOW);
m_crWindowText = ::GetSysColor(COLOR_WINDOWTEXT);
}
#ifndef DO_NOT_INCLUDE_XCOMBOLIST
///////////////////////////////////////////////////////////////////////////////
// UnpressComboButton
void CXListCtrl::UnpressComboButton()
{
static BOOL bFlag = FALSE;
if (bFlag)
return;
bFlag = TRUE;
if (m_bComboIsClicked)
{
if (m_nComboItem >= 0 && m_nComboItem < GetItemCount())
{
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) CListCtrl::GetItemData(m_nComboItem);
if (pXLCD)
{
if (m_nComboSubItem >= 0 && m_nComboSubItem < GetColumns())
{
pXLCD[m_nComboSubItem].bComboIsClicked = FALSE;
UpdateSubItem(m_nComboItem, m_nComboSubItem);
}
}
}
}
m_bComboIsClicked = FALSE;
bFlag = FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -