⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scemfaxctl.cpp

📁 Source code for EMFexplorer 1.0
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*
*	This file is part of the EMFexplorer projet.
*	Copyright (C) 2004 Smith Charles.
*
*	This library is free software; you can redistribute it and/or
*	modify it under the terms of the GNU Lesser General Public
*	License as published by the Free Software Foundation; either
*	version 2.1 of the License, or (at your option) any later version.
*
*   This library is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*   Lesser General Public License for more details.
*
*   You should have received a copy of the GNU Lesser General Public
*   License along with this library; if not, write to the Free Software
*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
*
*	Extension: for commercial use, apply the Equity Public License, which
*	adds to the normal terms of the GLPL a condition of donation to the author.
*   If you are interested in support for this source code,
*   contact Smith Charles <smith.charles@free.fr> for more information.
*/

#include "stdafx.h"
#include "SCEMFAx.h"
#include "SCEMFAxCtl.h"
#include "SCEMFAxPpg.h"
#include "SCEMFAxGDIpPropPage.h"
#include "SCEMFAxColorsPropPage.h"
#include "SCEMFAxPropSheet.h"

#include "SCGenInclude.h"
#include SC_INC_SHARED(SCPropStrLists.h)
#include SC_INC_WINLIB(SCGDIPlus.h)
#include SC_INC_WINLIB(SCGDIUtils.h)
#include SC_INC_EMFLIB(SCEMF.h)
#include SC_INC_EMFLIB(SCEMFRasterizer.h)
#include SC_INC_EMFLIB(SCEMFViewDefs.h)
#include SC_INC_EMFLIB(SCEMFViewHelpers.h)
#include <windowsx.h>	// message crackers

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


IMPLEMENT_DYNCREATE(CSCEMFAxCtrl, COleControl)

CSCGDIPlus g_GDIPlus;

// Controls
#define IDC_WND_EMFIMG        100



/////////////////////////////////////////////////////////////////////////////
// Debug Helpers
#ifdef _DEBUG
	#define SC_SHOW_AXMSG1(szFmt, nValue)\
		{\
			CString strMsg;\
			strMsg.Format(_T(szFmt), nValue);\
			AfxMessageBox(strMsg);\
		}

	#define SC_SHOW_AXMSG0(szMsg)	AfxMessageBox(_T(szMsg))
#else
	#define SC_SHOW_AXMSG1(szFmt, nValue)
	#define SC_SHOW_AXMSG0(szMsg)
#endif
#define SC_SHOW_AXMSG	SC_SHOW_AXMSG0	

/////////////////////////////////////////////////////////////////////////////
// Message map

BEGIN_MESSAGE_MAP(CSCEMFAxCtrl, COleControl)
	//{{AFX_MSG_MAP(CSCEMFAxCtrl)
	ON_WM_CREATE()
	ON_WM_ERASEBKGND()
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
	ON_MESSAGE(OCM_COMMAND, OnOcmCommand)
	ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// Dispatch map

BEGIN_DISPATCH_MAP(CSCEMFAxCtrl, COleControl)
	//{{AFX_DISPATCH_MAP(CSCEMFAxCtrl)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "Picture", Get_Picture, Set_Picture, VT_BSTR)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "CtlBorder", GetCtlBorder, SetCtlBorder, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "CtlColorStyle", GetCtlColorStyle, SetCtlColorStyle, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "CtlColor", GetCtlColor, SetCtlColor, VT_COLOR)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "PageBorderVisible", GetPageBorderVisible, SetPageBorderVisible, VT_BOOL)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "PageShadowVisible", GetPageShadowVisible, SetPageShadowVisible, VT_BOOL)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "PaperColorStyle", GetPaperColorStyle, SetPaperColorStyle, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "PaperColor", GetPaperColor, SetPaperColor, VT_COLOR)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "FitMode", GetFitMode, SetFitMode, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "Scale", GetScale, SetScale, VT_R4)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "MarginL", GetMarginL, SetMarginL, VT_XSIZE_PIXELS)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "MarginT", GetMarginT, SetMarginT, VT_YSIZE_PIXELS)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "MarginR", GetMarginR, SetMarginR, VT_XSIZE_PIXELS)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "MarginB", GetMarginB, SetMarginB, VT_YSIZE_PIXELS)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "PageOrientation", GetPageOrientation, SetPageOrientation, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "TransparencyMode", GetTransparencyMode, SetTransparencyMode, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "ReverseVideoMode", GetReverseVideoMode, SetReverseVideoMode, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "GDIplusEnabled", GetGDIplusEnabled, SetGDIplusEnabled, VT_BOOL)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "TextRenderingQuality", GetTextRenderingHint, SetTextRenderingHint, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "TextContrast", GetTextContrast, SetTextContrast, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "SmoothingMode", GetSmoothingMode, SetSmoothingMode, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "InterpolationMode", GetInterpolationMode, SetInterpolationMode, VT_I2)
	DISP_PROPERTY_EX(CSCEMFAxCtrl, "PixelOffsetMode", GetPixelOffsetMode, SetPixelOffsetMode, VT_I2)
	DISP_FUNCTION(CSCEMFAxCtrl, "SaveAs", SaveAs, VT_I4, VTS_BSTR VTS_I2 VTS_BOOL)
	DISP_DEFVALUE(CSCEMFAxCtrl, "Picture")
	DISP_STOCKPROP_READYSTATE()
	//}}AFX_DISPATCH_MAP
	DISP_FUNCTION_ID(CSCEMFAxCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()


/////////////////////////////////////////////////////////////////////////////
// Event map

BEGIN_EVENT_MAP(CSCEMFAxCtrl, COleControl)
	//{{AFX_EVENT_MAP(CSCEMFAxCtrl)
	EVENT_STOCK_READYSTATECHANGE()
	//}}AFX_EVENT_MAP
END_EVENT_MAP()


/////////////////////////////////////////////////////////////////////////////
// Property pages

// Add more property pages as needed.  Remember to increase the count!
BEGIN_PROPPAGEIDS(CSCEMFAxCtrl, 3)
	PROPPAGEID(CSCEMFAxPropPage::guid)
	PROPPAGEID(CSCEMFAxGDIpPropPage::guid)
	PROPPAGEID(CSCEMFAxColorsPropPage::guid)
END_PROPPAGEIDS(CSCEMFAxCtrl)


/////////////////////////////////////////////////////////////////////////////
// Initialize class factory and guid

IMPLEMENT_OLECREATE_EX(CSCEMFAxCtrl, "SCEMFAX.SCEMFAxCtrl.1",
	0x59f9ff0e, 0xc91, 0x4b80, 0x8d, 0xe3, 0x11, 0x9e, 0x19, 0xa9, 0x6a, 0xe0)


/////////////////////////////////////////////////////////////////////////////
// Type library ID and version

IMPLEMENT_OLETYPELIB(CSCEMFAxCtrl, _tlid, _wVerMajor, _wVerMinor)


/////////////////////////////////////////////////////////////////////////////
// Interface IDs

const IID BASED_CODE IID_DSCEMFAx =
		{ 0xc7cf7c71, 0xefc3, 0x4b48, { 0x89, 0x3f, 0xc6, 0xaf, 0xc8, 0x9e, 0x39, 0x18 } };
const IID BASED_CODE IID_DSCEMFAxEvents =
		{ 0x4e2c90da, 0xf52c, 0x4425, { 0x95, 0xb0, 0xbb, 0x14, 0xe4, 0x44, 0xc5, 0x1a } };


/////////////////////////////////////////////////////////////////////////////
// Control type information

static const DWORD BASED_CODE _dwSCEMFAxOleMisc =
	OLEMISC_ACTIVATEWHENVISIBLE |
	OLEMISC_SETCLIENTSITEFIRST |
	OLEMISC_INSIDEOUT |
	OLEMISC_CANTLINKINSIDE |
	OLEMISC_RECOMPOSEONRESIZE;

IMPLEMENT_OLECTLTYPE(CSCEMFAxCtrl, IDS_SCEMFAX, _dwSCEMFAxOleMisc)


/////////////////////////////////////////////////////////////////////////////
// CSCEMFAxCtrl::CSCEMFAxCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CSCEMFAxCtrl

BOOL CSCEMFAxCtrl::CSCEMFAxCtrlFactory::UpdateRegistry(BOOL bRegister)
{
	// Verify that your control follows apartment-model threading rules.
	// Refer to MFC TechNote 64 for more information.
	// If your control does not conform to the apartment-model rules, then
	// you must modify the code below, changing the 6th parameter from
	// afxRegApartmentThreading to 0.

	if (bRegister)
		return AfxOleRegisterControlClass(
			AfxGetInstanceHandle(),
			m_clsid,
			m_lpszProgID,
			IDS_SCEMFAX,
			IDB_SCEMFAX,
			afxRegApartmentThreading,
			_dwSCEMFAxOleMisc,
			_tlid,
			_wVerMajor,
			_wVerMinor);
	else
		return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}


/////////////////////////////////////////////////////////////////////////////
// CSCEMFAxCtrl::CSCEMFAxCtrl - Constructor

//------------------------------------------------------------------
// disable Warning C4355: "'this' used in base member initializer list."
// Yes, this is dangerous. But not in this context: the CDataPathProperty
// is just storing the pointer in its m_pControl member.

// unsafe
#pragma    warning(disable : 4355)

// Ax-specific defaults
#define SC_AXDFLT_CTLBORDER				SC_CSM_CTLBORDER_NONE
#define SC_AXDFLT_CTLCOLORSTYLE			SC_COLOR_SYSINDEX
#define SC_AXDFLT_CTLCOLOR				SC_MAKE_SYSCOLOR(COLOR_WINDOW)
	//--
#define SC_AXDFLT_PAGEBORDERVISIBLE		FALSE
#define SC_AXDFLT_PAGESHADOWVISIBLE		FALSE
#define SC_AXDFLT_PAPERCOLORSTYLE		SC_COLOR_RGBVALUE
#define SC_AXDFLT_PAPERCOLOR			RGB(255, 255, 255)
#define SC_AXDFLT_FITMODE				SC_FIT_PAGE
#define SC_AXDFLT_SCALE					SC_ZOOM100
#define SC_AXDFLT_MARGINL				0
#define SC_AXDFLT_MARGINT				0
#define SC_AXDFLT_MARGINR				0
#define SC_AXDFLT_MARGINB				0
#define SC_AXDFLT_PAGEORIENTATION		0
#define SC_AXDFLT_TRANSPARENCYMODE		SC_TRANSPARENCY_NORMAL
#define SC_AXDFLT_REVERSEVIDEOMODE		SC_REVERSE_VIDEO_NONE
	//--
#define SC_AXDFLT_GDIPLUSENABLED		TRUE
#define SC_AXDFLT_TEXTRENDERINGHINT		TextRenderingHintAntiAlias
#define SC_AXDFLT_TEXTCONTRAST			2 // hack: 0-12 => from darker to brighter
#define SC_AXDFLT_SMOOTHINGMODE			SmoothingModeHighQuality
#define SC_AXDFLT_INTERPOLATIONMODE		InterpolationModeHighQualityBicubic
#define SC_AXDFLT_PIXELOFFSETMODE		PixelOffsetModeHighQuality
//

CSCEMFAxCtrl::CSCEMFAxCtrl():
	m_hPopupMenu(NULL),
	//
	m_Data(this),
	// Note default values in DoPropExchange prevail on these ones
	m_usCtlBorder(SC_AXDFLT_CTLBORDER),
	m_usCtlColorStyle(SC_AXDFLT_CTLCOLORSTYLE),
	m_crCtlColor(SC_AXDFLT_CTLCOLOR),
		//--
	m_bPageBorderVisible(SC_AXDFLT_PAGEBORDERVISIBLE),
	m_bPageShadowVisible(SC_AXDFLT_PAGESHADOWVISIBLE),
	m_usPaperColorStyle(SC_AXDFLT_PAPERCOLORSTYLE),
	m_crPaperColor(SC_AXDFLT_PAPERCOLOR),
	m_usFitMode(SC_AXDFLT_FITMODE),
	m_fScale(float(SC_AXDFLT_SCALE)/SC_ZOOM100),
	m_lMarginL(SC_AXDFLT_MARGINL),
	m_lMarginT(SC_AXDFLT_MARGINT),
	m_lMarginR(SC_AXDFLT_MARGINR),
	m_lMarginB(SC_AXDFLT_MARGINB),
	m_usPageOrientation(SC_AXDFLT_PAGEORIENTATION),
	m_usTransparencyMode(SC_AXDFLT_TRANSPARENCYMODE),
	m_usReverseVideoMode(SC_AXDFLT_REVERSEVIDEOMODE),
		//--
	m_bEnableGDIp(TRUE),
	m_usTextRenderingHint(SC_AXDFLT_TEXTRENDERINGHINT),
	m_usTextContrast(SC_AXDFLT_TEXTCONTRAST),
	m_usSmoothingMode(SC_AXDFLT_SMOOTHINGMODE),
	m_usInterpolationMode(SC_AXDFLT_INTERPOLATIONMODE),
	m_usPixelOffsetMode(SC_AXDFLT_PIXELOFFSETMODE)
	//
{
	InitializeIIDs(&IID_DSCEMFAx, &IID_DSCEMFAxEvents);

	m_lReadyState = READYSTATE_LOADING;
	// Initialize control's instance data here.
	g_GDIPlus.SCInitInstance();

	// Popup menu
	// Setup document and rendering quality
	m_CtlImage.SCSetEMFDoc(&m_EMFDoc);

	// copy attributes to control
	SCCopyStateToControl();
}
// return to safe state
#pragma    warning(default :4355)

void CSCEMFAxCtrl::SCCopyStateToControl()
{
	// Control border
	m_CtlImage.SCSetCtlBorder(m_usCtlBorder);
	// Control color style and color
	m_CtlImage.SCSetCtlColorStyle(m_usCtlColorStyle, m_crCtlColor, FALSE);

	// Paper border and shadow
	m_CtlImage.SCSetPageBorderVisible(m_bPageBorderVisible, FALSE);
	m_CtlImage.SCSetPageShadowVisible(m_bPageShadowVisible, FALSE);

	// Paper color style and color
	m_CtlImage.SCSetPaperColorStyle(m_usPaperColorStyle, m_crPaperColor, FALSE);

	// Fitmode and Scale
	m_CtlImage.SCSetFitMode(m_usFitMode, FALSE);
	if (SC_FIT_NONE!=m_usFitMode)
		m_fScale = m_CtlImage.SCGetScale();
	else
		m_CtlImage.SCSetScale(m_fScale, FALSE);

	// Margins
	CRect rcMargins(m_lMarginL, m_lMarginT, m_lMarginR, m_lMarginB);
	m_CtlImage.SCSetMargins(rcMargins, FALSE);

	// Orientation
	m_CtlImage.SCSetAngle(m_usPageOrientation, FALSE);

	// Transparency mode
	m_CtlImage.SCSetTransparencyMode(m_usTransparencyMode, FALSE);
	// Reverse video mode
	m_CtlImage.SCSetReverseVideoMode(m_usReverseVideoMode, FALSE);

	// GDI+
	m_CtlImage.SCEnableGDIp(m_bEnableGDIp, FALSE);
	m_CtlImage.SCSetTextRenderingHint(m_usTextRenderingHint, FALSE);
	m_CtlImage.SCSetTextContrast(m_usTextContrast, FALSE);
	m_CtlImage.SCSetSmoothingMode(m_usSmoothingMode, FALSE);
	m_CtlImage.SCSetInterpolationMode(m_usInterpolationMode, FALSE);
	m_CtlImage.SCSetPixelOffsetMode(m_usPixelOffsetMode, FALSE);

	// Refresh
	m_CtlImage.SCRefresh();
}


/////////////////////////////////////////////////////////////////////////////
// CSCEMFAxCtrl::~CSCEMFAxCtrl - Destructor

CSCEMFAxCtrl::~CSCEMFAxCtrl()
{
	// Cleanup your control's instance data here.
	g_GDIPlus.SCExitInstance();
	if (m_hPopupMenu)
		DestroyMenu(m_hPopupMenu);
}


/////////////////////////////////////////////////////////////////////////////
// CSCEMFAxCtrl::OnDraw - Drawing function
void CSCEMFAxCtrl::OnDraw(
			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
}

/////////////////////////////////////////////////////////////////////////////
// CSCEMFAxCtrl::DoPropExchange - Persistence support

/////////////////////////////////////////////////////////////////////////////
// Persistence helpers
#define SC_BEGIN_PROPEX() \
{\
	DWORD dwCookie, dwValue;\
	USHORT usCookie;\
	BOOL bLoading = pPX->IsLoading();\
\

#define SCPX_USHORT(usMember, prop) \
{\
	SCGet##prop##PredefinedCookie(dwCookie, usMember);\
	usCookie = (USHORT)dwCookie;\
\
	PX_UShort(pPX,	SC_T_##prop##, usCookie, usCookie);\
\
	if (bLoading)\
	{\
		SCGet##prop##PredefinedValue(dwValue, usCookie);\
		usMember = (USHORT)dwValue;\
	}\
}\

#define SC_END_PROPEX() \
	if (bLoading) \
		SCCopyStateToControl(); \
}\

/////////////////////////////////////////////////////////////////////////////

void CSCEMFAxCtrl::DoPropExchange(CPropExchange* pPX)
{
	ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
	COleControl::DoPropExchange(pPX);

	// Call PX_ functions for each persistent custom property.
	// Direct connection
	PX_DataPath(pPX, SC_T_Src,				 m_Data);
	PX_Color(pPX,	 SC_T_CtlColor,			 m_crCtlColor,			SC_AXDFLT_CTLCOLOR);
	PX_Bool(pPX,	 SC_T_PageBorderVisible, m_bPageBorderVisible,	SC_AXDFLT_PAGEBORDERVISIBLE);
	PX_Bool(pPX,	 SC_T_PageShadowVisible, m_bPageShadowVisible,	SC_AXDFLT_PAGESHADOWVISIBLE);
	PX_Color(pPX,	 SC_T_PaperColor,		 m_crPaperColor,		SC_AXDFLT_PAPERCOLOR);
	PX_Float(pPX,	 SC_T_Scale,			 m_fScale,				SC_AXDFLT_SCALE);
	PX_Long(pPX,	 SC_T_MarginL,			 m_lMarginL,			SC_AXDFLT_MARGINL);
	PX_Long(pPX,	 SC_T_MarginT,			 m_lMarginT,			SC_AXDFLT_MARGINT);
	PX_Long(pPX,	 SC_T_MarginR,			 m_lMarginR,			SC_AXDFLT_MARGINR);
	PX_Long(pPX,	 SC_T_MarginB,			 m_lMarginB,			SC_AXDFLT_MARGINB);
	PX_Bool(pPX,	 SC_T_GDIplusEnabled,	 m_bEnableGDIp,			SC_AXDFLT_GDIPLUSENABLED);

	// Special : translate enums properties, and update image
	SC_BEGIN_PROPEX()
		//PX_UShort(pPX,	SC_T_CtlBorder, m_usCtlBorder, SC_AXDFLT_CTLBORDER);
		SCPX_USHORT(m_usCtlBorder, CtlBorder)
		
		//PX_UShort(pPX,	SC_T_CtlColorStyle, m_usCtlColorStyle, SC_AXDFLT_CTLCOLORSTYLE);
		SCPX_USHORT(m_usCtlColorStyle, CtlColorStyle)
		
		//PX_UShort(pPX,	SC_T_PaperColorStyle, m_usPaperColorStyle, SC_AXDFLT_PAPERCOLORSTYLE);
		SCPX_USHORT(m_usPaperColorStyle, PaperColorStyle)
		
		//PX_UShort(pPX,	SC_T_FitMode, m_usFitMode, SC_AXDFLT_FITMODE);
		SCPX_USHORT(m_usFitMode, PageFitMode)
		
		//PX_UShort(pPX,	SC_T_PageOrientation, m_usPageOrientation, SC_AXDFLT_PAGEORIENTATION);
		SCPX_USHORT(m_usPageOrientation, PageOrientation)
		
		//PX_UShort(pPX,	SC_T_TransparencyMode, m_usTransparencyMode, SC_AXDFLT_TRANSPARENCYMODE);
		SCPX_USHORT(m_usTransparencyMode, TransparencyMode)
		
		//PX_UShort(pPX,	SC_T_ReverseVideoMode, m_usReverseVideoMode, SC_AXDFLT_REVERSEVIDEOMODE);
		SCPX_USHORT(m_usReverseVideoMode, ReverseVideoMode)
		
		//PX_UShort(pPX,	SC_T_TextRenderingHint, m_usTextRenderingHint, SC_AXDFLT_TEXTRENDERINGHINT);
		SCPX_USHORT(m_usTextRenderingHint, TextRenderingHint) 
		
		//PX_UShort(pPX,	SC_T_TextContrast, m_usTextContrast, SC_AXDFLT_TEXTCONTRAST);
		SCPX_USHORT(m_usTextContrast, TextContrast)
		
		//PX_UShort(pPX,	SC_T_SmoothingMode, m_usSmoothingMode, SC_AXDFLT_SMOOTHINGMODE);
		SCPX_USHORT(m_usSmoothingMode, SmoothingMode)
		
		// PX_UShort(pPX,	SC_T_InterpolationMode, m_usInterpolationMode, SC_AXDFLT_INTERPOLATIONMODE);
		SCPX_USHORT(m_usInterpolationMode, InterpolationMode)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -