📄 mylistctrl1.cpp
字号:
for (i = 0; i < GetColumns(); i++)
{
GetSubItemRect(nItem, i, LVIR_BOUNDS, rect);
if (rect.PtInRect(point))
{
nSubItem = i;
break;
}
}
if (nSubItem == -1)
{
// -1 = no checkbox for this subitem
}
else
{
if (pXLCD[nSubItem].nCheckedState >= 0)
{
int nChecked = pXLCD[nSubItem].nCheckedState;
nChecked = (nChecked == 0) ? 1 : 0;
pXLCD[nSubItem].nCheckedState = nChecked;
UpdateSubItem(nItem, nSubItem);
//根据check更新数据库中的数据。。。。
switch(nSubItem)
{
case 0:
// bool SetIfShow(int nCounts,bool bResult);
m_pEvtDb->SetIfShow(nItem,nChecked);
SetEnabled(nItem,nChecked);
if(!nChecked)
{
m_pEvtDb->SetIfPlaySound(nItem,0);
SetCheckbox(nItem,2,0);
m_pEvtDb->SetIfPlayRing(nItem,0);
SetCheckbox(nItem,3,0);
m_pEvtDb->SetIfPlayAlarm(nItem,0);
SetCheckbox(nItem,4,0);
m_pEvtDb->SetIfPicture(nItem,0);
SetCheckbox(nItem,5,0);
m_pEvtDb->SetIfPrint(nItem,0);
SetCheckbox(nItem,6,0);
}
break;
case 2 :
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPlaySound(nItem,nChecked);
else
SetCheckbox(nItem,nSubItem,0);
break;
case 3 :
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPlayRing(nItem,nChecked);
else
SetCheckbox(nItem,nSubItem,0);
break;
case 4:
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPlayAlarm(nItem,nChecked);
else
SetCheckbox(nItem,nSubItem,0);
break;
case 5 :
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPicture(nItem,nChecked);
else
SetCheckbox(nItem,nSubItem,0);
break;
case 6 :
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPrint(nItem,nChecked);
else
SetCheckbox(nItem,nSubItem,0);
break;
default:
break;
}
CWnd *pWnd = GetParent();
if (!pWnd)
pWnd = GetOwner();
if (pWnd && ::IsWindow(pWnd->m_hWnd))
pWnd->SendMessage(WM_MyListCtrl1_CHECKBOX_CLICKED,
nItem, nSubItem);
// if (GetHeaderCheckedState(nSubItem) !=MyHeaderCtrl1_NO_IMAGE)
// {
int nCheckedCount = CountCheckedItems(nSubItem);
if (nCheckedCount == GetItemCount())
SetHeaderCheckedState(nSubItem, MyHeaderCtrl1_CHECKED_IMAGE);
if(nCheckedCount == 0)
SetHeaderCheckedState(nSubItem,1 );//MyHeaderCtrl1_NO_IMAGE
else
SetHeaderCheckedState(nSubItem,0);// MyHeaderCtrl1_UNCHECKED_IMAGE
// }
}
}
}
// ::UpdateData(false);
CListCtrl::OnLButtonDown(nFlags, point);
}
///////////////////////////////////////////////////////////////////////////////
// OnPaint
void CMyListCtrl1::OnPaint()
{
Default();
if (GetItemCount() <= 0)
{
CDC* pDC = GetDC();
int nSavedDC = pDC->SaveDC();
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
CHeaderCtrl* pHC = GetHeaderCtrl();
if (pHC != NULL)
{
CRect rcH;
pHC->GetItemRect(0, &rcH);
rc.top += rcH.bottom;
}
rc.top += 10;
CString strText;
strText = _T("暂无告警信息");
COLORREF crText = m_crWindowText;
COLORREF crBkgnd = m_crWindow;
CBrush brush(crBkgnd);
pDC->FillRect(rc, &brush);
pDC->SetTextColor(crText);
pDC->SetBkColor(crBkgnd);
pDC->SelectStockObject(ANSI_VAR_FONT);
pDC->DrawText(strText, -1, rc, DT_CENTER | DT_WORDBREAK | DT_NOPREFIX | DT_NOCLIP);
pDC->RestoreDC(nSavedDC);
ReleaseDC(pDC);
}
}
///////////////////////////////////////////////////////////////////////////////
// InsertItem
int CMyListCtrl1::InsertItem(const LVITEM* pItem)
{
ASSERT(pItem->iItem >= 0);
if (pItem->iItem < 0)
return -1;
int index = CListCtrl::InsertItem(pItem);
if (index < 0)
return index;
MyListCtrl1DATA *pXLCD = new MyListCtrl1DATA [GetColumns()];
ASSERT(pXLCD);
if (!pXLCD)
return -1;
pXLCD[0].crText = m_crWindowText;
pXLCD[0].crBackground = m_crWindow;
pXLCD[0].nImage = pItem->iImage;
CListCtrl::SetItemData(index, (DWORD) pXLCD);
return index;
}
///////////////////////////////////////////////////////////////////////////////
// InsertItem
int CMyListCtrl1::InsertItem(int nItem, LPCTSTR lpszItem)
{
ASSERT(nItem >= 0);
if (nItem < 0)
return -1;
return InsertItem(nItem,
lpszItem,
m_crWindowText,
m_crWindow);
}
///////////////////////////////////////////////////////////////////////////////
// InsertItem
int CMyListCtrl1::InsertItem(int nItem,
LPCTSTR lpszItem,
COLORREF crText,
COLORREF crBackground)
{
ASSERT(nItem >= 0);
if (nItem < 0)
return -1;
int index = CListCtrl::InsertItem(nItem, lpszItem);
if (index < 0)
return index;
MyListCtrl1DATA *pXLCD = new MyListCtrl1DATA [GetColumns()];
ASSERT(pXLCD);
if (!pXLCD)
return -1;
pXLCD[0].crText = crText;
pXLCD[0].crBackground = crBackground;
pXLCD[0].nImage = -1;
CListCtrl::SetItemData(index, (DWORD) pXLCD);
return index;
}
///////////////////////////////////////////////////////////////////////////////
// SetItem
int CMyListCtrl1::SetItem(const LVITEM* pItem)
{
ASSERT(pItem->iItem >= 0);
if (pItem->iItem < 0)
return -1;
BOOL rc = CListCtrl::SetItem(pItem);
if (!rc)
return FALSE;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(pItem->iItem);
if (pXLCD)
{
pXLCD[pItem->iSubItem].nImage = pItem->iImage;
UpdateSubItem(pItem->iItem, pItem->iSubItem);
rc = TRUE;
}
else
{
rc = FALSE;
}
return rc;
}
///////////////////////////////////////////////////////////////////////////////
// SetItemImage
BOOL CMyListCtrl1::SetItemImage(int nItem, int nSubItem, int nImage)
{
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;
BOOL rc = TRUE;
if (nItem < 0)
return FALSE;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (pXLCD)
{
pXLCD[nSubItem].nImage = nImage;
}
UpdateSubItem(nItem, nSubItem);
return rc;
}
///////////////////////////////////////////////////////////////////////////////
// SetItemText
BOOL CMyListCtrl1::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)
{
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;
BOOL rc = CListCtrl::SetItemText(nItem, nSubItem, lpszText);
UpdateSubItem(nItem, nSubItem);
return rc;
}
///////////////////////////////////////////////////////////////////////////////
// SetItemText
//
// This function will set the text and colors for a subitem. If lpszText
// is NULL, only the colors will be set. If a color value is -1, the display
// color will be set to the default Windows color.
//
BOOL CMyListCtrl1::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText,
COLORREF crText, COLORREF crBackground)
{
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;
BOOL rc = TRUE;
if (nItem < 0)
return FALSE;
if (lpszText)
rc = CListCtrl::SetItemText(nItem, nSubItem, lpszText);
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (pXLCD)
{
pXLCD[nSubItem].crText = (crText == -1) ? m_crWindowText : crText;
pXLCD[nSubItem].crBackground = (crBackground == -1) ? m_crWindow : crBackground;
}
UpdateSubItem(nItem, nSubItem);
return rc;
}
///////////////////////////////////////////////////////////////////////////////
// DeleteItem
BOOL CMyListCtrl1::DeleteItem(int nItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (pXLCD)
delete [] pXLCD;
CListCtrl::SetItemData(nItem, 0);
return CListCtrl::DeleteItem(nItem);
}
///////////////////////////////////////////////////////////////////////////////
// DeleteAllItems
BOOL CMyListCtrl1::DeleteAllItems()
{
int n = GetItemCount();
for (int i = 0; i < n; i++)
{
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(i);
if (pXLCD)
delete [] pXLCD;
CListCtrl::SetItemData(i, 0);
}
return CListCtrl::DeleteAllItems();
}
///////////////////////////////////////////////////////////////////////////////
// OnDestroy
void CMyListCtrl1::OnDestroy()
{
int n = GetItemCount();
for (int i = 0; i < n; i++)
{
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(i);
if (pXLCD)
delete [] pXLCD;
CListCtrl::SetItemData(i, 0);
}
CListCtrl::OnDestroy();
}
///////////////////////////////////////////////////////////////////////////////
// SetCheckbox
BOOL CMyListCtrl1::SetCheckbox(int nItem, int nSubItem, int nCheckedState)
{
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(nCheckedState == 0 || nCheckedState == 1 || nCheckedState == -1);
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
// update checkbox in subitem
pXLCD[nSubItem].nCheckedState = nCheckedState;
UpdateSubItem(nItem, nSubItem);
// now update checkbox in column header
// -1 = no checkbox in column header
int nCheckedCount = CountCheckedItems(nSubItem);
if (nCheckedCount == GetItemCount())
SetHeaderCheckedState(nSubItem, MyHeaderCtrl1_CHECKED_IMAGE);
if(nCheckedCount == 0)
SetHeaderCheckedState(nSubItem,1 );//MyHeaderCtrl1_NO_IMAGE
else
SetHeaderCheckedState(nSubItem,0);// MyHeaderCtrl1_UNCHECKED_IMAGE
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// GetCheckbox
int CMyListCtrl1::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;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) 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 CMyListCtrl1::GetEnabled(int nItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
return pXLCD[0].bEnabled;
}
///////////////////////////////////////////////////////////////////////////////
// SetEnabled
BOOL CMyListCtrl1::SetEnabled(int nItem, BOOL bEnable)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) 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 CMyListCtrl1::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;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
// update bold flag
pXLCD[nSubItem].bBold = bBold;
UpdateSubItem(nItem, nSubItem);
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// GetBold
BOOL CMyListCtrl1::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;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return FALSE;
}
// update bold flag
return pXLCD[nSubItem].bBold;
}
///////////////////////////////////////////////////////////////////////////////
// SetCurSel
BOOL CMyListCtrl1::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 CMyListCtrl1::GetCurSel()
{
POSITION pos = GetFirstSelectedItemPosition();
int nSelectedItem = -1;
if (pos != NULL)
nSelectedItem = GetNextSelectedItem(pos);
return nSelectedItem;
}
///////////////////////////////////////////////////////////////////////////////
// UpdateSubItem
void CMyListCtrl1::UpdateSubItem(int nItem, int nSubItem)
{
ASSERT(nItem >= 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -