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++
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)
|
|
{
|
|
}
|