?? mylistctrl1.cpp
字號:
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 CMyListCtrl1::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 MyListCtrl1DATA struct.
//
DWORD CMyListCtrl1::GetItemData(int nItem)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return 0;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
return 0;
}
return pXLCD->dwItemData;
}
///////////////////////////////////////////////////////////////////////////////
// SetItemData
BOOL CMyListCtrl1::SetItemData(int nItem, DWORD dwData)
{
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return FALSE;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) 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 CMyListCtrl1::GetHeaderCheckedState(int nSubItem)
{
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return -1;
// use the image index (0 or 1) to indicate the checked status
HDITEM hditem;
hditem.mask = HDI_IMAGE;
m_HeaderCtrl.GetItem(nSubItem, &hditem);
return hditem.iImage;
}
///////////////////////////////////////////////////////////////////////////////
// SetHeaderCheckedState
BOOL CMyListCtrl1::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+1;
m_HeaderCtrl.SetItem(nSubItem, &hditem);
int nItem;
if(nCheckedState==2)//全部選中
{
//根據check更新數據庫中的數據。。。。
switch(nSubItem) {
case 0:
// bool SetIfShow(int nCounts,bool bResult);
for (nItem=0;nItem<GetItemCount();nItem++)
{
m_pEvtDb->SetIfShow(nItem,TRUE);//nCheckedState==2
SetEnabled(nItem,1);
}
break;
case 2 :
for (nItem=0;nItem<GetItemCount();nItem++)
{
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPlaySound(nItem,TRUE);
else
{
m_pEvtDb->SetIfPlaySound(nItem,0);
SetCheckbox(nItem,2,0);
}
}
break;
case 3 :
for (nItem=0;nItem<GetItemCount();nItem++)
{
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPlayRing(nItem,TRUE);
else
{
SetCheckbox(nItem,3,0);
m_pEvtDb->SetIfPlayRing(nItem,0);
}
}
break;
case 4:
for (nItem=0;nItem<GetItemCount();nItem++)
{
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPlayAlarm(nItem,TRUE);
else
{
SetCheckbox(nItem,4,0);
m_pEvtDb->SetIfPlayAlarm(nItem,0);
}
}
break;
case 5 :
for (nItem=0;nItem<GetItemCount();nItem++)
{
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPicture(nItem,TRUE);
else
{
SetCheckbox(nItem,5,0);
m_pEvtDb->SetIfPicture(nItem,0);
}
}
break;
case 6 :
for (nItem=0;nItem<GetItemCount();nItem++)
{
if(m_pEvtDb->GetIfShow(nItem))
m_pEvtDb->SetIfPrint(nItem,TRUE);
else
{
SetCheckbox(nItem,6,0);
m_pEvtDb->SetIfPrint(nItem,0);
}
}
break;
default:
break;
}
}
if(nCheckedState==1)//1為全部沒有選中
{
switch(nSubItem) {
case 0:
// bool SetIfShow(int nCounts,bool bResult);
for (nItem=0;nItem<GetItemCount();nItem++)
{
m_pEvtDb->SetIfShow(nItem,0);
SetEnabled(nItem,0);
//SetCheckbox(nItem,0,0);
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);
// UpdateData(true);
}
break;
case 2 :
for (nItem=0;nItem<GetItemCount();nItem++)
{
m_pEvtDb->SetIfPlaySound(nItem,0);
}
break;
case 3 :
for (nItem=0;nItem<GetItemCount();nItem++)
{
m_pEvtDb->SetIfPlayRing(nItem,0);
}
break;
case 4:
for (nItem=0;nItem<GetItemCount();nItem++)
{
m_pEvtDb->SetIfPlayAlarm(nItem,0);
}
break;
case 5 :
for (nItem=0;nItem<GetItemCount();nItem++)
{
m_pEvtDb->SetIfPicture(nItem,0);
}
break;
case 6 :
for (nItem=0;nItem<GetItemCount();nItem++)
{
m_pEvtDb->SetIfPrint(nItem,0);
}
break;
default:
break;
}
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// OnColumnClick
BOOL CMyListCtrl1::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW* pnmlv = (NMLISTVIEW*)pNMHDR;
int nSubItem = pnmlv->iSubItem;
if(nSubItem==1 )
return false;
if(nSubItem==0 || nSubItem== 2 ||nSubItem==3 || nSubItem==4 || nSubItem==5 || nSubItem==6 )
{
int nCheckedState = GetHeaderCheckedState(nSubItem)-1;
// 0 = no checkbox
if (nCheckedState != 0)
{
nCheckedState = (nCheckedState == 1) ? 2 : 1;
SetHeaderCheckedState(nSubItem, nCheckedState);
m_HeaderCtrl.UpdateWindow();
for (int nItem = 0; nItem < GetItemCount(); nItem++)
{
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
continue;
}
if (pXLCD[nSubItem].nCheckedState != -1)
{
pXLCD[nSubItem].nCheckedState = nCheckedState - 1;
UpdateSubItem(nItem, nSubItem);
SetCheckbox(nItem,nSubItem,pXLCD[nSubItem].nCheckedState);//4.16
}
}
}
else
{
nCheckedState = 1;//(nCheckedState == 1) ? 2 : 1;;
SetHeaderCheckedState(nSubItem, nCheckedState);
m_HeaderCtrl.UpdateWindow();
for (int nItem = 0; nItem < GetItemCount(); nItem++)
{
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
continue;
}
if (pXLCD[nSubItem].nCheckedState != -1)
{
pXLCD[nSubItem].nCheckedState = nCheckedState - 1;
UpdateSubItem(nItem, nSubItem);
SetCheckbox(nItem,nSubItem,pXLCD[nSubItem].nCheckedState);//4.16
}
if(pXLCD[0].nCheckedState==0)
{
SetCheckbox(nItem,2,0);
SetCheckbox(nItem,3,0);
SetCheckbox(nItem,4,0);
SetCheckbox(nItem,5,0);
SetCheckbox(nItem,6,0);
}
}
}
}
*pResult = 0;
return FALSE; // return FALSE to send message to parent also -
// NOTE: MSDN documentation is incorrect
}
///////////////////////////////////////////////////////////////////////////////
// CountCheckedItems
int CMyListCtrl1::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++)
{
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (!pXLCD)
{
continue;
}
if (pXLCD[nSubItem].nCheckedState == 1)
nCount++;
}
return nCount;
}
///////////////////////////////////////////////////////////////////////////////
// OnSysColorChange
void CMyListCtrl1::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 NO_MyListCtrl1_TOOL_TIPS
///////////////////////////////////////////////////////////////////////////////
// OnToolHitTest
int CMyListCtrl1::OnToolHitTest(CPoint point, TOOLINFO * pTI) const
{
LVHITTESTINFO lvhitTestInfo;
lvhitTestInfo.pt = point;
int nItem = ListView_SubItemHitTest(this->m_hWnd, &lvhitTestInfo);
int nSubItem = lvhitTestInfo.iSubItem;
UINT nFlags = lvhitTestInfo.flags;
if (nFlags & LVHT_ONITEMLABEL)
{
// If it did fall on a list item,
// and it was also hit one of the
// item specific subitems we wish to show tool tips for
// get the client (area occupied by this control
RECT rcClient;
GetClientRect(&rcClient);
// fill in the TOOLINFO structure
pTI->hwnd = m_hWnd;
pTI->uId = (UINT) (nItem * 1000 + nSubItem + 1);
pTI->lpszText = LPSTR_TEXTCALLBACK;
pTI->rect = rcClient;
return pTI->uId; // By returning a unique value per listItem,
// we ensure that when the mouse moves over another
// list item, the tooltip will change
}
else
{
//Otherwise, we aren't interested, so let the message propagate
return -1;
}
}
///////////////////////////////////////////////////////////////////////////////
// OnToolTipText
BOOL CMyListCtrl1::OnToolTipText(UINT /*id*/, NMHDR * pNMHDR, LRESULT * pResult)
{
UINT nID = pNMHDR->idFrom;
if (nID == 0)
return TRUE; // do not allow display of automatic tooltip,
// or our tooltip will disappear
// handle both ANSI and UNICODE versions of the message
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
*pResult = 0;
// get the mouse position
const MSG* pMessage;
pMessage = GetCurrentMessage();
ASSERT(pMessage);
CPoint pt;
pt = pMessage->pt; // get the point from the message
ScreenToClient(&pt); // convert the point's coords to be relative to this control
// see if the point falls onto a list item
LVHITTESTINFO lvhitTestInfo;
lvhitTestInfo.pt = pt;
int nItem = SubItemHitTest(&lvhitTestInfo);
int nSubItem = lvhitTestInfo.iSubItem;
UINT nFlags = lvhitTestInfo.flags;
// nFlags is 0 if the SubItemHitTest fails
// Therefore, 0 & <anything> will equal false
if (nFlags & LVHT_ONITEMLABEL)
{
// If it did fall on a list item,
// and it was also hit one of the
// item specific subitems we wish to show tooltips for
CString strToolTip;
strToolTip = _T("");
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (pXLCD)
{
strToolTip = pXLCD[nSubItem].strToolTip;
}
if (!strToolTip.IsEmpty())
{
// If there was a CString associated with the list item,
// copy it's text (up to 80 characters worth, limitation
// of the TOOLTIPTEXT structure) into the TOOLTIPTEXT
// structure's szText member
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strToolTip, 80);
else
_mbstowcsz(pTTTW->szText, strToolTip, 80);
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText, strToolTip, 80);
else
lstrcpyn(pTTTW->szText, strToolTip, 80);
#endif
return FALSE; // we found a tool tip,
}
}
return FALSE; // we didn't handle the message, let the
// framework continue propagating the message
}
///////////////////////////////////////////////////////////////////////////////
// SetItemToolTipText
BOOL CMyListCtrl1::SetItemToolTipText(int nItem, int nSubItem, LPCTSTR lpszToolTipText)
{
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;
}
pXLCD[nSubItem].strToolTip = lpszToolTipText;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// GetItemToolTipText
CString CMyListCtrl1::GetItemToolTipText(int nItem, int nSubItem)
{
CString strToolTip;
strToolTip = _T("");
ASSERT(nItem >= 0);
ASSERT(nItem < GetItemCount());
if ((nItem < 0) || nItem >= GetItemCount())
return strToolTip;
ASSERT(nSubItem >= 0);
ASSERT(nSubItem < GetColumns());
if ((nSubItem < 0) || nSubItem >= GetColumns())
return strToolTip;
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (pXLCD)
{
strToolTip = pXLCD[nSubItem].strToolTip;
}
return strToolTip;
}
///////////////////////////////////////////////////////////////////////////////
// DeleteAllToolTips
void CMyListCtrl1::DeleteAllToolTips()
{
int nRow = GetItemCount();
int nCol = GetColumns();
for (int nItem = 0; nItem < nRow; nItem++)
{
MyListCtrl1DATA *pXLCD = (MyListCtrl1DATA *) CListCtrl::GetItemData(nItem);
if (pXLCD)
for (int nSubItem = 0; nSubItem < nCol; nSubItem++)
pXLCD[nSubItem].strToolTip = _T("");
}
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -