1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/brush.cpp
4 // Author: Julian Smart
7 // Copyright: (c) Julian Smart
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 // ============================================================================
13 // ============================================================================
15 // ----------------------------------------------------------------------------
17 // ----------------------------------------------------------------------------
19 // For compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
32 #include "wx/bitmap.h"
35 #include "wx/msw/private.h"
37 // ----------------------------------------------------------------------------
39 // ----------------------------------------------------------------------------
41 class WXDLLEXPORT wxBrushRefData
: public wxGDIRefData
44 wxBrushRefData(const wxColour
& colour
= wxNullColour
, wxBrushStyle style
= wxBRUSHSTYLE_SOLID
);
45 wxBrushRefData(const wxBitmap
& stipple
);
46 wxBrushRefData(const wxBrushRefData
& data
);
47 virtual ~wxBrushRefData();
49 bool operator==(const wxBrushRefData
& data
) const;
54 const wxColour
& GetColour() const { return m_colour
; }
55 wxBrushStyle
GetStyle() const { return m_style
; }
56 wxBitmap
*GetStipple() { return &m_stipple
; }
58 void SetColour(const wxColour
& colour
) { Free(); m_colour
= colour
; }
59 void SetStyle(wxBrushStyle style
) { Free(); m_style
= style
; }
60 void SetStipple(const wxBitmap
& stipple
) { Free(); DoSetStipple(stipple
); }
63 void DoSetStipple(const wxBitmap
& stipple
);
70 // no assignment operator, the objects of this class are shared and never
71 // assigned after being created once
72 wxBrushRefData
& operator=(const wxBrushRefData
&);
75 #define M_BRUSHDATA ((wxBrushRefData *)m_refData)
77 // ============================================================================
78 // wxBrushRefData implementation
79 // ============================================================================
81 IMPLEMENT_DYNAMIC_CLASS(wxBrush
, wxGDIObject
)
83 // ----------------------------------------------------------------------------
84 // wxBrushRefData ctors/dtor
85 // ----------------------------------------------------------------------------
87 wxBrushRefData::wxBrushRefData(const wxColour
& colour
, wxBrushStyle style
)
95 wxBrushRefData::wxBrushRefData(const wxBitmap
& stipple
)
97 DoSetStipple(stipple
);
102 wxBrushRefData::wxBrushRefData(const wxBrushRefData
& data
)
104 m_stipple(data
.m_stipple
),
105 m_colour(data
.m_colour
)
107 m_style
= data
.m_style
;
109 // we can't share HBRUSH, we'd need to create another one ourselves
113 wxBrushRefData::~wxBrushRefData()
118 // ----------------------------------------------------------------------------
119 // wxBrushRefData accesors
120 // ----------------------------------------------------------------------------
122 bool wxBrushRefData::operator==(const wxBrushRefData
& data
) const
124 // don't compare HBRUSHes
125 return m_style
== data
.m_style
&&
126 m_colour
== data
.m_colour
&&
127 m_stipple
.IsSameAs(data
.m_stipple
);
130 void wxBrushRefData::DoSetStipple(const wxBitmap
& stipple
)
133 m_style
= stipple
.GetMask() ? wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE
134 : wxBRUSHSTYLE_STIPPLE
;
137 // ----------------------------------------------------------------------------
138 // wxBrushRefData resource handling
139 // ----------------------------------------------------------------------------
141 void wxBrushRefData::Free()
145 ::DeleteObject(m_hBrush
);
151 #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
153 static int TranslateHatchStyle(int style
)
157 case wxBRUSHSTYLE_BDIAGONAL_HATCH
: return HS_BDIAGONAL
;
158 case wxBRUSHSTYLE_CROSSDIAG_HATCH
: return HS_DIAGCROSS
;
159 case wxBRUSHSTYLE_FDIAGONAL_HATCH
: return HS_FDIAGONAL
;
160 case wxBRUSHSTYLE_CROSS_HATCH
: return HS_CROSS
;
161 case wxBRUSHSTYLE_HORIZONTAL_HATCH
:return HS_HORIZONTAL
;
162 case wxBRUSHSTYLE_VERTICAL_HATCH
: return HS_VERTICAL
;
167 #endif // !__WXMICROWIN__ && !__WXWINCE__
169 HBRUSH
wxBrushRefData::GetHBRUSH()
173 #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
174 int hatchStyle
= TranslateHatchStyle(m_style
);
175 if ( hatchStyle
== -1 )
176 #endif // !__WXMICROWIN__ && !__WXWINCE__
180 case wxBRUSHSTYLE_TRANSPARENT
:
181 m_hBrush
= (HBRUSH
)::GetStockObject(NULL_BRUSH
);
184 case wxBRUSHSTYLE_STIPPLE
:
185 m_hBrush
= ::CreatePatternBrush(GetHbitmapOf(m_stipple
));
188 case wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE
:
189 m_hBrush
= ::CreatePatternBrush((HBITMAP
)m_stipple
.GetMask()
194 wxFAIL_MSG( wxT("unknown brush style") );
197 case wxBRUSHSTYLE_SOLID
:
198 m_hBrush
= ::CreateSolidBrush(m_colour
.GetPixel());
203 else // create a hatched brush
205 m_hBrush
= ::CreateHatchBrush(hatchStyle
, m_colour
.GetPixel());
211 wxLogLastError(wxT("CreateXXXBrush()"));
218 // ============================================================================
219 // wxBrush implementation
220 // ============================================================================
222 // ----------------------------------------------------------------------------
223 // wxBrush ctors/dtor
224 // ----------------------------------------------------------------------------
230 wxBrush::wxBrush(const wxColour
& col
, wxBrushStyle style
)
232 m_refData
= new wxBrushRefData(col
, style
);
235 #if FUTURE_WXWIN_COMPATIBILITY_3_0
236 wxBrush::wxBrush(const wxColour
& col
, int style
)
238 m_refData
= new wxBrushRefData(col
, (wxBrushStyle
)style
);
242 wxBrush::wxBrush(const wxBitmap
& stipple
)
244 m_refData
= new wxBrushRefData(stipple
);
251 // ----------------------------------------------------------------------------
252 // wxBrush house keeping stuff
253 // ----------------------------------------------------------------------------
255 bool wxBrush::operator==(const wxBrush
& brush
) const
257 const wxBrushRefData
*brushData
= (wxBrushRefData
*)brush
.m_refData
;
259 // an invalid brush is considered to be only equal to another invalid brush
260 return m_refData
? (brushData
&& *M_BRUSHDATA
== *brushData
) : !brushData
;
263 wxGDIRefData
*wxBrush::CreateGDIRefData() const
265 return new wxBrushRefData
;
268 wxGDIRefData
*wxBrush::CloneGDIRefData(const wxGDIRefData
*data
) const
270 return new wxBrushRefData(*(const wxBrushRefData
*)data
);
273 // ----------------------------------------------------------------------------
275 // ----------------------------------------------------------------------------
277 wxColour
wxBrush::GetColour() const
279 wxCHECK_MSG( IsOk(), wxNullColour
, wxT("invalid brush") );
281 return M_BRUSHDATA
->GetColour();
284 wxBrushStyle
wxBrush::GetStyle() const
286 wxCHECK_MSG( IsOk(), wxBRUSHSTYLE_INVALID
, wxT("invalid brush") );
288 return M_BRUSHDATA
->GetStyle();
291 wxBitmap
*wxBrush::GetStipple() const
293 wxCHECK_MSG( IsOk(), NULL
, wxT("invalid brush") );
295 return M_BRUSHDATA
->GetStipple();
298 WXHANDLE
wxBrush::GetResourceHandle() const
300 wxCHECK_MSG( IsOk(), FALSE
, wxT("invalid brush") );
302 return (WXHANDLE
)M_BRUSHDATA
->GetHBRUSH();
305 // ----------------------------------------------------------------------------
307 // ----------------------------------------------------------------------------
309 void wxBrush::SetColour(const wxColour
& col
)
313 M_BRUSHDATA
->SetColour(col
);
316 void wxBrush::SetColour(unsigned char r
, unsigned char g
, unsigned char b
)
320 M_BRUSHDATA
->SetColour(wxColour(r
, g
, b
));
323 void wxBrush::SetStyle(wxBrushStyle style
)
327 M_BRUSHDATA
->SetStyle(style
);
330 void wxBrush::SetStipple(const wxBitmap
& stipple
)
334 M_BRUSHDATA
->SetStipple(stipple
);