add ability to create wxEnhMetaFileDC based on a reference DC

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60843 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2009-05-31 19:11:15 +00:00
parent dd36b5a3e5
commit cc3445715d
4 changed files with 60 additions and 8 deletions

View File

@ -87,6 +87,13 @@ public:
int width = 0, int height = 0, int width = 0, int height = 0,
const wxString& description = wxEmptyString); const wxString& description = wxEmptyString);
// as above, but takes reference DC as first argument to take resolution,
// size, font metrics etc. from
wxEnhMetaFileDC(const wxDC& referenceDC,
const wxString& filename = wxEmptyString,
int width = 0, int height = 0,
const wxString& description = wxEmptyString);
// obtain a pointer to the new metafile (caller should delete it) // obtain a pointer to the new metafile (caller should delete it)
wxEnhMetaFile *Close(); wxEnhMetaFile *Close();

View File

@ -289,7 +289,9 @@ inline void wxCopyRectToRECT(const wxRect& rect, RECT& rc)
// translations between HIMETRIC units (which OLE likes) and pixels (which are // translations between HIMETRIC units (which OLE likes) and pixels (which are
// liked by all the others) - implemented in msw/utilsexc.cpp // liked by all the others) - implemented in msw/utilsexc.cpp
extern void HIMETRICToPixel(LONG *x, LONG *y); extern void HIMETRICToPixel(LONG *x, LONG *y);
extern void HIMETRICToPixel(LONG *x, LONG *y, HDC hdcRef);
extern void PixelToHIMETRIC(LONG *x, LONG *y); extern void PixelToHIMETRIC(LONG *x, LONG *y);
extern void PixelToHIMETRIC(LONG *x, LONG *y, HDC hdcRef);
// Windows convention of the mask is opposed to the wxWidgets one, so we need // Windows convention of the mask is opposed to the wxWidgets one, so we need
// to invert the mask each time we pass one/get one to/from Windows // to invert the mask each time we pass one/get one to/from Windows

View File

@ -218,6 +218,10 @@ public:
wxEnhMetaFileDCImpl( wxEnhMetaFileDC *owner, wxEnhMetaFileDCImpl( wxEnhMetaFileDC *owner,
const wxString& filename, int width, int height, const wxString& filename, int width, int height,
const wxString& description ); const wxString& description );
wxEnhMetaFileDCImpl( wxEnhMetaFileDC *owner,
const wxDC& referenceDC,
const wxString& filename, int width, int height,
const wxString& description );
virtual ~wxEnhMetaFileDCImpl(); virtual ~wxEnhMetaFileDCImpl();
// obtain a pointer to the new metafile (caller should delete it) // obtain a pointer to the new metafile (caller should delete it)
@ -227,6 +231,10 @@ protected:
virtual void DoGetSize(int *width, int *height) const; virtual void DoGetSize(int *width, int *height) const;
private: private:
void Create(HDC hdcRef,
const wxString& filename, int width, int height,
const wxString& description);
// size passed to ctor and returned by DoGetSize() // size passed to ctor and returned by DoGetSize()
int m_width, int m_width,
m_height; m_height;
@ -238,6 +246,24 @@ wxEnhMetaFileDCImpl::wxEnhMetaFileDCImpl( wxEnhMetaFileDC* owner,
int width, int height, int width, int height,
const wxString& description ) const wxString& description )
: wxMSWDCImpl( owner ) : 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)
{ {
m_width = width; m_width = width;
m_height = height; m_height = height;
@ -252,7 +278,7 @@ wxEnhMetaFileDCImpl::wxEnhMetaFileDCImpl( wxEnhMetaFileDC* owner,
rect.bottom = height; rect.bottom = height;
// CreateEnhMetaFile() wants them in HIMETRIC // CreateEnhMetaFile() wants them in HIMETRIC
PixelToHIMETRIC(&rect.right, &rect.bottom); PixelToHIMETRIC(&rect.right, &rect.bottom, hdcRef);
pRect = ▭ pRect = ▭
} }
@ -262,7 +288,6 @@ wxEnhMetaFileDCImpl::wxEnhMetaFileDCImpl( wxEnhMetaFileDC* owner,
pRect = (LPRECT)NULL; pRect = (LPRECT)NULL;
} }
ScreenHDC hdcRef;
m_hDC = (WXHDC)::CreateEnhMetaFile(hdcRef, GetMetaFileName(filename), m_hDC = (WXHDC)::CreateEnhMetaFile(hdcRef, GetMetaFileName(filename),
pRect, description.wx_str()); pRect, description.wx_str());
if ( !m_hDC ) if ( !m_hDC )
@ -318,6 +343,18 @@ wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename,
{ {
} }
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() wxEnhMetaFile *wxEnhMetaFileDC::Close()
{ {
wxEnhMetaFileDCImpl * const wxEnhMetaFileDCImpl * const

View File

@ -304,10 +304,8 @@ int WXDLLEXPORT wxGetWindowId(WXHWND hWnd)
// Metafile helpers // Metafile helpers
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
extern void PixelToHIMETRIC(LONG *x, LONG *y) void PixelToHIMETRIC(LONG *x, LONG *y, HDC hdcRef)
{ {
ScreenHDC hdcRef;
int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE), int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE),
iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE), iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE),
iWidthPels = GetDeviceCaps(hdcRef, HORZRES), iWidthPels = GetDeviceCaps(hdcRef, HORZRES),
@ -319,10 +317,8 @@ extern void PixelToHIMETRIC(LONG *x, LONG *y)
*y /= iHeightPels; *y /= iHeightPels;
} }
extern void HIMETRICToPixel(LONG *x, LONG *y) void HIMETRICToPixel(LONG *x, LONG *y, HDC hdcRef)
{ {
ScreenHDC hdcRef;
int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE), int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE),
iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE), iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE),
iWidthPels = GetDeviceCaps(hdcRef, HORZRES), iWidthPels = GetDeviceCaps(hdcRef, HORZRES),
@ -334,6 +330,16 @@ extern void HIMETRICToPixel(LONG *x, LONG *y)
*y /= (iHeightMM * 100); *y /= (iHeightMM * 100);
} }
void HIMETRICToPixel(LONG *x, LONG *y)
{
HIMETRICToPixel(x, y, ScreenHDC());
}
void PixelToHIMETRIC(LONG *x, LONG *y)
{
PixelToHIMETRIC(x, y, ScreenHDC());
}
void wxDrawLine(HDC hdc, int x1, int y1, int x2, int y2) void wxDrawLine(HDC hdc, int x1, int y1, int x2, int y2)
{ {
#ifdef __WXWINCE__ #ifdef __WXWINCE__