📄 scemfaxctl.cpp
字号:
/*
* 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 + -