Changes to DC

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7332 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2000-05-01 19:36:32 +00:00
parent 076e41016d
commit 3d3cbc05f6
6 changed files with 298 additions and 118 deletions

View File

@@ -78,148 +78,258 @@ public:
// implement base class pure virtuals // implement base class pure virtuals
// ---------------------------------- // ----------------------------------
virtual void Clear(); virtual void Clear(void);
virtual bool StartDoc(const wxString& message); virtual bool StartDoc(const wxString& rsMessage);
virtual void EndDoc(); virtual void EndDoc(void);
virtual void StartPage(); virtual void StartPage(void);
virtual void EndPage(); virtual void EndPage(void);
virtual void SetFont(const wxFont& font); virtual void SetFont(const wxFont& rFont);
virtual void SetPen(const wxPen& pen); virtual void SetPen(const wxPen& rPen);
virtual void SetBrush(const wxBrush& brush); virtual void SetBrush(const wxBrush& rBrush);
virtual void SetBackground(const wxBrush& brush); virtual void SetBackground(const wxBrush& rBrush);
virtual void SetBackgroundMode(int mode); virtual void SetBackgroundMode(int nMode);
virtual void SetPalette(const wxPalette& palette); virtual void SetPalette(const wxPalette& rPalette);
virtual void DestroyClippingRegion(); virtual void DestroyClippingRegion(void);
virtual wxCoord GetCharHeight() const; virtual wxCoord GetCharHeight(void) const;
virtual wxCoord GetCharWidth() const; virtual wxCoord GetCharWidth(void) const;
virtual void DoGetTextExtent(const wxString& string, virtual void DoGetTextExtent( const wxString& rsString
wxCoord *x, wxCoord *y, ,wxCoord* pX
wxCoord *descent = NULL, ,wxCoord* pY
wxCoord *externalLeading = NULL, ,wxCoord* pDescent = NULL
wxFont *theFont = NULL) const; ,wxCoord* pExternalLeading = NULL
,wxFont* pTheFont = NULL
) const;
virtual bool CanDrawBitmap(void) const;
virtual bool CanGetTextExtent(void) const;
virtual int GetDepth(void) const;
virtual wxSize GetPPI(void) const;
virtual bool CanDrawBitmap() const; virtual void SetMapMode(int nMode);
virtual bool CanGetTextExtent() const; virtual void SetUserScale( double dX
virtual int GetDepth() const; ,double dY
virtual wxSize GetPPI() const; );
virtual void SetSystemScale( double dX
virtual void SetMapMode(int mode); ,double dY
virtual void SetUserScale(double x, double y); );
virtual void SetSystemScale(double x, double y); virtual void SetLogicalScale( double dX
virtual void SetLogicalScale(double x, double y); ,double dY
virtual void SetLogicalOrigin(wxCoord x, wxCoord y); );
virtual void SetDeviceOrigin(wxCoord x, wxCoord y); virtual void SetLogicalOrigin( wxCoord vX
virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp); ,wxCoord vY
virtual void SetLogicalFunction(int function); );
virtual void SetDeviceOrigin( wxCoord vX
,wxCoord vY
);
virtual void SetAxisOrientation( bool bXLeftRight
,bool bYBottomUp
);
virtual void SetLogicalFunction(int nFunction);
// implementation from now on // implementation from now on
// -------------------------- // --------------------------
virtual void SetRop(WXHDC cdc); virtual void SetRop(WXHDC hCdc);
virtual void DoClipping(WXHDC cdc); virtual void SelectOldObjects(WXHDC hDc);
virtual void SelectOldObjects(WXHDC dc);
wxWindow *GetWindow() const { return m_canvas; } wxWindow* GetWindow(void) const { return m_pCanvas; }
void SetWindow(wxWindow *win) { m_canvas = win; } void SetWindow(wxWindow* pWin) { m_pCanvas = pWin; }
WXHDC GetHDC() const { return m_hDC; } WXHDC GetHDC(void) const { return m_hDC; }
void SetHDC(WXHDC dc, bool bOwnsDC = FALSE) void SetHDC( WXHDC hDc
,bool bOwnsDC = FALSE
)
{ {
m_hDC = dc; m_hDC = hDc;
m_bOwnsDC = bOwnsDC; m_bOwnsDC = bOwnsDC;
} }
const wxBitmap& GetSelectedBitmap(void) const { return m_vSelectedBitmap; }
wxBitmap& GetSelectedBitmap(void) { return m_vSelectedBitmap; }
protected: protected:
virtual void DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, virtual void DoFloodFill( wxCoord vX
int style = wxFLOOD_SURFACE); ,wxCoord vY
,const wxColour& rCol
,int nStyle = wxFLOOD_SURFACE
);
virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const; virtual bool DoGetPixel( wxCoord vX
,wxCoord vY
,wxColour* pCol
) const;
virtual void DoDrawPoint(wxCoord x, wxCoord y); virtual void DoDrawPoint( wxCoord vX
virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); ,wxCoord vY
);
virtual void DoDrawLine( wxCoord vX1
,wxCoord vY1
,wxCoord vX2
,wxCoord vY2
);
virtual void DoDrawArc(wxCoord x1, wxCoord y1, virtual void DoDrawArc( wxCoord vX1
wxCoord x2, wxCoord y2, ,wxCoord vY1
wxCoord xc, wxCoord yc); ,wxCoord vX2
virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, ,wxCoord vY2
double sa, double ea); ,wxCoord vXc
,wxCoord vYc
);
virtual void DoDrawCheckMark( wxCoord vX
,wxCoord vY
,wxCoord vWidth
,wxCoord vHeight
);
virtual void DoDrawEllipticArc( wxCoord vX
,wxCoord vY
,wxCoord vW
,wxCoord vH
,double dSa
,double dEa
);
virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); virtual void DoDrawRectangle( wxCoord vX
virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, ,wxCoord vY
wxCoord width, wxCoord height, ,wxCoord vWidth
double radius); ,wxCoord vHeight
virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); );
virtual void DoDrawRoundedRectangle( wxCoord vX
,wxCoord vY
,wxCoord vWidth
,wxCoord vHeight
,double dRadius
);
virtual void DoDrawEllipse( wxCoord vX
,wxCoord vY
,wxCoord vWidth
,wxCoord vHeight
);
virtual void DoCrossHair(wxCoord x, wxCoord y); virtual void DoCrossHair( wxCoord vX
,wxCoord vY
);
virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y); virtual void DoDrawIcon( const wxIcon& rIcon
virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, ,wxCoord vX
bool useMask = FALSE); ,wxCoord vY
);
virtual void DoDrawBitmap( const wxBitmap& rBmp
,wxCoord vX
,wxCoord vY
,bool bUseMask = FALSE
);
virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y); virtual void DoDrawText( const wxString& rsText
virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, ,wxCoord vX
double angle); ,wxCoord vY
);
virtual void DoDrawRotatedText( const wxString& rsText
,wxCoord vX
,wxCoord vY
,double dAngle
);
virtual bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, virtual bool DoBlit( wxCoord vXdest
wxDC *source, wxCoord xsrc, wxCoord ysrc, ,wxCoord vYdest
int rop = wxCOPY, bool useMask = FALSE); ,wxCoord vWidth
,wxCoord vHeight
,wxDC* pSource
,wxCoord vXsrc
,wxCoord vYsrc
,int nRop = wxCOPY
,bool bUseMask = FALSE
);
// this is gnarly - we can't even call this function DoSetClippingRegion() virtual void DoSetClippingRegionAsRegion(const wxRegion& rRegion);
// because of virtual function hiding virtual void DoSetClippingRegion( wxCoord vX
virtual void DoSetClippingRegionAsRegion(const wxRegion& region); ,wxCoord vY
virtual void DoSetClippingRegion(wxCoord x, wxCoord y, ,wxCoord vWidth
wxCoord width, wxCoord height); ,wxCoord vHeight
virtual void DoGetClippingRegion(wxCoord *x, wxCoord *y, );
wxCoord *width, wxCoord *height) virtual void DoGetClippingRegion( wxCoord* pX
,wxCoord* pY
,wxCoord* pWidth
,wxCoord* pHeight)
{ {
GetClippingBox(x, y, width, height); GetClippingBox( pX
,pY
,pWidth
,pHeight
);
} }
virtual void DoGetSize(int *width, int *height) const; virtual void DoGetSize( int* pWidth
virtual void DoGetSizeMM(int* width, int* height) const; ,int* pHeight
) const;
virtual void DoGetSizeMM( int* pWidth
,int* pHeight
) const;
virtual void DoDrawLines(int n, wxPoint points[], virtual void DoDrawLines( int n
wxCoord xoffset, wxCoord yoffset); ,wxPoint vaPoints[]
virtual void DoDrawPolygon(int n, wxPoint points[], ,wxCoord vXoffset
wxCoord xoffset, wxCoord yoffset, ,wxCoord yYoffset
int fillStyle = wxODDEVEN_RULE); );
virtual void DoDrawPolygon( int n
,wxPoint vaPoints[]
,wxCoord vXoffset
,wxCoord vYoffset
,int nFillStyle = wxODDEVEN_RULE
);
#if wxUSE_SPLINES #if wxUSE_SPLINES
virtual void DoDrawSpline(wxList *points); virtual void DoDrawSpline(wxList* pPoints);
#endif // wxUSE_SPLINES #endif // wxUSE_SPLINES
// OS2-specific member variables //
int m_windowExtX; // common part of DoDrawText() and DoDrawRotatedText()
int m_windowExtY; //
void DrawAnyText( const wxString& rsText
,wxCoord vX
,wxCoord vY
);
// OS2-specific member variables ?? do we even need this under OS/2?
int m_nWindowExtX;
int m_nWindowExtY;
//
// for use in some generic code
//
float m_scaleFactor;
//
// the window associated with this DC (may be NULL) // the window associated with this DC (may be NULL)
wxWindow *m_canvas; //
wxWindow* m_pCanvas;
wxBitmap m_selectedBitmap; wxBitmap m_vSelectedBitmap;
//
// TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it
bool m_bOwnsDC:1; //
bool m_bOwnsDC:1;
//
// our HDC and its usage count: we only free it when the usage count drops // our HDC and its usage count: we only free it when the usage count drops
// to 0 // to 0
WXHDC m_hDC; //
int m_hDCCount; WXHDC m_hDC;
int m_nDCCount;
//
// Store all old GDI objects when do a SelectObject, so we can select them // Store all old GDI objects when do a SelectObject, so we can select them
// back in (this unselecting user's objects) so we can safely delete the // back in (this unselecting user's objects) so we can safely delete the
// DC. // DC.
WXHBITMAP m_oldBitmap; //
WXHPEN m_oldPen; WXHBITMAP m_hOldBitmap;
WXHBRUSH m_oldBrush; WXHPEN m_hOldPen;
WXHFONT m_oldFont; WXHBRUSH m_hOldBrush;
WXHPALETTE m_oldPalette; WXHFONT m_hOldFont;
WXHPALETTE m_hOldPalette;
float m_scaleFactor; // wxPSDC wants to have this. Will disappear.
}; };
#endif #endif
// _WX_DC_H_ // _WX_DC_H_

View File

@@ -42,6 +42,11 @@ static const int VIEWPORT_EXTENT = 1000;
static const int MM_POINTS = 9; static const int MM_POINTS = 9;
static const int MM_METRIC = 10; static const int MM_METRIC = 10;
// usually this is defined in math.h
#ifndef M_PI
static const double M_PI = 3.14159265358979323846;
#endif // M_PI
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// private functions // private functions
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@@ -82,14 +82,14 @@ static RECT g_paintStruct;
wxWindowDC::wxWindowDC() wxWindowDC::wxWindowDC()
{ {
m_canvas = NULL; m_pCanvas = NULL;
} }
wxWindowDC::wxWindowDC(wxWindow *the_canvas) wxWindowDC::wxWindowDC(wxWindow *the_canvas)
{ {
m_canvas = the_canvas; m_pCanvas = the_canvas;
m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas) ); m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas) );
m_hDCCount++; m_nDCCount++;
// //
// default under PM is that Window and Client DC's are the same // default under PM is that Window and Client DC's are the same
// so we offer a separate Presentation Space to use for the // so we offer a separate Presentation Space to use for the
@@ -103,12 +103,12 @@ wxWindowDC::wxWindowDC(wxWindow *the_canvas)
); );
::GpiAssociate(m_hPS, NULLHANDLE); ::GpiAssociate(m_hPS, NULLHANDLE);
::GpiAssociate(m_hPS, m_hDC); ::GpiAssociate(m_hPS, m_hDC);
SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID));
} }
wxWindowDC::~wxWindowDC() wxWindowDC::~wxWindowDC()
{ {
if (m_canvas && m_hDC) if (m_pCanvas && m_hDC)
{ {
SelectOldObjects(m_hDC); SelectOldObjects(m_hDC);
@@ -123,7 +123,7 @@ wxWindowDC::~wxWindowDC()
m_hDC = NULLHANDLE; m_hDC = NULLHANDLE;
} }
m_hDCCount--; m_nDCCount--;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -132,12 +132,12 @@ wxWindowDC::~wxWindowDC()
wxClientDC::wxClientDC() wxClientDC::wxClientDC()
{ {
m_canvas = NULL; m_pCanvas = NULL;
} }
wxClientDC::wxClientDC(wxWindow *the_canvas) wxClientDC::wxClientDC(wxWindow *the_canvas)
{ {
m_canvas = the_canvas; m_pCanvas = the_canvas;
// //
// default under PM is that Window and Client DC's are the same // default under PM is that Window and Client DC's are the same
@@ -147,12 +147,12 @@ wxClientDC::wxClientDC(wxWindow *the_canvas)
// //
// Default mode is BM_LEAVEALONE so we make no call Set the mix // Default mode is BM_LEAVEALONE so we make no call Set the mix
// //
SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID));
} }
wxClientDC::~wxClientDC() wxClientDC::~wxClientDC()
{ {
if ( m_canvas && GetHdc() ) if ( m_pCanvas && GetHdc() )
{ {
SelectOldObjects(m_hDC); SelectOldObjects(m_hDC);
@@ -187,7 +187,7 @@ wxArrayDCInfo wxPaintDC::ms_cache;
wxPaintDC::wxPaintDC() wxPaintDC::wxPaintDC()
{ {
m_canvas = NULL; m_pCanvas = NULL;
m_hDC = 0; m_hDC = 0;
} }
@@ -204,7 +204,7 @@ wxPaintDC::wxPaintDC(wxWindow *canvas)
} }
#endif // __WXDEBUG__ #endif // __WXDEBUG__
m_canvas = canvas; m_pCanvas = canvas;
// do we have a DC for this window in the cache? // do we have a DC for this window in the cache?
wxPaintDCInfo *info = FindInCache(); wxPaintDCInfo *info = FindInCache();
@@ -215,10 +215,10 @@ wxPaintDC::wxPaintDC(wxWindow *canvas)
} }
else // not in cache, create a new one else // not in cache, create a new one
{ {
m_hDC = (WXHDC)::WinBeginPaint(GetWinHwnd(m_canvas), NULLHANDLE, &g_paintStruct); m_hDC = (WXHDC)::WinBeginPaint(GetWinHwnd(m_pCanvas), NULLHANDLE, &g_paintStruct);
ms_cache.Add(new wxPaintDCInfo(m_canvas, this)); ms_cache.Add(new wxPaintDCInfo(m_pCanvas, this));
} }
SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID));
} }
wxPaintDC::~wxPaintDC() wxPaintDC::~wxPaintDC()
@@ -252,7 +252,7 @@ wxPaintDCInfo *wxPaintDC::FindInCache(size_t *index) const
for ( size_t n = 0; n < nCache; n++ ) for ( size_t n = 0; n < nCache; n++ )
{ {
info = &ms_cache[n]; info = &ms_cache[n];
if ( info->hwnd == m_canvas->GetHWND() ) if ( info->hwnd == m_pCanvas->GetHWND() )
{ {
if ( index ) if ( index )
*index = n; *index = n;

View File

@@ -77,13 +77,13 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap )
void wxMemoryDC::DoGetSize( int *width, int *height ) const void wxMemoryDC::DoGetSize( int *width, int *height ) const
{ {
if (!m_selectedBitmap.Ok()) if (!m_vSelectedBitmap.Ok())
{ {
*width = 0; *height = 0; *width = 0; *height = 0;
return; return;
} }
*width = m_selectedBitmap.GetWidth(); *width = m_vSelectedBitmap.GetWidth();
*height = m_selectedBitmap.GetHeight(); *height = m_vSelectedBitmap.GetHeight();
}; };

View File

@@ -469,17 +469,61 @@ wxStatusBar* wxFrame::OnCreateStatusBar(
) )
{ {
wxStatusBar* pStatusBar = NULL; wxStatusBar* pStatusBar = NULL;
SWP vSwp;
ERRORID vError;
wxString sError;
pStatusBar = wxFrameBase::OnCreateStatusBar( nNumber pStatusBar = wxFrameBase::OnCreateStatusBar( nNumber
,lulStyle ,lulStyle
,vId ,vId
,rName ,rName
); );
//
// The default parent set for the Statusbar is m_hWnd which, of course,
// is the handle to the client window of the frame. We don't want that,
// so we have to set the parent to actually be the Frame.
//
::WinSetParent(pStatusBar->GetHWND(), m_hFrame, FALSE);
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
return NULL;
}
//
// Also we need to reset it positioning to enable the SHOW attribute
//
if (!::WinQueryWindowPos(pStatusBar->GetHWND(), &vSwp))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
return NULL;
}
if (!::WinSetWindowPos( pStatusBar->GetHWND()
,HWND_TOP
,vSwp.cx
,vSwp.cy
,vSwp.x
,vSwp.y
,SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER
))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
return NULL;
}
return pStatusBar; return pStatusBar;
} // end of wxFrame::OnCreateStatusBar } // end of wxFrame::OnCreateStatusBar
void wxFrame::PositionStatusBar() void wxFrame::PositionStatusBar()
{ {
SWP vSwp;
ERRORID vError;
wxString sError;
// //
// Native status bar positions itself // Native status bar positions itself
// //
@@ -509,6 +553,27 @@ void wxFrame::PositionStatusBar()
,nWidth ,nWidth
,nStatbarHeight ,nStatbarHeight
); );
if (!::WinQueryWindowPos(m_frameStatusBar->GetHWND(), &vSwp))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
return;
}
if (!::WinSetWindowPos( m_frameStatusBar->GetHWND()
,HWND_TOP
,nStatbarWidth
,nStatbarHeight
,vSwp.x
,vSwp.y
,SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER
))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
return;
}
} }
} // end of wxFrame::PositionStatusBar } // end of wxFrame::PositionStatusBar
#endif // wxUSE_STATUSBAR #endif // wxUSE_STATUSBAR

View File

@@ -269,8 +269,8 @@ void wxMetafileDC::SetMapMode(int mode)
break; break;
} }
} }
m_windowExtX = 100; m_nWindowExtX = 100;
m_windowExtY = 100; m_nWindowExtY = 100;
} }
#ifdef __WIN32__ #ifdef __WIN32__