]> git.saurik.com Git - wxWidgets.git/blame - interface/wx/pen.h
add uint/long/ulong overloads of operator* and operator/ to avoid problems with ambig...
[wxWidgets.git] / interface / wx / pen.h
CommitLineData
23324ae1
FM
1/////////////////////////////////////////////////////////////////////////////
2// Name: pen.h
8024723d 3// Purpose: interface of wxPen* classes
23324ae1
FM
4// Author: wxWidgets team
5// RCS-ID: $Id$
6// Licence: wxWindows license
7/////////////////////////////////////////////////////////////////////////////
8
8024723d
FM
9/**
10 The possible styles for a wxPen.
11*/
12enum wxPenStyle
13{
1413ac04
FM
14 wxPENSTYLE_INVALID = -1,
15
8024723d
FM
16 wxPENSTYLE_SOLID,
17 /**< Solid style. */
18
19 wxPENSTYLE_DOT,
20 /**< Dotted style. */
21
22 wxPENSTYLE_LONG_DASH,
23 /**< Long dashed style. */
24
25 wxPENSTYLE_SHORT_DASH,
26 /**< Short dashed style. */
27
28 wxPENSTYLE_DOT_DASH,
29 /**< Dot and dash style. */
30
31 wxPENSTYLE_USER_DASH,
32 /**< Use the user dashes: see wxPen::SetDashes. */
33
34 wxPENSTYLE_TRANSPARENT,
35 /**< No pen is used. */
36
37 wxPENSTYLE_STIPPLE_MASK_OPAQUE,
38 /**< @todo WHAT's this? */
39
40 wxPENSTYLE_STIPPLE_MASK,
41 /**< @todo WHAT's this? */
42
43 wxPENSTYLE_STIPPLE,
44 /**< Use the stipple bitmap. */
45
46 wxPENSTYLE_BDIAGONAL_HATCH,
47 /**< Backward diagonal hatch. */
48
49 wxPENSTYLE_CROSSDIAG_HATCH,
50 /**< Cross-diagonal hatch. */
51
52 wxPENSTYLE_FDIAGONAL_HATCH,
53 /**< Forward diagonal hatch. */
54
55 wxPENSTYLE_CROSS_HATCH,
56 /**< Cross hatch. */
57
58 wxPENSTYLE_HORIZONTAL_HATCH,
59 /**< Horizontal hatch. */
60
61 wxPENSTYLE_VERTICAL_HATCH,
62 /**< Vertical hatch. */
63
64 wxPENSTYLE_FIRST_HATCH = wxPENSTYLE_BDIAGONAL_HATCH,
1413ac04 65 wxPENSTYLE_LAST_HATCH = wxPENSTYLE_VERTICAL_HATCH
8024723d
FM
66};
67
68/**
69 The possible join values of a wxPen.
70
71 @todo use wxPENJOIN_ prefix
72*/
73enum wxPenJoin
74{
75 wxJOIN_INVALID = -1,
76
77 wxJOIN_BEVEL = 120,
78 wxJOIN_MITER,
79 wxJOIN_ROUND,
80};
81
82
83/**
84 The possible cap values of a wxPen.
85
86 @todo use wxPENCAP_ prefix
87*/
88enum wxPenCap
89{
90 wxCAP_INVALID = -1,
91
92 wxCAP_ROUND = 130,
93 wxCAP_PROJECTING,
94 wxCAP_BUTT
95};
96
97
98
23324ae1
FM
99/**
100 @class wxPen
7c913512 101
23324ae1 102 A pen is a drawing tool for drawing outlines. It is used for drawing
8024723d
FM
103 lines and painting the outline of rectangles, ellipses, etc.
104 It has a colour, a width and a style.
105
4d7b68d1 106 @note On a monochrome display, wxWidgets shows all non-white pens as black.
8024723d
FM
107
108 Do not initialize objects on the stack before the program commences,
109 since other required structures may not have been set up yet.
74bf4e64 110 Instead, define global pointers to objects and create them in wxApp::OnInit()
8024723d
FM
111 or when required.
112
113 An application may wish to dynamically create pens with different characteristics,
114 and there is the consequent danger that a large number of duplicate pens will
115 be created. Therefore an application may wish to get a pointer to a pen by using
74bf4e64 116 the global list of pens ::wxThePenList, and calling the member function
8024723d 117 wxPenList::FindOrCreatePen().
4d7b68d1 118 See wxPenList for more info.
8024723d 119
74bf4e64
FM
120 This class uses @ref overview_refcount "reference counting and copy-on-write" internally
121 so that assignments between two instances of this class are very cheap.
8024723d
FM
122 You can therefore use actual objects instead of pointers without efficiency problems.
123 If an instance of this class is changed it will create its own data internally
124 so that other instances, which previously shared the data using the reference
125 counting, are not affected.
7c913512 126
23324ae1
FM
127 @library{wxcore}
128 @category{gdi}
7c913512 129
23324ae1 130 @stdobjects
b1b95a65
FM
131 @li ::wxNullPen
132 @li ::wxRED_PEN
133 @li ::wxCYAN_PEN
134 @li ::wxGREEN_PEN
135 @li ::wxBLACK_PEN
136 @li ::wxWHITE_PEN
137 @li ::wxTRANSPARENT_PEN
138 @li ::wxBLACK_DASHED_PEN
139 @li ::wxGREY_PEN
140 @li ::wxMEDIUM_GREY_PEN
141 @li ::wxLIGHT_GREY_PEN
7c913512 142
74bf4e64 143 @see wxPenList, wxDC, wxDC::SetPen()
23324ae1
FM
144*/
145class wxPen : public wxGDIObject
146{
147public:
23324ae1 148 /**
74bf4e64 149 Default constructor. The pen will be uninitialised, and IsOk() will return @false.
8024723d
FM
150 */
151 wxPen();
152
153 /**
154 Constructs a pen from a colour object, pen width and style.
8024723d 155
7c913512 156 @param colour
4cc4bfaf 157 A colour object.
7c913512 158 @param width
4cc4bfaf 159 Pen width. Under Windows, the pen width cannot be greater than 1 if
74bf4e64 160 the style is @c wxDOT, @c wxLONG_DASH, @c wxSHORT_DASH, @c wxDOT_DASH, or @c wxUSER_DASH.
7c913512 161 @param style
8024723d
FM
162 The style may be one of the ::wxPenStyle values.
163
23324ae1 164 @remarks Different versions of Windows and different versions of other
bb69632a
FM
165 platforms support very different subsets of the styles above
166 - there is no similarity even between Windows95 and Windows98 -
167 so handle with care.
8024723d 168
74bf4e64
FM
169 @see SetStyle(), SetColour(), SetWidth()
170 */
171 wxPen(const wxColour& colour, int width = 1, wxPenStyle style = wxPENSTYLE_SOLID);
172
173 /**
174 Constructs a stippled pen from a stipple bitmap and a width.
175
176 @param width
177 Pen width. Under Windows, the pen width cannot be greater than 1 if
178 the style is @c wxDOT, @c wxLONG_DASH, @c wxSHORT_DASH, @c wxDOT_DASH, or @c wxUSER_DASH.
179 @param stipple
180 A stipple bitmap.
181
0a98423e
FM
182 @onlyfor{wxmsw,wxmac}
183
74bf4e64
FM
184 @see SetWidth(), SetStipple()
185 */
186 wxPen(const wxBitmap& stipple, int width);
187
188 /**
189 Copy constructor, uses @ref overview_refcount.
190
191 @param pen
192 A pointer or reference to a pen to copy.
23324ae1 193 */
7c913512 194 wxPen(const wxPen& pen);
23324ae1
FM
195
196 /**
197 Destructor.
74bf4e64 198 @see @ref overview_refcount_destruct "reference-counted object destruction"
8024723d 199
23324ae1 200 @remarks Although all remaining pens are deleted when the application
4cc4bfaf
FM
201 exits, the application should try to clean up all pens
202 itself. This is because wxWidgets cannot know if a
203 pointer to the pen object is stored in an application
204 data structure, and there is a risk of double deletion.
23324ae1 205 */
adaaa686 206 virtual ~wxPen();
23324ae1
FM
207
208 /**
74bf4e64
FM
209 Returns the pen cap style, which may be one of @c wxCAP_ROUND, @c
210 wxCAP_PROJECTING and @c wxCAP_BUTT.
211
212 The default is @c wxCAP_ROUND.
8024723d 213
4cc4bfaf 214 @see SetCap()
23324ae1 215 */
231b9591 216 virtual wxPenCap GetCap() const;
23324ae1
FM
217
218 /**
219 Returns a reference to the pen colour.
8024723d 220
4cc4bfaf 221 @see SetColour()
23324ae1 222 */
231b9591 223 virtual wxColour GetColour() const;
23324ae1
FM
224
225 /**
226 Gets an array of dashes (defined as char in X, DWORD under Windows).
4cc4bfaf 227 @a dashes is a pointer to the internal array. Do not deallocate or store this
23324ae1 228 pointer.
74bf4e64
FM
229
230 @return The number of dashes associated with this pen.
8024723d 231
4cc4bfaf 232 @see SetDashes()
23324ae1 233 */
231b9591 234 virtual int GetDashes(wxDash** dashes) const;
23324ae1
FM
235
236 /**
74bf4e64
FM
237 Returns the pen join style, which may be one of @c wxJOIN_BEVEL, @c
238 wxJOIN_ROUND and @c wxJOIN_MITER.
239
240 The default is @c wxJOIN_ROUND.
8024723d 241
4cc4bfaf 242 @see SetJoin()
23324ae1 243 */
231b9591 244 virtual wxPenJoin GetJoin() const;
23324ae1
FM
245
246 /**
247 Gets a pointer to the stipple bitmap.
8024723d 248
4cc4bfaf 249 @see SetStipple()
23324ae1 250 */
231b9591 251 virtual wxBitmap* GetStipple() const;
23324ae1
FM
252
253 /**
254 Returns the pen style.
8024723d 255
4cc4bfaf 256 @see wxPen(), SetStyle()
23324ae1 257 */
231b9591 258 virtual wxPenStyle GetStyle() const;
23324ae1
FM
259
260 /**
261 Returns the pen width.
8024723d 262
4cc4bfaf 263 @see SetWidth()
23324ae1 264 */
231b9591 265 virtual int GetWidth() const;
23324ae1
FM
266
267 /**
268 Returns @true if the pen is initialised.
269 */
0004982c 270 virtual bool IsOk() const;
23324ae1
FM
271
272 /**
74bf4e64
FM
273 Sets the pen cap style, which may be one of @c wxCAP_ROUND, @c wxCAP_PROJECTING
274 and @c wxCAP_BUTT. The default is @c wxCAP_ROUND.
8024723d 275
4cc4bfaf 276 @see GetCap()
23324ae1 277 */
231b9591 278 virtual void SetCap(wxPenCap capStyle);
23324ae1
FM
279
280 //@{
281 /**
282 The pen's colour is changed to the given colour.
8024723d 283
4cc4bfaf 284 @see GetColour()
23324ae1 285 */
231b9591
FM
286 virtual void SetColour(wxColour& colour);
287 virtual void SetColour(unsigned char red, unsigned char green, unsigned char blue);
23324ae1
FM
288 //@}
289
290 /**
291 Associates an array of pointers to dashes (defined as char in X, DWORD under
74bf4e64
FM
292 Windows) with the pen.
293
294 The array is not deallocated by wxPen, but neither must it be deallocated by
295 the calling application until the pen is deleted or this function is called
296 with a @NULL array.
8024723d 297
4cc4bfaf 298 @see GetDashes()
23324ae1 299 */
43c48e1e 300 virtual void SetDashes(int n, const wxDash* dash);
23324ae1
FM
301
302 /**
74bf4e64
FM
303 Sets the pen join style, which may be one of @c wxJOIN_BEVEL, @c wxJOIN_ROUND
304 and @c wxJOIN_MITER.
305
306 The default is @c wxJOIN_ROUND.
8024723d 307
4cc4bfaf 308 @see GetJoin()
23324ae1 309 */
231b9591 310 virtual void SetJoin(wxPenJoin join_style);
23324ae1
FM
311
312 /**
313 Sets the bitmap for stippling.
8024723d 314
4cc4bfaf 315 @see GetStipple()
23324ae1 316 */
43c48e1e 317 virtual void SetStipple(const wxBitmap& stipple);
23324ae1
FM
318
319 /**
320 Set the pen style.
8024723d 321
4cc4bfaf 322 @see wxPen()
23324ae1 323 */
231b9591 324 virtual void SetStyle(wxPenStyle style);
23324ae1
FM
325
326 /**
327 Sets the pen width.
8024723d 328
4cc4bfaf 329 @see GetWidth()
23324ae1 330 */
231b9591 331 virtual void SetWidth(int width);
23324ae1
FM
332
333 /**
334 Inequality operator.
4d7b68d1 335
74bf4e64 336 See @ref overview_refcount_equality "reference-counted object comparison" for
23324ae1
FM
337 more info.
338 */
fadc2df6 339 bool operator!=(const wxPen& pen) const;
23324ae1
FM
340
341 /**
74bf4e64 342 Assignment operator, using @ref overview_refcount.
23324ae1 343 */
43c48e1e 344 wxPen& operator=(const wxPen& pen);
23324ae1
FM
345
346 /**
347 Equality operator.
4d7b68d1 348
74bf4e64 349 See @ref overview_refcount_equality "reference-counted object comparison" for
23324ae1
FM
350 more info.
351 */
fadc2df6 352 bool operator==(const wxPen& pen) const;
23324ae1 353};
e54c96f1 354
e54c96f1 355/**
231b9591 356 An empty pen.
e54c96f1
FM
357*/
358wxPen wxNullPen;
359
e54c96f1 360/**
231b9591 361 Red pen.
e54c96f1 362*/
4d7b68d1 363wxPen* wxRED_PEN;
e54c96f1
FM
364
365/**
231b9591 366 Cyan pen.
e54c96f1 367*/
4d7b68d1 368wxPen* wxCYAN_PEN;
e54c96f1
FM
369
370/**
231b9591 371 Green pen.
e54c96f1 372*/
4d7b68d1 373wxPen* wxGREEN_PEN;
e54c96f1
FM
374
375/**
231b9591 376 Black pen.
e54c96f1 377*/
4d7b68d1 378wxPen* wxBLACK_PEN;
e54c96f1
FM
379
380/**
231b9591 381 White pen.
e54c96f1 382*/
4d7b68d1 383wxPen* wxWHITE_PEN;
e54c96f1
FM
384
385/**
231b9591 386 Transparent pen.
e54c96f1 387*/
4d7b68d1 388wxPen* wxTRANSPARENT_PEN;
e54c96f1
FM
389
390/**
231b9591 391 Black dashed pen.
e54c96f1 392*/
4d7b68d1 393wxPen* wxBLACK_DASHED_PEN;
e54c96f1
FM
394
395/**
231b9591 396 Grey pen.
e54c96f1 397*/
4d7b68d1 398wxPen* wxGREY_PEN;
e54c96f1
FM
399
400/**
231b9591 401 Medium-grey pen.
e54c96f1 402*/
4d7b68d1 403wxPen* wxMEDIUM_GREY_PEN;
e54c96f1
FM
404
405/**
231b9591 406 Light-grey pen.
e54c96f1 407*/
4d7b68d1 408wxPen* wxLIGHT_GREY_PEN;
e54c96f1
FM
409
410
8024723d
FM
411
412/**
413 @class wxPenList
8024723d
FM
414
415 There is only one instance of this class: ::wxThePenList.
416 Use this object to search for a previously created pen of the desired
417 type and create it if not already found. In some windowing systems,
418 the pen may be a scarce resource, so it can pay to reuse old
419 resources if possible. When an application finishes, all pens will
420 be deleted and their resources freed, eliminating the possibility of
421 'memory leaks'. However, it is best not to rely on this automatic
422 cleanup because it can lead to double deletion in some circumstances.
423
424 There are two mechanisms in recent versions of wxWidgets which make the
425 pen list less useful than it once was. Under Windows, scarce resources
426 are cleaned up internally if they are not being used. Also, a referencing
427 counting mechanism applied to all GDI objects means that some sharing
428 of underlying resources is possible. You don't have to keep track of pointers,
429 working out when it is safe delete a pen, because the referencing counting does
430 it for you. For example, you can set a pen in a device context, and then
431 immediately delete the pen you passed, because the pen is 'copied'.
432
433 So you may find it easier to ignore the pen list, and instead create
434 and copy pens as you see fit. If your Windows resource meter suggests
435 your application is using too many resources, you can resort to using
436 GDI lists to share objects explicitly.
437
438 The only compelling use for the pen list is for wxWidgets to keep
439 track of pens in order to clean them up on exit. It is also kept for
440 backward compatibility with earlier versions of wxWidgets.
441
442 @library{wxcore}
443 @category{gdi}
444
445 @stdobjects
446 ::wxThePenList
447
448 @see wxPen
449*/
450class wxPenList
451{
452public:
453 /**
454 Constructor. The application should not construct its own pen list:
455 use the object pointer ::wxThePenList.
456 */
457 wxPenList();
458
459 /**
460 Finds a pen with the specified attributes and returns it, else creates a
461 new pen, adds it to the pen list, and returns it.
462
463 @param colour
464 Colour object.
465 @param width
466 Width of pen.
467 @param style
468 Pen style. See ::wxPenStyle for a list of styles.
469 */
5d2d8f6a
VZ
470 wxPen* FindOrCreatePen(const wxColour& colour,
471 int width = 1,
472 wxPenStyle style = wxPENSTYLE_SOLID);
8024723d
FM
473};
474
475/**
476 The global list of wxPen objects ready to be re-used (for better performances).
477*/
478wxPenList* wxThePenList;
479