You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

315 lines
7.7 KiB
C++

// XTPMarkupDrawingContext.cpp: implementation of the CXTPMarkupDrawingContext class.
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "Common/XTPIntel80Helpers.h"
#include "XTPMarkupObject.h"
#include "XTPMarkupDrawingContext.h"
#include "XTPMarkupContext.h"
#include "XTPMarkupBuilder.h"
#include "XTPMarkupDeviceContext.h"
#include "XTPMarkupThickness.h"
#include "GraphicLibrary/GdiPlus/GdiPlus.h"
#pragma warning(disable:4510)
#pragma warning(disable:4610)
using namespace Gdiplus;
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
void CXTPMarkupDrawingContext::Register(BOOL bInit)
{
#ifndef _XTP_EXCLUDE_GDIPLUS
CXTPMarkupGdiPlusDeviceContext::Register(bInit);
#endif
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CXTPMarkupDrawingContext::CXTPMarkupDrawingContext(CXTPMarkupContext* pMarkupContext, HDC hDC, HDC hAttribDC /* = 0 */)
{
m_hDC = hDC;
m_hAttribDC = hAttribDC ? hAttribDC : hDC;
m_bDeleteDC = FALSE;
Init(pMarkupContext);
}
CXTPMarkupDrawingContext::CXTPMarkupDrawingContext(CXTPMarkupContext* pMarkupContext)
{
m_hDC = CreateCompatibleDC(0);
m_hAttribDC = m_hDC;
m_bDeleteDC = TRUE;
Init(pMarkupContext);
}
CXTPMarkupDrawingContext::CXTPMarkupDrawingContext(HDC hDC)
{
m_hDC = hDC;
m_hAttribDC = m_hDC;
m_bDeleteDC = FALSE;
Init(NULL);
}
CXTPMarkupDrawingContext::CXTPMarkupDrawingContext()
{
m_hDC = CreateCompatibleDC(0);
m_hAttribDC = m_hDC;
m_bDeleteDC = TRUE;
Init(NULL);
}
CXTPMarkupDrawingContext::CXTPMarkupDrawingContext(CXTPMarkupContext* /*pMarkupContext*/, GpGraphics* pGpGraphics)
{
m_hDC = NULL;
m_hAttribDC = NULL;
m_bDeleteDC = FALSE;
m_pDeviceContext = new CXTPMarkupGdiPlusExtendedDeviceContext(pGpGraphics);
m_pSelectedFont = NULL;
m_hOldFont = NULL;
m_hDWP = NULL;
m_rcClipBox.SetRectEmpty();
m_pDeviceContext->GetClipBox(m_rcClipBox);
}
CXTPMarkupDrawingContext::CXTPMarkupDrawingContext(CXTPMarkupContext* /*pMarkupContext*/, Graphics* pGraphics)
{
USES_PROTECTED_ACCESS(CXTPMarkupDrawingContext, Graphics, GpGraphics, nativeGraphics);
GpGraphics* pGpGraphics = PROTECTED_ACCESS(Graphics, pGraphics, nativeGraphics);
m_hDWP = NULL;
m_hDC = NULL;
m_hAttribDC = NULL;
m_bDeleteDC = FALSE;
m_pDeviceContext = new CXTPMarkupGdiPlusExtendedDeviceContext(pGpGraphics);
m_pSelectedFont = NULL;
m_hOldFont = NULL;
m_rcClipBox.SetRectEmpty();
m_pDeviceContext->GetClipBox(m_rcClipBox);
}
void CXTPMarkupDrawingContext::Init(CXTPMarkupContext* pMarkupContext)
{
if (!pMarkupContext || pMarkupContext->IsGdiPlusEnabled())
{
#ifndef _XTP_EXCLUDE_GDIPLUS
m_pDeviceContext = new CXTPMarkupGdiPlusDeviceContext(m_hDC, m_hAttribDC);
#else
m_pDeviceContext = new CXTPMarkupDeviceContext(m_hDC, m_hAttribDC);
#endif
}
else
{
m_pDeviceContext = new CXTPMarkupDeviceContext(m_hDC, m_hAttribDC);
}
m_pSelectedFont = NULL;
m_hOldFont = NULL;
m_rcClipBox.SetRectEmpty();
m_pDeviceContext->GetClipBox(m_rcClipBox);
m_hDWP = NULL;
::SetBkMode(m_hDC, TRANSPARENT);
}
CXTPMarkupDrawingContext::~CXTPMarkupDrawingContext()
{
SetFont(NULL);
delete m_pDeviceContext;
if (m_bDeleteDC)
{
DeleteDC(m_hDC);
}
}
HDC CXTPMarkupDrawingContext::Detach()
{
SetFont(NULL);
HDC hDC = m_hDC;
m_hDC = NULL;
return hDC;
}
void CXTPMarkupDrawingContext::OffsetViewport(const POINT& ptVisualOffset)
{
m_pDeviceContext->OffsetViewport(ptVisualOffset);
m_pDeviceContext->GetClipBox(m_rcClipBox);
}
void CXTPMarkupDrawingContext::IntersectClipRect(const RECT& rcLayoutClip)
{
m_pDeviceContext->IntersectClipRect(rcLayoutClip);
m_pDeviceContext->GetClipBox(m_rcClipBox);
}
HRGN CXTPMarkupDrawingContext::SaveClipRegion()
{
return m_pDeviceContext->SaveClipRegion();
}
void CXTPMarkupDrawingContext::RestoreClipRegion(HRGN hrgnClip)
{
if (hrgnClip != NULL)
{
m_pDeviceContext->RestoreClipRegion(hrgnClip);
m_pDeviceContext->GetClipBox(m_rcClipBox);
}
}
void CXTPMarkupDrawingContext::FillSolidRect(CRect rc, COLORREF clr)
{
CXTPMarkupSolidColorBrush brush(clr);
m_pDeviceContext->FillRectangle(rc, &brush);
}
void CXTPMarkupDrawingContext::FillRectangle(CRect rc, CXTPMarkupBrush* pBrush, double* pCornerRadius)
{
if (pCornerRadius)
m_pDeviceContext->FillRoundRectangle(rc, pBrush, pCornerRadius);
else
m_pDeviceContext->FillRectangle(rc, pBrush);
}
void CXTPMarkupDrawingContext::DrawFrame(CRect rc, CXTPMarkupBrush* pBrush)
{
CXTPMarkupThickness thickness(1);
DrawRectangle(rc, pBrush, &thickness);
}
void CXTPMarkupDrawingContext::DrawTextLine(LPCWSTR lpszText, UINT nCount, LPCRECT lpRect)
{
m_pDeviceContext->DrawString(lpszText, nCount, lpRect);
}
void CXTPMarkupDrawingContext::SetFont(CXTPMarkupFont* pFont)
{
if (m_pSelectedFont == pFont)
return;
m_pDeviceContext->SetTextFont(pFont);
MARKUP_RELEASE(m_pSelectedFont);
m_pSelectedFont = pFont;
MARKUP_ADDREF(m_pSelectedFont);
}
SIZE CXTPMarkupDrawingContext::GetTextExtent(LPCWSTR lpszText, int nCount) const
{
return m_pDeviceContext->MeasureString(lpszText, nCount);
}
void CXTPMarkupDrawingContext::DrawLine(int x1, int y1, int x2, int y2, CXTPMarkupStrokeStyle* pStrokeStyle)
{
if (!pStrokeStyle || pStrokeStyle->nStrokeThickness <= 0)
return;
m_pDeviceContext->DrawLine(x1, y1, x2, y2, pStrokeStyle);
}
void CXTPMarkupDrawingContext::Polygon(const POINT* points, int nCount, CXTPMarkupStrokeStyle* pStrokeStyle, CXTPMarkupBrush* pFillBrush)
{
m_pDeviceContext->Polygon(points, nCount, pStrokeStyle, pFillBrush);
}
void CXTPMarkupDrawingContext::Polyline(const POINT* points, int nCount, CXTPMarkupStrokeStyle* pStrokeStyle)
{
m_pDeviceContext->Polyline(points, nCount, pStrokeStyle);
}
void CXTPMarkupDrawingContext::Ellipse(CRect rc, CXTPMarkupStrokeStyle* pStrokeStyle, CXTPMarkupBrush* pFillBrush)
{
m_pDeviceContext->Ellipse(rc, pStrokeStyle, pFillBrush);
}
void CXTPMarkupDrawingContext::DrawRectangle(CRect rc, CXTPMarkupBrush* pBrush, CXTPMarkupThickness* pThickness, double* pCornerRadius)
{
if (!pThickness || !pBrush)
return;
if (pCornerRadius)
m_pDeviceContext->DrawRoundRectangle(rc, pBrush, pThickness, pCornerRadius);
else
m_pDeviceContext->DrawRectangle(rc, pBrush, pThickness);
}
void CXTPMarkupDrawingContext::DrawPath(CXTPMarkupPathData *pData, CXTPMarkupStrokeStyle* pStrokeStyle, CXTPMarkupBrush* pFillBrush)
{
m_pDeviceContext->DrawPath(pData, pStrokeStyle, pFillBrush);
}
HDC CXTPMarkupDrawingContext::GetDC()
{
return m_pDeviceContext->GetDC();
}
void CXTPMarkupDrawingContext::ReleaseDC(HDC hDC)
{
m_pDeviceContext->ReleaseDC(hDC);
}
void CXTPMarkupDrawingContext::SetTextColor(CXTPMarkupBrush* pBrush)
{
m_pDeviceContext->SetTextColor(pBrush);
}
//////////////////////////////////////////////////////////////////////////
// CXTPMarkupPrintingContext
CXTPMarkupPrintingContext::CXTPMarkupPrintingContext(CXTPMarkupContext* pMarkupContext, HDC hDC, HDC hAttribDC)
: CXTPMarkupDrawingContext(pMarkupContext, hDC, hAttribDC)
{
}
CXTPMarkupPrintingContext::CXTPMarkupPrintingContext(HDC hDC, HDC hAttribDC)
: CXTPMarkupDrawingContext(NULL, hDC, hAttribDC)
{
}