X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a2327a9f80fa3240ab652da8f95a66b5c25576de..ddc5c471d4d8d185e9f2bb9c91c92ddd3a2afff8:/src/msw/enhmeta.cpp diff --git a/src/msw/enhmeta.cpp b/src/msw/enhmeta.cpp index 189d2980b8..c0063dd5e6 100644 --- a/src/msw/enhmeta.cpp +++ b/src/msw/enhmeta.cpp @@ -6,7 +6,7 @@ // Created: 13.01.00 // RCS-ID: $Id$ // Copyright: (c) 2000 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "enhmeta.h" #endif @@ -33,9 +33,11 @@ #ifndef WX_PRECOMP #include "wx/string.h" #include "wx/log.h" + #include "wx/intl.h" #endif //WX_PRECOMP #include "wx/metafile.h" +#include "wx/clipbrd.h" #include "wx/msw/private.h" @@ -69,6 +71,21 @@ static inline const wxChar *GetMetaFileName(const wxString& fn) // wxEnhMetaFile // ---------------------------------------------------------------------------- +void wxEnhMetaFile::Init() +{ + if ( m_filename.empty() ) + { + m_hMF = 0; + } + else // have valid file name, load metafile from it + { + m_hMF = GetEnhMetaFile(m_filename); + if ( !m_hMF ) + wxLogSysError(_("Failed to load metafile from file \"%s\"."), + m_filename.c_str()); + } +} + void wxEnhMetaFile::Assign(const wxEnhMetaFile& mf) { if ( &mf == this ) @@ -102,8 +119,8 @@ void wxEnhMetaFile::Free() bool wxEnhMetaFile::Play(wxDC *dc, wxRect *rectBound) { - wxCHECK_MSG( Ok(), FALSE, _T("can't play invalid enhanced metafile") ); - wxCHECK_MSG( dc, FALSE, _T("invalid wxDC in wxEnhMetaFile::Play") ); + wxCHECK_MSG( Ok(), false, _T("can't play invalid enhanced metafile") ); + wxCHECK_MSG( dc, false, _T("invalid wxDC in wxEnhMetaFile::Play") ); RECT rect; if ( rectBound ) @@ -127,10 +144,10 @@ bool wxEnhMetaFile::Play(wxDC *dc, wxRect *rectBound) { wxLogLastError(_T("PlayEnhMetaFile")); - return FALSE; + return false; } - return TRUE; + return true; } wxSize wxEnhMetaFile::GetSize() const @@ -161,6 +178,18 @@ wxSize wxEnhMetaFile::GetSize() const return size; } +bool wxEnhMetaFile::SetClipboard(int WXUNUSED(width), int WXUNUSED(height)) +{ +#if wxUSE_DRAG_AND_DROP && wxUSE_CLIPBOARD + wxCHECK_MSG( m_hMF, false, _T("can't copy invalid metafile to clipboard") ); + + return wxTheClipboard->AddData(new wxEnhMetaFileDataObject(*this)); +#else // !wxUSE_DRAG_AND_DROP + wxFAIL_MSG(_T("not implemented")); + return false; +#endif // wxUSE_DRAG_AND_DROP/!wxUSE_DRAG_AND_DROP +} + // ---------------------------------------------------------------------------- // wxEnhMetaFileDC // ---------------------------------------------------------------------------- @@ -170,8 +199,8 @@ wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, const wxString& description) { ScreenHDC hdcRef; - - RECT rect, *pRect; + RECT rect; + RECT *pRect; if ( width && height ) { rect.top = @@ -221,12 +250,12 @@ wxEnhMetaFileDC::~wxEnhMetaFileDC() m_hDC = 0; } +#if wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // wxEnhMetaFileDataObject // ---------------------------------------------------------------------------- -#if wxUSE_DRAG_AND_DROP - wxDataFormat wxEnhMetaFileDataObject::GetPreferredFormat(Direction WXUNUSED(dir)) const { @@ -263,7 +292,7 @@ size_t wxEnhMetaFileDataObject::GetDataSize(const wxDataFormat& format) const bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) const { - wxCHECK_MSG( m_metafile.Ok(), FALSE, _T("copying invalid enh metafile") ); + wxCHECK_MSG( m_metafile.Ok(), false, _T("copying invalid enh metafile") ); HENHMETAFILE hEMF = (HENHMETAFILE)m_metafile.GetHENHMETAFILE(); @@ -274,7 +303,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) { wxLogLastError(_T("CopyEnhMetaFile")); - return FALSE; + return false; } *(HENHMETAFILE *)buf = hEMFCopy; @@ -289,7 +318,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) // first get the buffer size and alloc memory size_t size = ::GetWinMetaFileBits(hEMF, 0, NULL, MM_ANISOTROPIC, hdc); - wxCHECK_MSG( size, FALSE, _T("GetWinMetaFileBits() failed") ); + wxCHECK_MSG( size, false, _T("GetWinMetaFileBits() failed") ); BYTE *bits = (BYTE *)malloc(size); @@ -300,7 +329,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) free(bits); - return FALSE; + return false; } // and finally convert them to the WMF @@ -310,7 +339,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) { wxLogLastError(_T("SetMetaFileBitsEx")); - return FALSE; + return false; } METAFILEPICT *mfpict = (METAFILEPICT *)buf; @@ -324,7 +353,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) PixelToHIMETRIC(&mfpict->xExt, &mfpict->yExt); } - return TRUE; + return true; } bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, @@ -337,7 +366,7 @@ bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, { hEMF = *(HENHMETAFILE *)buf; - wxCHECK_MSG( hEMF, FALSE, _T("pasting invalid enh metafile") ); + wxCHECK_MSG( hEMF, false, _T("pasting invalid enh metafile") ); } else { @@ -348,7 +377,7 @@ bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, // first get the buffer size size_t size = ::GetMetaFileBitsEx(mfpict->hMF, 0, NULL); - wxCHECK_MSG( size, FALSE, _T("GetMetaFileBitsEx() failed") ); + wxCHECK_MSG( size, false, _T("GetMetaFileBitsEx() failed") ); // then get metafile bits BYTE *bits = (BYTE *)malloc(size); @@ -358,7 +387,7 @@ bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, free(bits); - return FALSE; + return false; } ScreenHDC hdcRef; @@ -370,14 +399,55 @@ bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, { wxLogLastError(_T("SetWinMetaFileBits")); - return FALSE; + return false; } } m_metafile.SetHENHMETAFILE((WXHANDLE)hEMF); - return TRUE; + return true; +} + +// ---------------------------------------------------------------------------- +// wxEnhMetaFileSimpleDataObject +// ---------------------------------------------------------------------------- + +size_t wxEnhMetaFileSimpleDataObject::GetDataSize() const +{ + // we pass data by handle and not HGLOBAL + return 0u; +} + +bool wxEnhMetaFileSimpleDataObject::GetDataHere(void *buf) const +{ + wxCHECK_MSG( m_metafile.Ok(), false, _T("copying invalid enh metafile") ); + + HENHMETAFILE hEMF = (HENHMETAFILE)m_metafile.GetHENHMETAFILE(); + + HENHMETAFILE hEMFCopy = ::CopyEnhMetaFile(hEMF, NULL); + if ( !hEMFCopy ) + { + wxLogLastError(_T("CopyEnhMetaFile")); + + return false; + } + + *(HENHMETAFILE *)buf = hEMFCopy; + return true; +} + +bool wxEnhMetaFileSimpleDataObject::SetData(size_t WXUNUSED(len), + const void *buf) +{ + HENHMETAFILE hEMF = *(HENHMETAFILE *)buf; + + wxCHECK_MSG( hEMF, false, _T("pasting invalid enh metafile") ); + m_metafile.SetHENHMETAFILE((WXHANDLE)hEMF); + + return true; } + + #endif // wxUSE_DRAG_AND_DROP #endif // wxUSE_ENH_METAFILE