X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/78066fbfd4a3bdccaedb2df3dee08eee5330e159..5fe8354960174a56ee21c456ac3ba521a7b9bae5:/include/wx/dc.h diff --git a/include/wx/dc.h b/include/wx/dc.h index 551e35da34..667284b041 100644 --- a/include/wx/dc.h +++ b/include/wx/dc.h @@ -31,6 +31,65 @@ #include "wx/list.h" // we use wxList in inline functions +class WXDLLEXPORT wxDCBase; + +class WXDLLEXPORT wxDrawObject +{ +public: + + wxDrawObject() + { + ResetBoundingBox(); + } + + virtual ~wxDrawObject() { } + + virtual void Draw(wxDCBase&) const { } + + virtual void CalcBoundingBox(wxCoord x, wxCoord y) + { + if ( m_isBBoxValid ) + { + if ( x < m_minX ) m_minX = x; + if ( y < m_minY ) m_minY = y; + if ( x > m_maxX ) m_maxX = x; + if ( y > m_maxY ) m_maxY = y; + } + else + { + m_isBBoxValid = TRUE; + + m_minX = x; + m_minY = y; + m_maxX = x; + m_maxY = y; + } + } + + void ResetBoundingBox() + { + m_isBBoxValid = FALSE; + + m_minX = m_maxX = m_minY = m_maxY = 0; + } + + // Get the final bounding box of the PostScript or Metafile picture. + + wxCoord MinX() const { return m_minX; } + wxCoord MaxX() const { return m_maxX; } + wxCoord MinY() const { return m_minY; } + wxCoord MaxY() const { return m_maxY; } + + //to define the type of object for derived objects + virtual int GetType()=0; + +protected: + //for boundingbox calculation + bool m_isBBoxValid:1; + //for boundingbox calculation + wxCoord m_minX, m_minY, m_maxX, m_maxY; +}; + // --------------------------------------------------------------------------- // global variables // --------------------------------------------------------------------------- @@ -49,7 +108,7 @@ public: m_clipping = FALSE; m_ok = TRUE; - m_minX = m_minY = m_maxX = m_maxY = 0; + ResetBoundingBox(); m_signX = m_signY = 1; @@ -82,6 +141,13 @@ public: // graphic primitives // ------------------ + virtual void DrawObject(wxDrawObject* drawobject) + { + drawobject->Draw(*this); + CalcBoundingBox(drawobject->MinX(),drawobject->MinY()); + CalcBoundingBox(drawobject->MaxX(),drawobject->MaxY()); + } + void FloodFill(wxCoord x, wxCoord y, const wxColour& col, int style = wxFLOOD_SURFACE) { DoFloodFill(x, y, col, style); } @@ -190,6 +256,22 @@ public: void DrawRotatedText(const wxString& text, const wxPoint& pt, double angle) { DoDrawRotatedText(text, pt.x, pt.y, angle); } + // this version puts both optional bitmap and the text into the given + // rectangle and aligns is as specified by alignment parameter; it also + // will emphasize the character with the given index if it is != -1 and + // return the bounding rectangle if required + virtual void DrawLabel(const wxString& text, + const wxBitmap& image, + const wxRect& rect, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounding = NULL); + + void DrawLabel(const wxString& text, const wxRect& rect, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1) + { DrawLabel(text, wxNullBitmap, rect, alignment, indexAccel); } + bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, int rop = wxCOPY, bool useMask = FALSE) @@ -266,6 +348,7 @@ public: virtual wxCoord GetCharHeight() const = 0; virtual wxCoord GetCharWidth() const = 0; + // only works for single line strings void GetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, wxCoord *descent = NULL, @@ -273,6 +356,13 @@ public: wxFont *theFont = NULL) const { DoGetTextExtent(string, x, y, descent, externalLeading, theFont); } + // works for single as well as multi-line strings + virtual void GetMultiLineTextExtent(const wxString& text, + wxCoord *width, + wxCoord *height, + wxCoord *heightLine = NULL, + wxFont *font = NULL); + // size and resolution // ------------------- @@ -330,6 +420,7 @@ public: // --------- // const... + int GetBackgroundMode() const { return m_backgroundMode; } const wxBrush& GetBackground() const { return m_backgroundBrush; } const wxBrush& GetBrush() const { return m_brush; } const wxFont& GetFont() const { return m_font; } @@ -400,10 +491,29 @@ public: virtual void CalcBoundingBox(wxCoord x, wxCoord y) { - if ( x < m_minX ) m_minX = x; - if ( y < m_minY ) m_minY = y; - if ( x > m_maxX ) m_maxX = x; - if ( y > m_maxY ) m_maxY = y; + if ( m_isBBoxValid ) + { + if ( x < m_minX ) m_minX = x; + if ( y < m_minY ) m_minY = y; + if ( x > m_maxX ) m_maxX = x; + if ( y > m_maxY ) m_maxY = y; + } + else + { + m_isBBoxValid = TRUE; + + m_minX = x; + m_minY = y; + m_maxX = x; + m_maxY = y; + } + } + + void ResetBoundingBox() + { + m_isBBoxValid = FALSE; + + m_minX = m_maxX = m_minY = m_maxY = 0; } // Get the final bounding box of the PostScript or Metafile picture. @@ -568,7 +678,7 @@ protected: wxFont *theFont = NULL) const = 0; #if wxUSE_SPLINES - virtual void DoDrawSpline(wxList *points) = 0; + virtual void DoDrawSpline(wxList *points); #endif protected: @@ -577,6 +687,7 @@ protected: bool m_ok:1; bool m_clipping:1; bool m_isInteractive:1; + bool m_isBBoxValid:1; // coordinate system variables @@ -610,7 +721,7 @@ protected: wxPalette m_palette; private: - DECLARE_NO_COPY_CLASS(wxDCBase); + DECLARE_NO_COPY_CLASS(wxDCBase) DECLARE_ABSTRACT_CLASS(wxDCBase) }; @@ -624,6 +735,8 @@ private: #include "wx/motif/dc.h" #elif defined(__WXGTK__) #include "wx/gtk/dc.h" +#elif defined(__WXMGL__) + #include "wx/mgl/dc.h" #elif defined(__WXQT__) #include "wx/qt/dc.h" #elif defined(__WXMAC__) @@ -634,5 +747,34 @@ private: #include "wx/stubs/dc.h" #endif +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC text colour and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDCTextColourChanger +{ +public: + wxDCTextColourChanger(wxDC& dc) : m_dc(dc) { } + + ~wxDCTextColourChanger() + { + if ( m_colFgOld.Ok() ) + m_dc.SetTextForeground(m_colFgOld); + } + + void Set(const wxColour& col) + { + if ( !m_colFgOld.Ok() ) + m_colFgOld = m_dc.GetTextForeground(); + m_dc.SetTextForeground(col); + } + +private: + wxDC& m_dc; + + wxColour m_colFgOld; +}; + #endif // _WX_DC_H_BASE_