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; }
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); }