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;
}
Exemple #2
0
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;
}
Exemple #5
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;
}