| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: pen.h
- // Purpose: interface of wxPen* classes
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- The possible styles for a wxPen.
- Note that hatched pen styles are not supported by X11-based ports,
- including wxGTK.
- */
- enum wxPenStyle
- {
- wxPENSTYLE_INVALID = -1,
- wxPENSTYLE_SOLID,
- /**< Solid style. */
- wxPENSTYLE_DOT,
- /**< Dotted style. */
- wxPENSTYLE_LONG_DASH,
- /**< Long dashed style. */
- wxPENSTYLE_SHORT_DASH,
- /**< Short dashed style. */
- wxPENSTYLE_DOT_DASH,
- /**< Dot and dash style. */
- wxPENSTYLE_USER_DASH,
- /**< Use the user dashes: see wxPen::SetDashes. */
- wxPENSTYLE_TRANSPARENT,
- /**< No pen is used. */
- wxPENSTYLE_STIPPLE_MASK_OPAQUE,
- /**< @todo WHAT's this? */
- wxPENSTYLE_STIPPLE_MASK,
- /**< @todo WHAT's this? */
- wxPENSTYLE_STIPPLE,
- /**< Use the stipple bitmap. */
- wxPENSTYLE_BDIAGONAL_HATCH,
- /**< Backward diagonal hatch. */
- wxPENSTYLE_CROSSDIAG_HATCH,
- /**< Cross-diagonal hatch. */
- wxPENSTYLE_FDIAGONAL_HATCH,
- /**< Forward diagonal hatch. */
- wxPENSTYLE_CROSS_HATCH,
- /**< Cross hatch. */
- wxPENSTYLE_HORIZONTAL_HATCH,
- /**< Horizontal hatch. */
- wxPENSTYLE_VERTICAL_HATCH,
- /**< Vertical hatch. */
- wxPENSTYLE_FIRST_HATCH,
- /**< First of the hatch styles (inclusive). */
- wxPENSTYLE_LAST_HATCH
- /**< Last of the hatch styles (inclusive). */
- };
- /**
- The possible join values of a wxPen.
- @todo use wxPENJOIN_ prefix
- */
- enum wxPenJoin
- {
- wxJOIN_INVALID = -1,
- wxJOIN_BEVEL = 120,
- wxJOIN_MITER,
- wxJOIN_ROUND,
- };
- /**
- The possible cap values of a wxPen.
- @todo use wxPENCAP_ prefix
- */
- enum wxPenCap
- {
- wxCAP_INVALID = -1,
- wxCAP_ROUND = 130,
- wxCAP_PROJECTING,
- wxCAP_BUTT
- };
- /**
- @class wxPen
- A pen is a drawing tool for drawing outlines. It is used for drawing
- lines and painting the outline of rectangles, ellipses, etc.
- It has a colour, a width and a style.
- @note On a monochrome display, wxWidgets shows all non-white pens as black.
- Do not initialize objects on the stack before the program commences,
- since other required structures may not have been set up yet.
- Instead, define global pointers to objects and create them in wxApp::OnInit()
- or when required.
- An application may wish to dynamically create pens with different characteristics,
- and there is the consequent danger that a large number of duplicate pens will
- be created. Therefore an application may wish to get a pointer to a pen by using
- the global list of pens ::wxThePenList, and calling the member function
- wxPenList::FindOrCreatePen().
- See wxPenList for more info.
- This class uses @ref overview_refcount "reference counting and copy-on-write" internally
- so that assignments between two instances of this class are very cheap.
- You can therefore use actual objects instead of pointers without efficiency problems.
- If an instance of this class is changed it will create its own data internally
- so that other instances, which previously shared the data using the reference
- counting, are not affected.
- @library{wxcore}
- @category{gdi}
- @stdobjects
- @li ::wxNullPen
- @li ::wxBLACK_DASHED_PEN
- @li ::wxBLACK_PEN
- @li ::wxBLUE_PEN
- @li ::wxCYAN_PEN
- @li ::wxGREEN_PEN
- @li ::wxYELLOW_PEN
- @li ::wxGREY_PEN
- @li ::wxLIGHT_GREY_PEN
- @li ::wxMEDIUM_GREY_PEN
- @li ::wxRED_PEN
- @li ::wxTRANSPARENT_PEN
- @li ::wxWHITE_PEN
- @see wxPenList, wxDC, wxDC::SetPen()
- */
- class wxPen : public wxGDIObject
- {
- public:
- /**
- Default constructor. The pen will be uninitialised, and IsOk() will return @false.
- */
- wxPen();
- /**
- Constructs a pen from a colour object, pen width and style.
- @param colour
- A colour object.
- @param width
- Pen width. Under Windows, the pen width cannot be greater than 1 if
- the style is @c wxPENSTYLE_DOT, @c wxPENSTYLE_LONG_DASH, @c wxPENSTYLE_SHORT_DASH,
- @c wxPENSTYLE_DOT_DASH, or @c wxPENSTYLE_USER_DASH.
- @param style
- The style may be one of the ::wxPenStyle values.
- @remarks Different versions of Windows and different versions of other
- platforms support very different subsets of the styles above
- - there is no similarity even between Windows95 and Windows98 -
- so handle with care.
- @see SetStyle(), SetColour(), SetWidth()
- */
- wxPen(const wxColour& colour, int width = 1, wxPenStyle style = wxPENSTYLE_SOLID);
- /**
- Constructs a stippled pen from a stipple bitmap and a width.
- @param width
- Pen width. Under Windows, the pen width cannot be greater than 1 if
- the style is @c wxPENSTYLE_DOT, @c wxPENSTYLE_LONG_DASH, @c wxPENSTYLE_SHORT_DASH,
- @c wxPENSTYLE_DOT_DASH, or @c wxPENSTYLE_USER_DASH.
- @param stipple
- A stipple bitmap.
- @onlyfor{wxmsw,wxosx}
- @see SetWidth(), SetStipple()
- */
- wxPen(const wxBitmap& stipple, int width);
- /**
- Copy constructor, uses @ref overview_refcount.
- @param pen
- A pointer or reference to a pen to copy.
- */
- wxPen(const wxPen& pen);
- /**
- Destructor.
- @see @ref overview_refcount_destruct "reference-counted object destruction"
- @remarks Although all remaining pens are deleted when the application
- exits, the application should try to clean up all pens
- itself. This is because wxWidgets cannot know if a
- pointer to the pen object is stored in an application
- data structure, and there is a risk of double deletion.
- */
- virtual ~wxPen();
- /**
- Returns the pen cap style, which may be one of @c wxCAP_ROUND,
- @c wxCAP_PROJECTING and @c wxCAP_BUTT.
- The default is @c wxCAP_ROUND.
- @see SetCap()
- */
- virtual wxPenCap GetCap() const;
- /**
- Returns a reference to the pen colour.
- @see SetColour()
- */
- virtual wxColour GetColour() const;
- /**
- Gets an array of dashes (defined as @c char in X, @c DWORD under Windows).
- @a dashes is a pointer to the internal array. Do not deallocate or store this
- pointer.
- @return The number of dashes associated with this pen.
- @see SetDashes()
- */
- virtual int GetDashes(wxDash** dashes) const;
- /**
- Returns the pen join style, which may be one of @c wxJOIN_BEVEL,
- @c wxJOIN_ROUND and @c wxJOIN_MITER.
- The default is @c wxJOIN_ROUND.
- @see SetJoin()
- */
- virtual wxPenJoin GetJoin() const;
- /**
- Gets a pointer to the stipple bitmap.
- @see SetStipple()
- */
- virtual wxBitmap* GetStipple() const;
- /**
- Returns the pen style.
- @see wxPen(), SetStyle()
- */
- virtual wxPenStyle GetStyle() const;
- /**
- Returns the pen width.
- @see SetWidth()
- */
- virtual int GetWidth() const;
- /**
- Returns @true if the pen is initialised.
- Notice that an uninitialized pen object can't be queried for any pen
- properties and all calls to the accessor methods on it will result in
- an assert failure.
- */
- virtual bool IsOk() const;
- /**
- Returns @true if the pen is a valid non-transparent pen.
- This method returns @true if the pen object is initialized and has a
- non-transparent style. Notice that this should be used instead of
- simply testing whether GetStyle() returns a style different from
- wxPENSTYLE_TRANSPARENT if the pen may be invalid as GetStyle() would
- assert in this case.
- @see IsTransparent()
- @since 2.9.2.
- */
- bool IsNonTransparent() const;
- /**
- Returns @true if the pen is transparent.
- A transparent pen is simply a pen with wxPENSTYLE_TRANSPARENT style.
- Notice that this function works even for non-initialized pens (for
- which it returns @false) unlike tests of the form <code>GetStyle() ==
- wxPENSTYLE_TRANSPARENT</code> which would assert if the pen is invalid.
- @see IsNonTransparent()
- @since 2.9.2.
- */
- bool IsTransparent() const;
- /**
- Sets the pen cap style, which may be one of @c wxCAP_ROUND, @c wxCAP_PROJECTING
- and @c wxCAP_BUTT. The default is @c wxCAP_ROUND.
- @see GetCap()
- */
- virtual void SetCap(wxPenCap capStyle);
- //@{
- /**
- The pen's colour is changed to the given colour.
- @see GetColour()
- */
- virtual void SetColour(wxColour& colour);
- virtual void SetColour(unsigned char red, unsigned char green, unsigned char blue);
- //@}
- /**
- Associates an array of dash values (defined as @c char in X, @c DWORD under
- Windows) with the pen.
- The array is not deallocated by wxPen, but neither must it be deallocated by
- the calling application until the pen is deleted or this function is called
- with a @NULL array.
- @see GetDashes()
- */
- virtual void SetDashes(int n, const wxDash* dash);
- /**
- Sets the pen join style, which may be one of @c wxJOIN_BEVEL, @c wxJOIN_ROUND
- and @c wxJOIN_MITER.
- The default is @c wxJOIN_ROUND.
- @see GetJoin()
- */
- virtual void SetJoin(wxPenJoin join_style);
- /**
- Sets the bitmap for stippling.
- @see GetStipple()
- */
- virtual void SetStipple(const wxBitmap& stipple);
- /**
- Set the pen style.
- @see wxPen()
- */
- virtual void SetStyle(wxPenStyle style);
- /**
- Sets the pen width.
- @see GetWidth()
- */
- virtual void SetWidth(int width);
- /**
- Inequality operator.
- See @ref overview_refcount_equality "reference-counted object comparison" for
- more info.
- */
- bool operator!=(const wxPen& pen) const;
- /**
- Assignment operator, using @ref overview_refcount.
- */
- wxPen& operator=(const wxPen& pen);
- /**
- Equality operator.
- See @ref overview_refcount_equality "reference-counted object comparison" for
- more info.
- */
- bool operator==(const wxPen& pen) const;
- };
- /**
- An empty pen.
- wxPen::IsOk() always returns @false for this object.
- */
- wxPen wxNullPen;
- /**
- Red pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxRED_PEN;
- /**
- Blue pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxBLUE_PEN;
- /**
- Cyan pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxCYAN_PEN;
- /**
- Green pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxGREEN_PEN;
- /**
- Yellow pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxYELLOW_PEN;
- /**
- Black pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxBLACK_PEN;
- /**
- White pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxWHITE_PEN;
- /**
- Transparent pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxTRANSPARENT_PEN;
- /**
- Black dashed pen.
- Except for the color and for the @c wxPENSTYLE_SHORT_DASH it has all standard attributes
- (1-pixel width, @c wxCAP_ROUND style, etc...).
- */
- wxPen* wxBLACK_DASHED_PEN;
- /**
- Grey pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxGREY_PEN;
- /**
- Medium-grey pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxMEDIUM_GREY_PEN;
- /**
- Light-grey pen.
- Except for the color it has all standard attributes
- (1-pixel width, @c wxPENSTYLE_SOLID and @c wxCAP_ROUND styles, etc...).
- */
- wxPen* wxLIGHT_GREY_PEN;
- /**
- @class wxPenList
- There is only one instance of this class: ::wxThePenList.
- Use this object to search for a previously created pen of the desired
- type and create it if not already found. In some windowing systems,
- the pen may be a scarce resource, so it can pay to reuse old
- resources if possible. When an application finishes, all pens will
- be deleted and their resources freed, eliminating the possibility of
- 'memory leaks'. However, it is best not to rely on this automatic
- cleanup because it can lead to double deletion in some circumstances.
- There are two mechanisms in recent versions of wxWidgets which make the
- pen list less useful than it once was. Under Windows, scarce resources
- are cleaned up internally if they are not being used. Also, a referencing
- counting mechanism applied to all GDI objects means that some sharing
- of underlying resources is possible. You don't have to keep track of pointers,
- working out when it is safe delete a pen, because the referencing counting does
- it for you. For example, you can set a pen in a device context, and then
- immediately delete the pen you passed, because the pen is 'copied'.
- So you may find it easier to ignore the pen list, and instead create
- and copy pens as you see fit. If your Windows resource meter suggests
- your application is using too many resources, you can resort to using
- GDI lists to share objects explicitly.
- The only compelling use for the pen list is for wxWidgets to keep
- track of pens in order to clean them up on exit. It is also kept for
- backward compatibility with earlier versions of wxWidgets.
- @library{wxcore}
- @category{gdi}
- @stdobjects
- ::wxThePenList
- @see wxPen
- */
- class wxPenList
- {
- public:
- /**
- Constructor. The application should not construct its own pen list:
- use the object pointer ::wxThePenList.
- */
- wxPenList();
- /**
- Finds a pen with the specified attributes and returns it, else creates a
- new pen, adds it to the pen list, and returns it.
- @param colour
- Colour object.
- @param width
- Width of pen.
- @param style
- Pen style. See ::wxPenStyle for a list of styles.
- */
- wxPen* FindOrCreatePen(const wxColour& colour,
- int width = 1,
- wxPenStyle style = wxPENSTYLE_SOLID);
- };
- /**
- The global list of wxPen objects ready to be re-used (for better performances).
- */
- wxPenList* wxThePenList;
|