]> git.saurik.com Git - wxWidgets.git/blob - src/msw/brush.cpp
corrected dynamic class implementation
[wxWidgets.git] / src / msw / brush.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: brush.cpp
3 // Purpose: wxBrush
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "brush.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #ifndef WX_PRECOMP
24 #include <stdio.h>
25 #include "wx/setup.h"
26 #include "wx/list.h"
27 #include "wx/utils.h"
28 #include "wx/app.h"
29 #include "wx/brush.h"
30 #endif
31
32 #include "wx/msw/private.h"
33
34 #include "assert.h"
35
36 IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject)
37
38 wxBrushRefData::wxBrushRefData(void)
39 {
40 m_style = wxSOLID;
41 m_hBrush = 0;
42 }
43
44 wxBrushRefData::wxBrushRefData(const wxBrushRefData& data)
45 {
46 m_style = data.m_style;
47 m_stipple = data.m_stipple;
48 m_colour = data.m_colour;
49 m_hBrush = 0;
50 }
51
52 wxBrushRefData::~wxBrushRefData(void)
53 {
54 if ( m_hBrush )
55 ::DeleteObject((HBRUSH) m_hBrush);
56 }
57
58 // Brushes
59 wxBrush::wxBrush(void)
60 {
61 if ( wxTheBrushList )
62 wxTheBrushList->AddBrush(this);
63 }
64
65 wxBrush::~wxBrush()
66 {
67 if (wxTheBrushList)
68 wxTheBrushList->RemoveBrush(this);
69 }
70
71 wxBrush::wxBrush(const wxColour& col, int Style)
72 {
73 m_refData = new wxBrushRefData;
74
75 M_BRUSHDATA->m_colour = col;
76 M_BRUSHDATA->m_style = Style;
77 M_BRUSHDATA->m_hBrush = 0;
78
79 RealizeResource();
80
81 if ( wxTheBrushList )
82 wxTheBrushList->AddBrush(this);
83 }
84
85 wxBrush::wxBrush(const wxBitmap& stipple)
86 {
87 m_refData = new wxBrushRefData;
88
89 M_BRUSHDATA->m_stipple = stipple;
90 if (M_BRUSHDATA->m_stipple.GetMask())
91 M_BRUSHDATA->m_style = wxSTIPPLE_MASK_OPAQUE;
92 else
93 M_BRUSHDATA->m_style = wxSTIPPLE;
94
95 M_BRUSHDATA->m_hBrush = 0;
96
97 RealizeResource();
98
99 if ( wxTheBrushList )
100 wxTheBrushList->AddBrush(this);
101 }
102
103 bool wxBrush::RealizeResource(void)
104 {
105 if (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush == 0))
106 {
107 if (M_BRUSHDATA->m_style==wxTRANSPARENT)
108 {
109 M_BRUSHDATA->m_hBrush = (WXHBRUSH) ::GetStockObject(NULL_BRUSH);
110 return TRUE;
111 }
112 COLORREF ms_colour = 0 ;
113
114 ms_colour = M_BRUSHDATA->m_colour.GetPixel() ;
115
116 switch (M_BRUSHDATA->m_style)
117 {
118 /****
119 // Don't reset cbrush, wxTRANSPARENT is handled by wxBrush::SelectBrush()
120 // this could save (many) time if frequently switching from
121 // wxSOLID to wxTRANSPARENT, because Create... is not always called!!
122 //
123 // NB August 95: now create and select a Null brush instead.
124 // This could be optimized as above.
125 case wxTRANSPARENT:
126 M_BRUSHDATA->m_hBrush = NULL; // Must always select a suitable background brush
127 // - could choose white always for a quick solution
128 break;
129 ***/
130 #ifndef __WXMICROWIN__
131 case wxBDIAGONAL_HATCH:
132 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_BDIAGONAL,ms_colour) ;
133 break ;
134 case wxCROSSDIAG_HATCH:
135 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_DIAGCROSS,ms_colour) ;
136 break ;
137 case wxFDIAGONAL_HATCH:
138 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_FDIAGONAL,ms_colour) ;
139 break ;
140 case wxCROSS_HATCH:
141 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_CROSS,ms_colour) ;
142 break ;
143 case wxHORIZONTAL_HATCH:
144 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_HORIZONTAL,ms_colour) ;
145 break ;
146 case wxVERTICAL_HATCH:
147 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_VERTICAL,ms_colour) ;
148 break ;
149 case wxSTIPPLE:
150 if (M_BRUSHDATA->m_stipple.Ok())
151 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreatePatternBrush((HBITMAP) M_BRUSHDATA->m_stipple.GetHBITMAP()) ;
152 else
153 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateSolidBrush(ms_colour) ;
154 break ;
155 case wxSTIPPLE_MASK_OPAQUE:
156 if (M_BRUSHDATA->m_stipple.Ok() && M_BRUSHDATA->m_stipple.GetMask())
157 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreatePatternBrush((HBITMAP) M_BRUSHDATA->m_stipple.GetMask()->GetMaskBitmap());
158 else
159 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateSolidBrush(ms_colour) ;
160 break ;
161 #endif
162 case wxSOLID:
163 default:
164 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateSolidBrush(ms_colour) ;
165 break;
166 }
167 #ifdef WXDEBUG_CREATE
168 if (M_BRUSHDATA->m_hBrush==NULL) wxError("Cannot create brush","Internal error") ;
169 #endif
170 return TRUE;
171 }
172 else
173 return FALSE;
174 }
175
176 WXHANDLE wxBrush::GetResourceHandle(void)
177 {
178 return (WXHANDLE) M_BRUSHDATA->m_hBrush;
179 }
180
181 bool wxBrush::FreeResource(bool WXUNUSED(force))
182 {
183 if (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush != 0))
184 {
185 DeleteObject((HBRUSH) M_BRUSHDATA->m_hBrush);
186 M_BRUSHDATA->m_hBrush = 0;
187 return TRUE;
188 }
189 else return FALSE;
190 }
191
192 bool wxBrush::IsFree() const
193 {
194 return (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush == 0));
195 }
196
197 void wxBrush::Unshare()
198 {
199 // Don't change shared data
200 if (!m_refData)
201 {
202 m_refData = new wxBrushRefData();
203 }
204 else
205 {
206 wxBrushRefData* ref = new wxBrushRefData(*(wxBrushRefData*)m_refData);
207 UnRef();
208 m_refData = ref;
209 }
210 }
211
212
213 void wxBrush::SetColour(const wxColour& col)
214 {
215 Unshare();
216
217 M_BRUSHDATA->m_colour = col;
218
219 RealizeResource();
220 }
221
222 void wxBrush::SetColour(unsigned char r, unsigned char g, unsigned char b)
223 {
224 Unshare();
225
226 M_BRUSHDATA->m_colour.Set(r, g, b);
227
228 RealizeResource();
229 }
230
231 void wxBrush::SetStyle(int Style)
232 {
233 Unshare();
234
235 M_BRUSHDATA->m_style = Style;
236
237 RealizeResource();
238 }
239
240 void wxBrush::SetStipple(const wxBitmap& Stipple)
241 {
242 Unshare();
243
244 M_BRUSHDATA->m_stipple = Stipple;
245 if (M_BRUSHDATA->m_stipple.GetMask())
246 M_BRUSHDATA->m_style = wxSTIPPLE_MASK_OPAQUE;
247 else
248 M_BRUSHDATA->m_style = wxSTIPPLE;
249
250 RealizeResource();
251 }
252
253