X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/265b0c070b7531a31d79e79fd44142f5a807b23d..819451b6c76bdcaf5fd8865479209859511aa986:/src/msw/metafile.cpp?ds=sidebyside diff --git a/src/msw/metafile.cpp b/src/msw/metafile.cpp index a49e59a0ba..4f46aed04a 100644 --- a/src/msw/metafile.cpp +++ b/src/msw/metafile.cpp @@ -5,8 +5,8 @@ // Modified by: VZ 07.01.00: implemented wxMetaFileDataObject // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -32,14 +32,15 @@ #include "wx/setup.h" #endif -#if wxUSE_METAFILE - #ifndef WX_PRECOMP #include "wx/utils.h" #include "wx/app.h" #endif #include "wx/metafile.h" + +#if wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH) + #include "wx/clipbrd.h" #include "wx/msw/private.h" @@ -103,6 +104,9 @@ wxMetafile::~wxMetafile() bool wxMetafile::SetClipboard(int width, int height) { +#if !wxUSE_CLIPBOARD + return FALSE; +#else if (!m_refData) return FALSE; @@ -118,6 +122,7 @@ bool wxMetafile::SetClipboard(int width, int height) wxCloseClipboard(); return success; +#endif } bool wxMetafile::Play(wxDC *dc) @@ -128,7 +133,13 @@ bool wxMetafile::Play(wxDC *dc) dc->BeginDrawing(); if (dc->GetHDC() && M_METAFILEDATA->m_metafile) - PlayMetaFile(GetHdcOf(*dc), (HMETAFILE) M_METAFILEDATA->m_metafile); + { + if ( !::PlayMetaFile(GetHdcOf(*dc), (HMETAFILE) + M_METAFILEDATA->m_metafile) ) + { + wxLogLastError(_T("PlayMetaFile")); + } + } dc->EndDrawing(); @@ -297,8 +308,6 @@ void wxMetafileDC::SetMapMode(int mode) break; } } - m_windowExtX = 100; - m_windowExtY = 100; } // ---------------------------------------------------------------------------- @@ -368,12 +377,12 @@ bool wxMakeMetafilePlaceable(const wxString& filename, int x1, int y1, int x2, i p < (WORD *)&pMFHead ->checksum; ++p) pMFHead ->checksum ^= *p; - FILE *fd = fopen(filename.fn_str(), "rb"); + FILE *fd = wxFopen(filename.fn_str(), "rb"); if (!fd) return FALSE; wxChar tempFileBuf[256]; wxGetTempFileName(wxT("mf"), tempFileBuf); - FILE *fHandle = fopen(wxConvFile.cWX2MB(tempFileBuf), "wb"); + FILE *fHandle = wxFopen(wxConvFile.cWX2MB(tempFileBuf), "wb"); if (!fHandle) return FALSE; fwrite((void *)&header, sizeof(unsigned char), sizeof(mfPLACEABLEHEADER), fHandle); @@ -443,6 +452,9 @@ bool wxMakeMetafilePlaceable(const wxString& filename, int x1, int y1, int x2, i return TRUE; } + +#if wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // wxMetafileDataObject // ---------------------------------------------------------------------------- @@ -455,13 +467,20 @@ size_t wxMetafileDataObject::GetDataSize() const bool wxMetafileDataObject::GetDataHere(void *buf) const { METAFILEPICT *mfpict = (METAFILEPICT *)buf; - const wxMetafile mf = GetMetafile(); - mfpict->mm = mf.GetWindowsMappingMode(); + const wxMetafile& mf = GetMetafile(); + + wxCHECK_MSG( mf.GetHMETAFILE(), FALSE, _T("copying invalid metafile") ); + + // doesn't seem to work with any other mapping mode... + mfpict->mm = MM_ANISOTROPIC; //mf.GetWindowsMappingMode(); mfpict->xExt = mf.GetWidth(); mfpict->yExt = mf.GetHeight(); - mfpict->hMF = (HMETAFILE)mf.GetHMETAFILE(); - wxCHECK_MSG( mfpict->hMF, FALSE, _T("copying invalid metafile") ); + // transform the picture size to HIMETRIC units (0.01mm) - as we don't know + // what DC the picture will be rendered to, use the default display one + PixelToHIMETRIC(&mfpict->xExt, &mfpict->yExt); + + mfpict->hMF = CopyMetaFile((HMETAFILE)mf.GetHMETAFILE(), NULL); return TRUE; } @@ -472,8 +491,18 @@ bool wxMetafileDataObject::SetData(size_t WXUNUSED(len), const void *buf) wxMetafile mf; mf.SetWindowsMappingMode(mfpict->mm); - mf.SetWidth(mfpict->xExt); - mf.SetHeight(mfpict->yExt); + + LONG w = mfpict->xExt, + h = mfpict->yExt; + if ( mfpict->mm == MM_ANISOTROPIC ) + { + // in this case xExt and yExt contain suggested size in HIMETRIC units + // (0.01 mm) - transform this to something more reasonable (pixels) + HIMETRICToPixel(&w, &h); + } + + mf.SetWidth(w); + mf.SetHeight(h); mf.SetHMETAFILE((WXHANDLE)mfpict->hMF); wxCHECK_MSG( mfpict->hMF, FALSE, _T("pasting invalid metafile") ); @@ -483,5 +512,7 @@ bool wxMetafileDataObject::SetData(size_t WXUNUSED(len), const void *buf) return TRUE; } +#endif // wxUSE_DRAG_AND_DROP + #endif // wxUSE_METAFILE