Example #1
0
void duXmlStatic::PaintSegMent(HDC hDC, XMLSTATICLINESEGMENT *pSegment, duRect &rcSegMent)
{
	XMLTEXTHEAD *pTextHead = pSegment->pTextHead;
	HFONT hFont = GetXmlTextHeadFont(pTextHead);
	HFONT hOldFont = (HFONT)::SelectObject(hDC, hFont);
	
	LPTSTR lpString = new TCHAR[pSegment->nStringWidth + 1];
	memset(lpString, 0, sizeof(TCHAR) * (pSegment->nStringWidth + 1));
	_tcsncpy(lpString, pSegment->lpString, pSegment->nStringWidth);

	if (pTextHead->enType == NORMALTEXT)
	{
		duFont *pFont = (duFont *)GetResObj(m_szDefaultFont, DU_RES_FONT);
		DrawText32Bpp(hDC, pFont, m_clrDefault, lpString, pSegment->nStringWidth, &rcSegMent, DT_LEFT|DT_TOP|DT_SINGLELINE, GetAlpha());
	}
	else if (pTextHead->enType == FORMATTEXT)
	{
		XMLFORMATTEXT *pFormatText = (XMLFORMATTEXT *)pTextHead;
		if (m_pHotSegMent && 
			(m_pHotSegMent->pTextHead == pSegment->pTextHead) && 
			IsHrefSegment(m_pHotSegMent))
		{
			duFont *pFont = (duFont *)GetResObj(pFormatText->strFont.c_str(), DU_RES_FONT);
			duFont *pFontUnderline = new duFont;
			pFontUnderline->SetHeight(pFont->GetHeight());
			pFontUnderline->SetWeight(pFont->GetWeight());
			pFontUnderline->SetItalic(pFont->IsItalic());
			pFontUnderline->SetUnderline(TRUE);
			pFontUnderline->SetStrikeOut(pFont->IsStrikeOut());
			pFontUnderline->SetFontFace(pFont->GetFontFace());
			pFontUnderline->CreateFont();
			
			DrawText32Bpp(hDC, pFontUnderline, pFormatText->clrText, lpString, pSegment->nStringWidth, &rcSegMent, DT_LEFT|DT_TOP|DT_SINGLELINE, GetAlpha());
			delete pFontUnderline;
		}
		else
		{
			duFont *pFont = (duFont *)GetResObj(pFormatText->strFont.c_str(), DU_RES_FONT);
			DrawText32Bpp(hDC, pFont, pFormatText->clrText, lpString, pSegment->nStringWidth, &rcSegMent, DT_LEFT|DT_TOP|DT_SINGLELINE, GetAlpha());
		}
	}
	
	::SelectObject(hDC, hOldFont);
	delete [] lpString;
}
Example #2
0
void duTreeCtrl::DrawObject(HDC hDC)
{
	duRect rcTreeCtrl;
	Plugin_GetRect(this, &rcTreeCtrl);
	rcTreeCtrl.OffsetRect(-rcTreeCtrl.left, -rcTreeCtrl.top);

	BITMAPINFO bmInfo;
	BYTE *pBits;

	HDC hMemDC = ::CreateCompatibleDC(hDC);
	InitBitmapInfo(&bmInfo, rcTreeCtrl.Width(), rcTreeCtrl.Height());
	HBITMAP hBmp = ::CreateDIBSection(hDC, &bmInfo, DIB_RGB_COLORS,(void**)&pBits, 0, 0);
	HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBmp);

	BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
	::AlphaBlend(hMemDC, 0, 0, rcTreeCtrl.Width(), rcTreeCtrl.Height(), hDC, 0, 0, rcTreeCtrl.Width(), rcTreeCtrl.Height(), bf);


	duStyleGroup *pStyleGroup = (duStyleGroup *)GetResObj(GetStyle(), DU_RES_STYLEGROUP);
	if (pStyleGroup)
		pStyleGroup->Draw(hMemDC, &rcTreeCtrl, GetState(), NULL, GetAlpha());
	
	int nOffsetY = 0;
	TreeCtrlItem *pFirstVisible = GetFirstVisibleItem(nOffsetY);
	if (pFirstVisible == NULL || pFirstVisible == m_pRoot)
		return;
		
	duRect rcClient = _GetClientRect();
	
	POINT ptView = GetViewPoint();
	duFont *pFont = (duFont *)GetResObj(m_szFont, DU_RES_FONT);
	
	duSize sizeView;
	GetViewSize(&sizeView);
	
	int nDrawHeight = -nOffsetY;
	TreeCtrlItem *pItem = pFirstVisible;
	while (pItem)
	{
		duRect rcItem;
		
		rcItem.left   = -ptView.x;
		rcItem.right  = rcClient.right;
		rcItem.top    = nDrawHeight;
		rcItem.bottom = rcItem.top + m_nItemHeight;

		UINT uItemState = DU_STATE_NORMAL;
		if (pItem == m_pHot)
			uItemState = DU_STATE_OVER;
		
		if (pItem == m_pSelect)
			uItemState = DU_STATE_PRESS;
		
		DrawByStyle(this, m_szItemStyle, hMemDC, &rcItem, uItemState, NULL, GetAlpha());

		// draw indent[-+]
		int nLeft = (pItem->nLevel - 1) * m_nIndentWidth;
		duRect rcIndent = CalcVCenterRect(rcItem, nLeft, m_nIndentWidth, m_nIndentHeight);
		if (ItemHasChildren(pItem))
		{
			UINT nIndentState = pItem->fExpand ? DU_STATE_NORMAL : DU_STATE_CHECKED;
			DrawByStyle(this, m_szIndentStyle, hMemDC, &rcIndent, nIndentState, NULL, GetAlpha());
		}

		// draw icon
		nLeft += (m_nIndentWidth + m_nIndentIconSpace);
		duRect rcIcon = CalcVCenterRect(rcItem, nLeft, m_nIconWidth, m_nIconHeight);
		duImage *pIcon = (duImage *)GetResObj(pItem->strImage.c_str(), DU_RES_IMAGE);
		if (pIcon)
			DrawNormal(hMemDC, rcIcon.left, rcIcon.top, rcIcon.Width(), rcIcon.Height(), pIcon, 0, 0, GetAlpha());

		// draw text
		duRect rcText;
		nLeft += (m_nIconWidth + m_nIconTextSpace);
		rcText = rcItem;
		rcText.left = rcItem.left + nLeft;
		if (pItem->strText.length() > 0)
			DrawText32Bpp(hMemDC, pFont, m_clrText, pItem->strText.c_str(), pItem->strText.length(), &rcText, DT_LEFT|DT_VCENTER|DT_SINGLELINE, GetAlpha());

		if (nDrawHeight - nOffsetY > rcTreeCtrl.Height())
			break;

		nDrawHeight += m_nItemHeight;
		pItem = GetNextVisibleItem(pItem);
	}

	::AlphaBlend(hDC, 0, 0, rcTreeCtrl.Width(), rcTreeCtrl.Height(), hMemDC, 0, 0, rcTreeCtrl.Width(), rcTreeCtrl.Height(), bf);

	::SelectObject(hMemDC, hOldBitmap);
	::DeleteObject(hBmp);
	::DeleteDC(hMemDC);
}