X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e0a050e347b1ece07ad5f165ba1b1d16edbeae77..b85b06e13d22e7fc1604ec1a49caa1227a1b3d36:/src/msw/enhmeta.cpp diff --git a/src/msw/enhmeta.cpp b/src/msw/enhmeta.cpp index aaf3f59857..fd2e73ac75 100644 --- a/src/msw/enhmeta.cpp +++ b/src/msw/enhmeta.cpp @@ -32,6 +32,9 @@ #include "wx/intl.h" #endif //WX_PRECOMP +#include "wx/dc.h" +#include "wx/msw/dc.h" + #include "wx/metafile.h" #include "wx/clipbrd.h" @@ -42,7 +45,6 @@ // ---------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxEnhMetaFile, wxObject) -IMPLEMENT_ABSTRACT_CLASS(wxEnhMetaFileDC, wxDC) // ---------------------------------------------------------------------------- // macros @@ -67,6 +69,21 @@ static inline const wxChar *GetMetaFileName(const wxString& fn) // wxEnhMetaFile // ---------------------------------------------------------------------------- +wxGDIRefData *wxEnhMetaFile::CreateGDIRefData() const +{ + wxFAIL_MSG( _T("must be implemented if used") ); + + return NULL; +} + +wxGDIRefData * +wxEnhMetaFile::CloneGDIRefData(const wxGDIRefData *WXUNUSED(data)) const +{ + wxFAIL_MSG( _T("must be implemented if used") ); + + return NULL; +} + void wxEnhMetaFile::Init() { if ( m_filename.empty() ) @@ -136,7 +153,12 @@ bool wxEnhMetaFile::Play(wxDC *dc, wxRect *rectBound) rect.bottom = size.y; } - if ( !::PlayEnhMetaFile(GetHdcOf(*dc), GetEMF(), &rect) ) + wxDCImpl *impl = dc->GetImpl(); + wxMSWDCImpl *msw_impl = wxDynamicCast( impl, wxMSWDCImpl ); + if (!msw_impl) + return false; + + if ( !::PlayEnhMetaFile(GetHdcOf(*msw_impl), GetEMF(), &rect) ) { wxLogLastError(_T("PlayEnhMetaFile")); @@ -187,10 +209,59 @@ bool wxEnhMetaFile::SetClipboard(int WXUNUSED(width), int WXUNUSED(height)) } // ---------------------------------------------------------------------------- -// wxEnhMetaFileDC +// wxEnhMetaFileDCImpl // ---------------------------------------------------------------------------- -wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, +class wxEnhMetaFileDCImpl : public wxMSWDCImpl +{ +public: + wxEnhMetaFileDCImpl( wxEnhMetaFileDC *owner, + const wxString& filename, int width, int height, + const wxString& description ); + wxEnhMetaFileDCImpl( wxEnhMetaFileDC *owner, + const wxDC& referenceDC, + const wxString& filename, int width, int height, + const wxString& description ); + virtual ~wxEnhMetaFileDCImpl(); + + // obtain a pointer to the new metafile (caller should delete it) + wxEnhMetaFile *Close(); + +protected: + virtual void DoGetSize(int *width, int *height) const; + +private: + void Create(HDC hdcRef, + const wxString& filename, int width, int height, + const wxString& description); + + // size passed to ctor and returned by DoGetSize() + int m_width, + m_height; +}; + + +wxEnhMetaFileDCImpl::wxEnhMetaFileDCImpl( wxEnhMetaFileDC* owner, + const wxString& filename, + int width, int height, + const wxString& description ) + : wxMSWDCImpl( owner ) +{ + Create(ScreenHDC(), filename, width, height, description); +} + +wxEnhMetaFileDCImpl::wxEnhMetaFileDCImpl( wxEnhMetaFileDC* owner, + const wxDC& referenceDC, + const wxString& filename, + int width, int height, + const wxString& description ) + : wxMSWDCImpl( owner ) +{ + Create(GetHdcOf(referenceDC), filename, width, height, description); +} + +void wxEnhMetaFileDCImpl::Create(HDC hdcRef, + const wxString& filename, int width, int height, const wxString& description) { @@ -207,7 +278,7 @@ wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, rect.bottom = height; // CreateEnhMetaFile() wants them in HIMETRIC - PixelToHIMETRIC(&rect.right, &rect.bottom); + PixelToHIMETRIC(&rect.right, &rect.bottom, hdcRef); pRect = ▭ } @@ -217,7 +288,6 @@ wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, pRect = (LPRECT)NULL; } - ScreenHDC hdcRef; m_hDC = (WXHDC)::CreateEnhMetaFile(hdcRef, GetMetaFileName(filename), pRect, description.wx_str()); if ( !m_hDC ) @@ -226,7 +296,7 @@ wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, } } -void wxEnhMetaFileDC::DoGetSize(int *width, int *height) const +void wxEnhMetaFileDCImpl::DoGetSize(int *width, int *height) const { if ( width ) *width = m_width; @@ -234,9 +304,9 @@ void wxEnhMetaFileDC::DoGetSize(int *width, int *height) const *height = m_height; } -wxEnhMetaFile *wxEnhMetaFileDC::Close() +wxEnhMetaFile *wxEnhMetaFileDCImpl::Close() { - wxCHECK_MSG( Ok(), NULL, _T("invalid wxEnhMetaFileDC") ); + wxCHECK_MSG( IsOk(), NULL, _T("invalid wxEnhMetaFileDC") ); HENHMETAFILE hMF = ::CloseEnhMetaFile(GetHdc()); if ( !hMF ) @@ -251,12 +321,49 @@ wxEnhMetaFile *wxEnhMetaFileDC::Close() return mf; } -wxEnhMetaFileDC::~wxEnhMetaFileDC() +wxEnhMetaFileDCImpl::~wxEnhMetaFileDCImpl() { // avoid freeing it in the base class dtor m_hDC = 0; } +// ---------------------------------------------------------------------------- +// wxEnhMetaFileDC +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxEnhMetaFileDC, wxDC) + +wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, + int width, int height, + const wxString& description) + : wxDC(new wxEnhMetaFileDCImpl(this, + filename, + width, height, + description)) +{ +} + +wxEnhMetaFileDC::wxEnhMetaFileDC(const wxDC& referenceDC, + const wxString& filename, + int width, int height, + const wxString& description) + : wxDC(new wxEnhMetaFileDCImpl(this, + referenceDC, + filename, + width, height, + description)) +{ +} + +wxEnhMetaFile *wxEnhMetaFileDC::Close() +{ + wxEnhMetaFileDCImpl * const + impl = static_cast(GetImpl()); + wxCHECK_MSG( impl, NULL, _T("no wxEnhMetaFileDC implementation") ); + + return impl->Close(); +} + #if wxUSE_DRAG_AND_DROP // ----------------------------------------------------------------------------