1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/brush.cpp
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
33 #include "wx/bitmap.h"
36 #include "wx/msw/private.h"
38 // ----------------------------------------------------------------------------
40 // ----------------------------------------------------------------------------
42 class WXDLLEXPORT wxBrushRefData
: public wxGDIRefData
45 wxBrushRefData(const wxColour
& colour
= wxNullColour
, wxBrushStyle style
= wxBRUSHSTYLE_SOLID
);
46 wxBrushRefData(const wxBitmap
& stipple
);
47 wxBrushRefData(const wxBrushRefData
& data
);
48 virtual ~wxBrushRefData();
50 bool operator==(const wxBrushRefData
& data
) const;
55 const wxColour
& GetColour() const { return m_colour
; }
56 wxBrushStyle
GetStyle() const { return m_style
; }
57 wxBitmap
*GetStipple() { return &m_stipple
; }
59 void SetColour(const wxColour
& colour
) { Free(); m_colour
= colour
; }
60 void SetStyle(wxBrushStyle style
) { Free(); m_style
= style
; }
61 void SetStipple(const wxBitmap
& stipple
) { Free(); DoSetStipple(stipple
); }
64 void DoSetStipple(const wxBitmap
& stipple
);
71 // no assignment operator, the objects of this class are shared and never
72 // assigned after being created once
73 wxBrushRefData
& operator=(const wxBrushRefData
&);
76 #define M_BRUSHDATA ((wxBrushRefData *)m_refData)
78 // ============================================================================
79 // wxBrushRefData implementation
80 // ============================================================================
82 IMPLEMENT_DYNAMIC_CLASS(wxBrush
, wxGDIObject
)
84 // ----------------------------------------------------------------------------
85 // wxBrushRefData ctors/dtor
86 // ----------------------------------------------------------------------------
88 wxBrushRefData::wxBrushRefData(const wxColour
& colour
, wxBrushStyle style
)
96 wxBrushRefData::wxBrushRefData(const wxBitmap
& stipple
)
98 DoSetStipple(stipple
);
103 wxBrushRefData::wxBrushRefData(const wxBrushRefData
& data
)
105 m_stipple(data
.m_stipple
),
106 m_colour(data
.m_colour
)
108 m_style
= data
.m_style
;
110 // we can't share HBRUSH, we'd need to create another one ourselves
114 wxBrushRefData::~wxBrushRefData()
119 // ----------------------------------------------------------------------------
120 // wxBrushRefData accesors
121 // ----------------------------------------------------------------------------
123 bool wxBrushRefData::operator==(const wxBrushRefData
& data
) const
125 // don't compare HBRUSHes
126 return m_style
== data
.m_style
&&
127 m_colour
== data
.m_colour
&&
128 m_stipple
.IsSameAs(data
.m_stipple
);
131 void wxBrushRefData::DoSetStipple(const wxBitmap
& stipple
)
134 m_style
= stipple
.GetMask() ? wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE
135 : wxBRUSHSTYLE_STIPPLE
;
138 // ----------------------------------------------------------------------------
139 // wxBrushRefData resource handling
140 // ----------------------------------------------------------------------------
142 void wxBrushRefData::Free()
146 ::DeleteObject(m_hBrush
);
152 #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
154 static int TranslateHatchStyle(int style
)
158 case wxBRUSHSTYLE_BDIAGONAL_HATCH
: return HS_BDIAGONAL
;
159 case wxBRUSHSTYLE_CROSSDIAG_HATCH
: return HS_DIAGCROSS
;
160 case wxBRUSHSTYLE_FDIAGONAL_HATCH
: return HS_FDIAGONAL
;
161 case wxBRUSHSTYLE_CROSS_HATCH
: return HS_CROSS
;
162 case wxBRUSHSTYLE_HORIZONTAL_HATCH
:return HS_HORIZONTAL
;
163 case wxBRUSHSTYLE_VERTICAL_HATCH
: return HS_VERTICAL
;
168 #endif // !__WXMICROWIN__ && !__WXWINCE__
170 HBRUSH
wxBrushRefData::GetHBRUSH()
174 #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
175 int hatchStyle
= TranslateHatchStyle(m_style
);
176 if ( hatchStyle
== -1 )
177 #endif // !__WXMICROWIN__ && !__WXWINCE__
181 case wxBRUSHSTYLE_TRANSPARENT
:
182 m_hBrush
= (HBRUSH
)::GetStockObject(NULL_BRUSH
);
185 case wxBRUSHSTYLE_STIPPLE
:
186 m_hBrush
= ::CreatePatternBrush(GetHbitmapOf(m_stipple
));
189 case wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE
:
190 m_hBrush
= ::CreatePatternBrush((HBITMAP
)m_stipple
.GetMask()
195 wxFAIL_MSG( wxT("unknown brush style") );
198 case wxBRUSHSTYLE_SOLID
:
199 m_hBrush
= ::CreateSolidBrush(m_colour
.GetPixel());
204 else // create a hatched brush
206 m_hBrush
= ::CreateHatchBrush(hatchStyle
, m_colour
.GetPixel());
212 wxLogLastError(wxT("CreateXXXBrush()"));
219 // ============================================================================
220 // wxBrush implementation
221 // ============================================================================
223 // ----------------------------------------------------------------------------
224 // wxBrush ctors/dtor
225 // ----------------------------------------------------------------------------
231 wxBrush::wxBrush(const wxColour
& col
, wxBrushStyle style
)
233 m_refData
= new wxBrushRefData(col
, style
);
236 #if FUTURE_WXWIN_COMPATIBILITY_3_0
237 wxBrush::wxBrush(const wxColour
& col
, int style
)
239 m_refData
= new wxBrushRefData(col
, (wxBrushStyle
)style
);
243 wxBrush::wxBrush(const wxBitmap
& stipple
)
245 m_refData
= new wxBrushRefData(stipple
);
252 // ----------------------------------------------------------------------------
253 // wxBrush house keeping stuff
254 // ----------------------------------------------------------------------------
256 bool wxBrush::operator==(const wxBrush
& brush
) const
258 const wxBrushRefData
*brushData
= (wxBrushRefData
*)brush
.m_refData
;
260 // an invalid brush is considered to be only equal to another invalid brush
261 return m_refData
? (brushData
&& *M_BRUSHDATA
== *brushData
) : !brushData
;
264 wxGDIRefData
*wxBrush::CreateGDIRefData() const
266 return new wxBrushRefData
;
269 wxGDIRefData
*wxBrush::CloneGDIRefData(const wxGDIRefData
*data
) const
271 return new wxBrushRefData(*(const wxBrushRefData
*)data
);
274 // ----------------------------------------------------------------------------
276 // ----------------------------------------------------------------------------
278 wxColour
wxBrush::GetColour() const
280 wxCHECK_MSG( Ok(), wxNullColour
, wxT("invalid brush") );
282 return M_BRUSHDATA
->GetColour();
285 wxBrushStyle
wxBrush::GetStyle() const
287 wxCHECK_MSG( Ok(), wxBRUSHSTYLE_INVALID
, wxT("invalid brush") );
289 return M_BRUSHDATA
->GetStyle();
292 wxBitmap
*wxBrush::GetStipple() const
294 wxCHECK_MSG( Ok(), NULL
, wxT("invalid brush") );
296 return M_BRUSHDATA
->GetStipple();
299 WXHANDLE
wxBrush::GetResourceHandle() const
301 wxCHECK_MSG( Ok(), FALSE
, wxT("invalid brush") );
303 return (WXHANDLE
)M_BRUSHDATA
->GetHBRUSH();
306 // ----------------------------------------------------------------------------
308 // ----------------------------------------------------------------------------
310 void wxBrush::SetColour(const wxColour
& col
)
314 M_BRUSHDATA
->SetColour(col
);
317 void wxBrush::SetColour(unsigned char r
, unsigned char g
, unsigned char b
)
321 M_BRUSHDATA
->SetColour(wxColour(r
, g
, b
));
324 void wxBrush::SetStyle(wxBrushStyle style
)
328 M_BRUSHDATA
->SetStyle(style
);
331 void wxBrush::SetStipple(const wxBitmap
& stipple
)
335 M_BRUSHDATA
->SetStipple(stipple
);