// TreeListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "TreeListCtrl.h"
/////////////////////////////////////////////////////////////////////////////
// CTreeListCtrl
CTreeListCtrl::CTreeListCtrl():m_nClearance(3)
{
m_nImageWidth = 16;
m_pImageList = NULL;
m_SortInfo.nSortColumn = -1;
m_SortInfo.bCharType = TRUE;
m_SortInfo.bSortAscending = TRUE;
}
CTreeListCtrl::~CTreeListCtrl()
{
DeleteAllItems();
delete m_pImageList;
m_pImageList = NULL;
}
BEGIN_MESSAGE_MAP(CTreeListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CTreeListCtrl)
// NOTE - the ClassWizard will add and remove mapping macros here.
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTreeListCtrl message handlers
int CTreeListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
return CListCtrl::OnCreate(lpCreateStruct);
}
void CTreeListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (IsTreeMode())
{
LVHITTESTINFO lvHitTestInfo;
lvHitTestInfo.pt = point;
SubItemHitTest(&lvHitTestInfo);
if ((lvHitTestInfo.iItem > -1) && (lvHitTestInfo.iSubItem == 0))
{
RECT rcExpand,rcCheckBox;
ITEMINFO *pItem = (ITEMINFO *)CListCtrl::GetItemData(lvHitTestInfo.iItem);
GetSignRect(pItem,&rcExpand,&rcCheckBox);
if (PtInRect(&rcCheckBox,point))
{
if (IsHasCheckBox())
{
BOOL bChecked = CListCtrl::GetCheck(lvHitTestInfo.iItem);
CListCtrl::SetCheck(lvHitTestInfo.iItem,!bChecked);
}
}
else if (PtInRect(&rcExpand,point))
{
ExpandItem(!(pItem->bExpanded),TRUE,pItem);
}
}
}
CListCtrl::OnLButtonDown(nFlags,point);
}
BOOL CTreeListCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
return CListCtrl::Create(dwStyle,rect,pParentWnd,nID);
}
BOOL CTreeListCtrl::SetTreeMode(BOOL bTreeMode)
{
DWORD dwRemove(0), dwAdd(0);
const BOOL bPreTreeMode = (GetStyle()&LVS_OWNERDRAWFIXED);
if (bTreeMode)
{
if (IsTreeMode())
return TRUE;
dwRemove = 0;
dwAdd = LVS_OWNERDRAWFIXED;
}
else
{
if (!IsTreeMode())
return TRUE;
dwRemove = LVS_OWNERDRAWFIXED;
dwAdd = 0;
}
if (CListCtrl::DeleteAllItems() && CListCtrl::ModifyStyle(dwRemove,dwAdd,0))
{
return Show();
}
ASSERT(FALSE);
return FALSE;
}
BOOL CTreeListCtrl::ShowCheckBox(BOOL bShow)
{
bShow = !!bShow;
if (IsHasCheckBox() == bShow)
return TRUE;
DWORD nStyle = CListCtrl::GetExtendedStyle();
if (bShow)
nStyle |= LVS_EX_CHECKBOXES;
else
nStyle &= ~LVS_EX_CHECKBOXES;
return CListCtrl::SetExtendedStyle(nStyle);
}
DWORD_PTR CTreeListCtrl::GetItemData(int nListIndex) const
{
ASSERT((-1 < nListIndex) && (nListIndex < CListCtrl::GetItemCount()));
if ((-1 < nListIndex) && (nListIndex < CListCtrl::GetItemCount()))
{
ITEMINFO *pItem = (ITEMINFO *)(CListCtrl::GetItemData(nListIndex));
ASSERT(pItem);
if (pItem)
return pItem->nItemData;
}
return 0;
}
BOOL CTreeListCtrl::SetItemData(int nItem, DWORD dwData)
{
ASSERT(FALSE);
//CListCtrl::SetItemData(nItem,dwData);
return FALSE;
}
BOOL CTreeListCtrl::SetTopIndex(UINT nLineIndex)
{
const int nTopIndex = GetTopIndex();
const int nHeight = (nLineIndex-nTopIndex)*GetLineHeight();
return Scroll(CSize(0,nHeight));
}
UINT CTreeListCtrl::GetLineHeight() const
{
RECT rcLine;
if (CListCtrl::GetItemRect(0,&rcLine,LVIR_BOUNDS))
return rcLine.bottom-rcLine.top;
return 0;
}
void CTreeListCtrl::GetSelectedItem(ITEMINFOARRAY& arrSeledItem,BOOL bForChecked/*=TRUE*/)
{
arrSeledItem.RemoveAll();
ITEMINFO *pItem = NULL;
if (IsHasCheckBox() && bForChecked)
{
const int nSize = CListCtrl::GetItemCount();
for (int i=0; i<nSize; i++)
{
if (CListCtrl::GetCheck(i))
{
pItem = (ITEMINFO *)CListCtrl::GetItemData(i);
arrSeledItem.Add(pItem);
}
}
}
else
{
int nIndex(-1);
POSITION pos = CListCtrl::GetFirstSelectedItemPosition();
while (pos)
{
nIndex = CListCtrl::GetNextSelectedItem(pos);
pItem = (ITEMINFO *)(CListCtrl::GetItemData(nIndex));
ASSERT(pItem);
if (pItem)
arrSeledItem.Add(pItem);
}
}
}
BOOL CTreeListCtrl::SetItemSelected(int nListIndex,BOOL bSeled)
{
BOOL bResult(FALSE);
UINT nState = bSeled ? LVIS_SELECTED : 0;
return CListCtrl::SetItemState(nListIndex,nState,LVIS_SELECTED);
}
COLORREF CTreeListCtrl::GetBkColor() const
{
return CListCtrl::GetBkColor();
}
BOOL CTreeListCtrl::SetBkColor(COLORREF cr)
{
return CListCtrl::SetBkColor(cr);
}
COLORREF CTreeListCtrl::GetTextColor() const
{
return CListCtrl::GetTextColor();
}
BOOL CTreeListCtrl::SetTextColor(COLORREF cr)
{
return CListCtrl::SetTextColor(cr);
}
COLORREF CTreeListCtrl::GetTextBkColor() const
{
return CListCtrl::GetTextBkColor();
}
BOOL CTreeListCtrl::SetTextBkColor(COLORREF cr)
{
return CListCtrl::SetTextBkColor(cr);
}
BOOL CTreeListCtrl::GetSignRect(const CTreeListCtrl::ITEMINFO* pItemInfo,RECT* prcExpandSign,RECT* prcCheckBox) const
{
if (prcExpandSign)
{
prcExpandSign->left = 0;
prcExpandSign->top = 0;
prcExpandSign->right = 0;
prcExpandSign->bottom = 0;
}
if (prcCheckBox)
{
prcCheckBox->left = 0;
prcCheckBox->top = 0;
prcCheckBox->right = 0;
prcCheckBox->bottom = 0;
}
if (!prcExpandSign && !prcCheckBox)
{
ASSERT(FALSE);
return FALSE;
}
RECT rcSignItem;
const int nListIndex = GetIndexFromList(pItemInfo);
const UINT nLeftMargin = GetLeftMargin(pItemInfo);
if (nListIndex < 0)
{
ASSERT(FALSE);
return FALSE;
}
if (GetItemRect(nListIndex,&rcSignItem,LVIR_BOUNDS) == FALSE)
{
ASSERT(FALSE);
return FALSE;
}
rcSignItem.right = rcSignItem.left+GetColumnWidth(0);
if (prcExpandSign)
{
const UINT nSignWidth = m_nImageWidth-4;
prcExpandSign->left = nLeftMargin+2;
prcExpandSign->right = prcExpandSign->left+nSignWidth;
prcExpandSign->top = rcSignItem.top+3;
prcExpandSign->bottom = prcExpandSign->top+nSignWidth;
}
if (prcCheckBox && IsHasCheckBox())
{
int nCX(0),nCY(0);
CImageList *pImageList = GetImageList(LVSIL_STATE);
if (!pImageList)
{
ASSERT(FALSE);
return FALSE;
}
ImageList_GetIconSize(pImageList->m_hImageList, &nCX, &nCY);
prcCheckBox->left = rcSignItem.left+nLeftMargin+m_nImageWidth+m_nClearance;
prcCheckBox->top = rcSignItem.top+(rcSignItem.bottom-rcSignItem.top-m_nImageWidth)/2;
prcCheckBox->right = prcCheckBox->left+nCX;
prcCheckBox->bottom = prcCheckBox->top+nCY;
}
return TRUE;
}
void CTreeListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (lpDrawItemStruct->CtlType != ODT_LISTVIEW)
return;
if(lpDrawItemStruct->itemAction == ODA_FOCUS)
return ;
m_nImageWidth = lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top-3;
LV_ITEM item;
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
const ITEMINFO *pItemInfo = (ITEMINFO *)lpDrawItemStruct->itemData;
if (!pDC || !pItemInfo || ((UINT)(pItemInfo->arrText.GetSize()) != GetColumnCount()))
{
ASSERT(FALSE);
return ;
}
const int nLeftMargin = GetLeftMargin(pItemInfo);
const int nCheckBoxLeft = lpDrawItemStruct->rcItem.left+nLeftMargin+(m_nImageWidth+m_nClearance);
const int nCheckBoxTop = lpDrawItemStruct->rcItem.top+(lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top-m_nImageWidth)/2;
const BOOL bHasCheckBox = IsHasCheckBox();
RECT rcSubItem;
UINT nTemp(0);
POINT potTemp;
COLORREF crBK, crText;
TCHAR pText[MAX_PATH];
rcSubItem = lpDrawItemStruct->rcItem;
rcSubItem.right = rcSubItem.left+GetColumnWidth(0);
item.mask = LVIF_TEXT|LVIF_STATE;
item.iItem = lpDrawItemStruct->itemID;
item.iSubItem =0;
item.pszText = pText;
item.cchTextMax = MAX_PATH;
item.stateMask = 0xFFFF;
GetItem(&item);
if (lpDrawItemStruct->
树控件与列表控件的结合(VC)
5星 · 超过95%的资源 需积分: 10 34 浏览量
2011-07-17
10:56:18
上传
评论 1
收藏 8KB RAR 举报
lcchuan
- 粉丝: 3
- 资源: 7
最新资源
- delphi实现DBGrid全选和反选功能
- 25C11F41-2B2A-4D1A-AAA8-7C654526B129.pdf
- Android Studio Jellyfish(android-studio-2023.3.1.18-cros.deb)
- MVC+EF框架+EasyUI实现权限管理源码程序
- python第66-75天,Day66-75.rar
- python后端服务project-of-tornado.rar
- python测验,hello-tornado.rar
- 基于SpringBoot+Vue3快速开发平台、自研工作流引擎源码设计.zip
- docker安装部署全流程
- 基于树莓派的人脸识别系统python源码+项目部署说明+超详细代码注释.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页