]> git.saurik.com Git - wxWidgets.git/blame - src/msw/brush.cpp
* Fixed a bug in notebook.tex
[wxWidgets.git] / src / msw / brush.cpp
CommitLineData
2bda0e17
KB
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#if !USE_SHARED_LIBRARIES
37IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject)
38#endif
39
40wxBrushRefData::wxBrushRefData(void)
41{
42 m_style = wxSOLID;
b823f5a1
JS
43 m_hBrush = 0;
44}
45
46wxBrushRefData::wxBrushRefData(const wxBrushRefData& data)
47{
48 m_style = data.m_style;
49 m_stipple = data.m_stipple;
50 m_colour = data.m_colour;
2bda0e17
KB
51 m_hBrush = 0;
52}
53
54wxBrushRefData::~wxBrushRefData(void)
55{
56 if ( m_hBrush )
57 ::DeleteObject((HBRUSH) m_hBrush);
58}
59
60// Brushes
61wxBrush::wxBrush(void)
62{
63 if ( wxTheBrushList )
64 wxTheBrushList->AddBrush(this);
65}
66
67wxBrush::~wxBrush()
68{
69 if (wxTheBrushList)
70 wxTheBrushList->RemoveBrush(this);
71}
72
debe6624 73wxBrush::wxBrush(const wxColour& col, int Style)
2bda0e17
KB
74{
75 m_refData = new wxBrushRefData;
76
77 M_BRUSHDATA->m_colour = col;
78 M_BRUSHDATA->m_style = Style;
79 M_BRUSHDATA->m_hBrush = 0;
80
81 RealizeResource();
82
83 if ( wxTheBrushList )
84 wxTheBrushList->AddBrush(this);
85}
86
debe6624 87wxBrush::wxBrush(const wxString& col, int Style)
2bda0e17
KB
88{
89 m_refData = new wxBrushRefData;
90
91 M_BRUSHDATA->m_colour = col;
92 M_BRUSHDATA->m_style = Style;
93 M_BRUSHDATA->m_hBrush = 0;
94
95 RealizeResource();
96
97 if ( wxTheBrushList )
98 wxTheBrushList->AddBrush(this);
99}
100
101wxBrush::wxBrush(const wxBitmap& stipple)
102{
103 m_refData = new wxBrushRefData;
104
105 M_BRUSHDATA->m_style = wxSTIPPLE;
106 M_BRUSHDATA->m_stipple = stipple;
107 M_BRUSHDATA->m_hBrush = 0;
108
109 RealizeResource();
110
111 if ( wxTheBrushList )
112 wxTheBrushList->AddBrush(this);
113}
114
115bool wxBrush::RealizeResource(void)
116{
117 if (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush == 0))
118 {
119 if (M_BRUSHDATA->m_style==wxTRANSPARENT)
120 {
121 M_BRUSHDATA->m_hBrush = (WXHBRUSH) ::GetStockObject(NULL_BRUSH);
122 return TRUE;
123 }
124 COLORREF ms_colour = 0 ;
125
126 ms_colour = M_BRUSHDATA->m_colour.GetPixel() ;
127
128 switch (M_BRUSHDATA->m_style)
129 {
130/****
131 // Don't reset cbrush, wxTRANSPARENT is handled by wxBrush::SelectBrush()
132 // this could save (many) time if frequently switching from
133 // wxSOLID to wxTRANSPARENT, because Create... is not always called!!
134 //
135 // NB August 95: now create and select a Null brush instead.
136 // This could be optimized as above.
137 case wxTRANSPARENT:
138 M_BRUSHDATA->m_hBrush = NULL; // Must always select a suitable background brush
139 // - could choose white always for a quick solution
140 break;
141***/
142 case wxBDIAGONAL_HATCH:
143 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_BDIAGONAL,ms_colour) ;
144 break ;
145 case wxCROSSDIAG_HATCH:
146 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_DIAGCROSS,ms_colour) ;
147 break ;
148 case wxFDIAGONAL_HATCH:
149 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_FDIAGONAL,ms_colour) ;
150 break ;
151 case wxCROSS_HATCH:
152 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_CROSS,ms_colour) ;
153 break ;
154 case wxHORIZONTAL_HATCH:
155 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_HORIZONTAL,ms_colour) ;
156 break ;
157 case wxVERTICAL_HATCH:
158 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateHatchBrush(HS_VERTICAL,ms_colour) ;
159 break ;
160 case wxSTIPPLE:
161 if (M_BRUSHDATA->m_stipple.Ok())
162 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreatePatternBrush((HBITMAP) M_BRUSHDATA->m_stipple.GetHBITMAP()) ;
163 else
164 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateSolidBrush(ms_colour) ;
165 break ;
166 case wxSOLID:
167 default:
168 M_BRUSHDATA->m_hBrush = (WXHBRUSH) CreateSolidBrush(ms_colour) ;
169 break;
170 }
b2aef89b 171#ifdef WXDEBUG_CREATE
2bda0e17
KB
172 if (M_BRUSHDATA->m_hBrush==NULL) wxError("Cannot create brush","Internal error") ;
173#endif
174 return TRUE;
175 }
176 else
177 return FALSE;
178}
179
180WXHANDLE wxBrush::GetResourceHandle(void)
181{
182 return (WXHANDLE) M_BRUSHDATA->m_hBrush;
183}
184
185bool wxBrush::FreeResource(bool force)
186{
187 if (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush != 0))
188 {
189 DeleteObject((HBRUSH) M_BRUSHDATA->m_hBrush);
190 M_BRUSHDATA->m_hBrush = 0;
191 return TRUE;
192 }
193 else return FALSE;
194}
195
b823f5a1 196bool wxBrush::IsFree(void)
2bda0e17 197{
b823f5a1 198 return (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush == 0));
2bda0e17
KB
199}
200
b823f5a1 201void wxBrush::Unshare()
2bda0e17 202{
b823f5a1
JS
203 // Don't change shared data
204 if (!m_refData)
205 {
206 m_refData = new wxBrushRefData();
207 }
208 else
209 {
210 wxBrushRefData* ref = new wxBrushRefData(*(wxBrushRefData*)m_refData);
211 UnRef();
212 m_refData = ref;
213 }
2bda0e17 214}
2bda0e17 215
2bda0e17
KB
216
217void wxBrush::SetColour(const wxColour& col)
218{
b823f5a1 219 Unshare();
2bda0e17 220
b823f5a1 221 M_BRUSHDATA->m_colour = col;
2bda0e17 222
2bda0e17
KB
223 RealizeResource();
224}
225
226void wxBrush::SetColour(const wxString& col)
227{
b823f5a1 228 Unshare();
2bda0e17 229
b823f5a1 230 M_BRUSHDATA->m_colour = col;
2bda0e17 231
2bda0e17
KB
232 RealizeResource();
233}
234
235void wxBrush::SetColour(const unsigned char r, const unsigned char g, const unsigned char b)
236{
b823f5a1 237 Unshare();
2bda0e17 238
b823f5a1 239 M_BRUSHDATA->m_colour.Set(r, g, b);
2bda0e17 240
2bda0e17
KB
241 RealizeResource();
242}
243
debe6624 244void wxBrush::SetStyle(int Style)
2bda0e17 245{
b823f5a1 246 Unshare();
2bda0e17 247
b823f5a1 248 M_BRUSHDATA->m_style = Style;
2bda0e17 249
2bda0e17
KB
250 RealizeResource();
251}
252
253void wxBrush::SetStipple(const wxBitmap& Stipple)
254{
b823f5a1 255 Unshare();
2bda0e17 256
b823f5a1 257 M_BRUSHDATA->m_stipple = Stipple;
2bda0e17 258
2bda0e17
KB
259 RealizeResource();
260}
261
262