]> git.saurik.com Git - wxWidgets.git/blob - src/msw/font.cpp
Renamed FWD_ONLY_CURSORS to wxODBC_FWD_ONLY_CURSORS to avoid conflicts with other...
[wxWidgets.git] / src / msw / font.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: font.cpp
3 // Purpose: wxFont class
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 01/02/97
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #ifdef __GNUG__
21 #pragma implementation "font.h"
22 #endif
23
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
26
27 #ifdef __BORLANDC__
28 #pragma hdrstop
29 #endif
30
31 #ifndef WX_PRECOMP
32 #include <stdio.h>
33 #include "wx/setup.h"
34 #include "wx/list.h"
35 #include "wx/utils.h"
36 #include "wx/app.h"
37 #include "wx/font.h"
38 #endif // WX_PRECOMP
39
40 #include "wx/msw/private.h"
41
42 #if !USE_SHARED_LIBRARIES
43 IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
44
45 #if wxUSE_PORTABLE_FONTS_IN_MSW
46 IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject)
47 #endif
48 #endif
49
50 // ----------------------------------------------------------------------------
51 // wxFontRefData - the internal description of the font
52 // ----------------------------------------------------------------------------
53
54 class WXDLLEXPORT wxFontRefData: public wxGDIRefData
55 {
56 friend class WXDLLEXPORT wxFont;
57
58 public:
59 wxFontRefData()
60 {
61 Init(12, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE,
62 "", wxFONTENCODING_DEFAULT);
63 }
64
65 wxFontRefData(const wxFontRefData& data)
66 {
67 Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
68 data.m_underlined, data.m_faceName, data.m_encoding);
69
70 m_fontId = data.m_fontId;
71 }
72
73 wxFontRefData(int size,
74 int family,
75 int style,
76 int weight,
77 bool underlined,
78 const wxString& faceName,
79 wxFontEncoding encoding)
80 {
81 Init(size, family, style, weight, underlined, faceName, encoding);
82 }
83
84 virtual ~wxFontRefData();
85
86 protected:
87 // common part of all ctors
88 void Init(int size,
89 int family,
90 int style,
91 int weight,
92 bool underlined,
93 const wxString& faceName,
94 wxFontEncoding encoding);
95
96 // If TRUE, the pointer to the actual font is temporary and SHOULD NOT BE
97 // DELETED by destructor
98 bool m_temporary;
99
100 int m_fontId;
101
102 // font characterstics
103 int m_pointSize;
104 int m_family;
105 int m_style;
106 int m_weight;
107 bool m_underlined;
108 wxString m_faceName;
109 wxFontEncoding m_encoding;
110
111 // Windows font handle
112 WXHFONT m_hFont;
113 };
114
115 // ============================================================================
116 // implementation
117 // ============================================================================
118
119 // ----------------------------------------------------------------------------
120 // wxFontRefData
121 // ----------------------------------------------------------------------------
122
123 void wxFontRefData::Init(int pointSize,
124 int family,
125 int style,
126 int weight,
127 bool underlined,
128 const wxString& faceName,
129 wxFontEncoding encoding)
130 {
131 m_style = style;
132 m_pointSize = pointSize;
133 m_family = family;
134 m_style = style;
135 m_weight = weight;
136 m_underlined = underlined;
137 m_faceName = faceName;
138 m_encoding = encoding;
139
140 m_fontId = 0;
141 m_temporary = FALSE;
142
143 m_hFont = 0;
144 }
145
146 wxFontRefData::~wxFontRefData()
147 {
148 if ( m_hFont )
149 {
150 if ( !::DeleteObject((HFONT) m_hFont) )
151 {
152 wxLogLastError("DeleteObject(font)");
153 }
154 }
155 }
156
157 // ----------------------------------------------------------------------------
158 // wxFont
159 // ----------------------------------------------------------------------------
160
161 void wxFont::Init()
162 {
163 if ( wxTheFontList )
164 wxTheFontList->Append(this);
165 }
166
167 /* Constructor for a font. Note that the real construction is done
168 * in wxDC::SetFont, when information is available about scaling etc.
169 */
170 bool wxFont::Create(int pointSize,
171 int family,
172 int style,
173 int weight,
174 bool underlined,
175 const wxString& faceName,
176 wxFontEncoding encoding)
177 {
178 UnRef();
179 m_refData = new wxFontRefData(pointSize, family, style, weight,
180 underlined, faceName, encoding);
181
182 RealizeResource();
183
184 return TRUE;
185 }
186
187 wxFont::~wxFont()
188 {
189 if ( wxTheFontList )
190 wxTheFontList->DeleteObject(this);
191 }
192
193 // ----------------------------------------------------------------------------
194 // real implementation
195 // ----------------------------------------------------------------------------
196
197 bool wxFont::RealizeResource()
198 {
199 if ( GetResourceHandle() )
200 {
201 // VZ: the old code returned FALSE in this case, but it doesn't seem
202 // to make sense because the font _was_ created
203 wxLogDebug(wxT("Calling wxFont::RealizeResource() twice"));
204
205 return TRUE;
206 }
207
208 LOGFONT lf;
209 wxFillLogFont(&lf, this);
210 M_FONTDATA->m_hFont = (WXHFONT)::CreateFontIndirect(&lf);
211 if ( !M_FONTDATA->m_hFont )
212 {
213 wxLogLastError("CreateFont");
214
215 return FALSE;
216 }
217
218 return TRUE;
219 }
220
221 bool wxFont::FreeResource(bool force)
222 {
223 if ( GetResourceHandle() )
224 {
225 if ( !::DeleteObject((HFONT) M_FONTDATA->m_hFont) )
226 {
227 wxLogLastError("DeleteObject(font)");
228 }
229
230 M_FONTDATA->m_hFont = 0;
231
232 return TRUE;
233 }
234 return FALSE;
235 }
236
237 WXHANDLE wxFont::GetResourceHandle()
238 {
239 if ( !M_FONTDATA )
240 return 0;
241 else
242 return (WXHANDLE)M_FONTDATA->m_hFont;
243 }
244
245 bool wxFont::IsFree() const
246 {
247 return (M_FONTDATA && (M_FONTDATA->m_hFont == 0));
248 }
249
250 void wxFont::Unshare()
251 {
252 // Don't change shared data
253 if ( !m_refData )
254 {
255 m_refData = new wxFontRefData();
256 }
257 else
258 {
259 wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
260 UnRef();
261 m_refData = ref;
262 }
263 }
264
265 // ----------------------------------------------------------------------------
266 // change font attribute: we recreate font when doing it
267 // ----------------------------------------------------------------------------
268
269 void wxFont::SetPointSize(int pointSize)
270 {
271 Unshare();
272
273 M_FONTDATA->m_pointSize = pointSize;
274
275 RealizeResource();
276 }
277
278 void wxFont::SetFamily(int family)
279 {
280 Unshare();
281
282 M_FONTDATA->m_family = family;
283
284 RealizeResource();
285 }
286
287 void wxFont::SetStyle(int style)
288 {
289 Unshare();
290
291 M_FONTDATA->m_style = style;
292
293 RealizeResource();
294 }
295
296 void wxFont::SetWeight(int weight)
297 {
298 Unshare();
299
300 M_FONTDATA->m_weight = weight;
301
302 RealizeResource();
303 }
304
305 void wxFont::SetFaceName(const wxString& faceName)
306 {
307 Unshare();
308
309 M_FONTDATA->m_faceName = faceName;
310
311 RealizeResource();
312 }
313
314 void wxFont::SetUnderlined(bool underlined)
315 {
316 Unshare();
317
318 M_FONTDATA->m_underlined = underlined;
319
320 RealizeResource();
321 }
322
323 void wxFont::SetEncoding(wxFontEncoding encoding)
324 {
325 Unshare();
326
327 M_FONTDATA->m_encoding = encoding;
328
329 RealizeResource();
330 }
331
332 // ----------------------------------------------------------------------------
333 // accessors
334 // ----------------------------------------------------------------------------
335
336 int wxFont::GetPointSize() const
337 {
338 return M_FONTDATA->m_pointSize;
339 }
340
341 int wxFont::GetFamily() const
342 {
343 return M_FONTDATA->m_family;
344 }
345
346 int wxFont::GetFontId() const
347 {
348 return M_FONTDATA->m_fontId;
349 }
350
351 int wxFont::GetStyle() const
352 {
353 return M_FONTDATA->m_style;
354 }
355
356 int wxFont::GetWeight() const
357 {
358 return M_FONTDATA->m_weight;
359 }
360
361 bool wxFont::GetUnderlined() const
362 {
363 return M_FONTDATA->m_underlined;
364 }
365
366 wxString wxFont::GetFaceName() const
367 {
368 wxString str;
369 if ( M_FONTDATA )
370 str = M_FONTDATA->m_faceName;
371 return str;
372 }
373
374 wxFontEncoding wxFont::GetEncoding() const
375 {
376 return M_FONTDATA->m_encoding;
377 }
378