CRect CFeedIcoItemListCtrl::GetRectbyGroupID(int nGroupID, UINT mask) { if (nGroupID >= GetGroupCount() || nGroupID < 0) { return CRect(0,0,0,0); } CRect rect(0,mask,0,0); VERIFY( SNDMSG((m_hWnd), LVM_GETGROUPRECT, (WPARAM)(nGroupID), (LPARAM)(RECT*)(&rect)) ); return rect; }
long CIconImgList::GetGroupCount( MSXML2::IXMLDOMElementPtr piGroups) { long lCount = 0; MSXML2::IXMLDOMNodeListPtr piGroupsList; piGroupsList = piGroups->selectNodes( _bstr_t( _T( "GROUP"))); if( NULL != piGroupsList) { long lChildCount = piGroupsList->Getlength(); lCount = lChildCount; MSXML2::IXMLDOMElementPtr piGroupChild; for( long lIndex = 0; lIndex < lChildCount; lIndex++) { piGroupChild = piGroupsList->Getitem( lIndex); lCount += GetGroupCount( piGroupChild); } } return lCount; }
void CFeedIcoItemListCtrl::DrawGroupInfo(CDC & dcMem, const CRect & rectClip, const CRect & rectClient) { dcMem.SelectObject(&m_FontBold); if (thePrefs.GetWindowsVersion() >= _WINVER_VISTA_ ) { int n = GetGroupCount(); for(int i = 0 ; i < n; ++i) { CString strGroupCaption = GetGroupCaption( i ); CString strGroupTotals; if ( strGroupCaption == m_mapGroups.GetKeyAt(i) ) { const CSimpleArray<int>& groupRows = m_mapGroups.GetValueAt(i); strGroupTotals.Format(_T("(共%d个)"), groupRows.GetSize()); } LVGROUP lg = GetGroupInfoByIndex(i, LVGF_GROUPID); CRect rcGroup = GetRectbyGroupID(lg.iGroupId, LVGGR_HEADER); CRect rcIntersect; rcIntersect.IntersectRect(rectClip, rcGroup); //rcGroup.DeflateRect(0, 7);//缩小7像素高度 //rcGroup.OffsetRect(0, -7);//向上偏移7像素 if ( !rcIntersect.IsRectEmpty() ) { DrawGroup(dcMem, rcGroup, strGroupCaption, strGroupTotals); } #ifdef LVGS_COLLAPSIBLE // Maintain LVGS_COLLAPSIBLE state CRect rcDropDown(rcGroup.right - 20, rcGroup.top + 10, rcGroup.right - 5, rcGroup.bottom - 3); if (HasGroupState(i, LVGS_COLLAPSED)) { if (m_imageRss_Group_Drop_Up_Nor) { m_imageRss_Group_Drop_Up_Nor->Draw(dcMem, rcDropDown.left, rcDropDown.top); } } else if (HasGroupState(i, LVGS_NORMAL)) { if (m_imageRss_Group_Drop_Down_Nor) { m_imageRss_Group_Drop_Down_Nor->Draw(dcMem, rcDropDown.left, rcDropDown.top); } } #endif //CRect rcDropDown(rcGroup.right - 20, rcGroup.top + 7, rcGroup.right - 5, rcGroup.bottom - 3); //CRgn rgDropDown;//画圆角矩形 //rgDropDown.CreateRoundRectRgn( rcDropDown.left, rcDropDown.top, rcDropDown.right, rcDropDown.bottom, 3, 3 ); // //CBrush* brushFrame; //brushFrame = new CBrush( GetSysColor(COLOR_GRAYTEXT) ); //dcMem.FrameRgn(&rgDropDown,brushFrame,1,1);//画焦点边框 //delete brushFrame; } } else { if ( nGroupHeight == -1 ) { CRect rcFirstItem;//算法有待优化 GetItemRect(0, rcFirstItem, LVIR_BOUNDS); if ( !rcFirstItem.IsRectEmpty() ) { nGroupHeight = rcFirstItem.top; } }//计算group 高度 CFeedCatalogs & feedCatalogs = CFeedCatalogs::GetInstance(); //遍历Catlogs 获得每个一级分类的Start RssData[只要用第一个就行了....第一个向上偏移绘制] for ( CFeedCatalogs::iterator it = feedCatalogs.GetBegin(); it != feedCatalogs.GetEnd(); ++it ) { FeedCatalog & feedCatlog = it->second; if ( feedCatlog.IsTop() && feedCatlog.GetFeedCount() > 0 ) { CRssFeedBase* feedStart = feedCatlog.GetFirstFeed(); int nStartIndex = GetItemIndex( (CRssFeed*)feedStart );//确定第一个item位置 if ( nStartIndex > -1 ) { int nGroupID = GetGroupIDByItemIndex( nStartIndex ); CString strGroupCaption = GetGroupCaption( nGroupID ); CString strGroupTotals; const CSimpleArray<int>& groupRows = m_mapGroups.GetValueAt(nGroupID); strGroupTotals.Format(_T("(共%d个)"), groupRows.GetSize()); //strGroupTotals.Format(_T("(共 %n 个)"), GetGroupCount()); CRect itemRect; GetItemRect(nStartIndex, &itemRect, LVIR_BOUNDS); //根据item rect获得group rect CRect rcGroup(rectClient.left, itemRect.top - nGroupHeight, rectClient.right, itemRect.top - 6); CRect rtIntersect; rtIntersect.IntersectRect(rectClip, rcGroup); if ( !rtIntersect.IsRectEmpty() ) { DrawGroup(dcMem, rcGroup, strGroupCaption, strGroupTotals); } } } } } }
/** * {@inheritDoc} */ Boolean BaseExpandableListAdapter::IsEmpty() { return GetGroupCount() == 0; }
BOOL CIconImgList::LoadGroups( MSXML2::IXMLDOMDocumentPtr& piDocument) { // グループの追加処理 MSXML2::IXMLDOMElementPtr piRoot; piRoot = piDocument->GetdocumentElement(); if( NULL == piRoot) { return FALSE; } MSXML2::IXMLDOMElementPtr piGroups; piGroups = piRoot->selectSingleNode( _bstr_t( _T( "GROUPS"))); if( NULL == piGroups) { return FALSE; } m_nGroupCount = GetGroupCount( piGroups); if( 0 < m_nGroupCount) { int nParent = 0; m_astGroupData = new GROUPDATA*[ m_nGroupCount]; ZeroMemory( m_astGroupData, sizeof( GROUPDATA*) * m_nGroupCount); PickUpGroups( piGroups, nParent); /* _bstr_t cBstrName; BOOL blEnable; MSXML2::IXMLDOMElementPtr piGroup; _bstr_t cBstr; _variant_t cVariant; TCHAR szWork[ 32]; for( int nIndex = 0; nIndex < m_nGroupCount; nIndex++) { wsprintf( szWork, _T( "//GROUP[@ID='%d']"), nIndex + 1); piGroup = piRoot->selectSingleNode( _bstr_t( szWork)); if( NULL == piGroup) { continue; } cBstrName = piGroup->getAttribute( _bstr_t( _T( "TITLE"))); cVariant = piGroup->getAttribute( _bstr_t( _T( "ENABLE"))); VariantChangeType( &cVariant, &cVariant, 0, VT_BOOL); blEnable = ( VARIANT_FALSE == cVariant.boolVal) ? FALSE : TRUE; if( 0 >= cBstrName.length())cBstrName = _T( "new group!"); m_astGroupData[ nIndex] = ( GROUPDATA*)malloc( sizeof( GROUPDATA) + ( sizeof( TCHAR) * ( cBstrName.length() + 1))); if( NULL != m_astGroupData[ nIndex]) { m_astGroupData[ nIndex]->nParent = nParent; if( 1 <= nParent) { if( FALSE == m_astGroupData[ nParent - 1]->blEnable) { blEnable = FALSE; } } m_astGroupData[ nIndex]->blEnable = blEnable; lstrcpy( m_astGroupData[ nIndex]->szName, cBstrName); } }*/ } return TRUE; }