TNB Library
TnbFontHandle.h
[詳解]
1#pragma once
15#include "TnbPointerHandle.h"
16
17
18
19//TNB Library
20namespace TNB
21{
22
23
24
25#ifndef _TnbDOXYGEN //Document作成用シンボル
26
28struct TPhDeleteFontHandle
29{
30 void operator()(HFONT h)
31 {
32 #ifdef _DEBUG
33 if ( ::GetObjectType(h) == NULL )
34 {
35 ASSERT0( false, "~CFontHandle", "先に HFONTが破棄されてしまっています。" );
36 }
37 else if ( ! ::DeleteObject(h) )
38 {
39 ASSERT1( false, "~CFontHandle", "HFONT の破棄に失敗しました。\ncode = %d", ::GetLastError() );
40 }
41 #else
42 ::DeleteObject(h);
43 #endif
44 }
45};
46
47#endif // _TnbDOXYGEN
48
49
50
79class CFontHandle : public CPointerHandleBaseT<HFONT, TPhDeleteFontHandle, NULL>
80{
82 DEFSUPER(_super);
83public:
84
90 {
91 }
92
98 CFontHandle(const CFontHandle& other) : _super(other)
99 {
100 }
101
108 CFontHandle(HFONT hFont) : _super(hFont)
109 {
110 }
111
117 CFontHandle(const LOGFONT& attr)
118 {
119 HFONT f = ::CreateFontIndirect(&attr);
121 }
122
130 bool Set(const LOGFONT& attr)
131 {
132 HFONT f = ::CreateFontIndirect(&attr);
134 return ! _super::IsNull();
135 }
136
146 bool Set(const LOGFONT& attr, HDC dc)
147 {
148 HDC hDC = dc;
149 if ( hDC == NULL )
150 {
151 hDC = ::GetDC(NULL);
152 }
153 LOGFONT lf = attr;
154 POINT pt;
155 pt.y = ::GetDeviceCaps(hDC, LOGPIXELSY) * lf.lfHeight;
156 pt.y /= 720; // 72 points/inch, 10 decipoints/point
157 ::DPtoLP(hDC, &pt, 1);
158 POINT ptOrg = { 0, 0 };
159 ::DPtoLP(hDC, &ptOrg, 1);
160 lf.lfHeight = -abs(pt.y - ptOrg.y);
161 if ( dc == NULL )
162 {
163 ::ReleaseDC(NULL, hDC);
164 }
165 return Set(lf);
166 }
167
177 bool Set(int pointSize, LPCTSTR lpszFaceName, HDC dc = NULL)
178 {
179 LOGFONT attr = { 0 };
180 attr.lfCharSet = DEFAULT_CHARSET;
181 #ifndef _UNICODE
182 attr.lfCharSet = SHIFTJIS_CHARSET;
183 #endif
184 attr.lfHeight = pointSize;
185 lstrcpyn(attr.lfFaceName, lpszFaceName, countof(attr.lfFaceName));
186 return Set(attr, dc);
187 }
188
197 bool Set(HWND hWnd, double mul = 1.0)
198 {
199 HFONT h = reinterpret_cast<HFONT>(::SendMessage(hWnd, WM_GETFONT, 0, 0));
200 if ( h == NULL )
201 {
202 h = static_cast<HFONT>(::GetStockObject(DEFAULT_GUI_FONT));
203 }
204 return SetClone(h, mul);
205 }
206
214 bool SetAsBold(HFONT hFont)
215 {
216 Null();
217 LOGFONT attr;
218 if ( GetAttributes(attr, hFont) )
219 {
220 attr.lfWeight = FW_BOLD;
221 return Set(attr);
222 }
223 return false;
224 }
225
234 bool SetClone(HFONT hFont, double mul = 1.0)
235 {
236 Null();
237 LOGFONT attr;
238 if ( GetAttributes(attr, hFont) )
239 {
240 attr.lfHeight = static_cast<long>(attr.lfHeight * mul);
241 attr.lfWidth = static_cast<long>(attr.lfWidth * mul);
242 return Set(attr);
243 }
244 return false;
245 }
246
247 #ifndef _WIN32_WCE
248
256 {
257 NONCLIENTMETRICS ncm;
258 VERIFY( ms_GetNonClientMetrics(ncm) );
259 #ifndef _UNICODE
260 ncm.lfCaptionFont.lfCharSet = SHIFTJIS_CHARSET;
261 #endif
262 return Set(ncm.lfCaptionFont); //タイトルバーのLOGFONT
263 }
264
272 {
273 NONCLIENTMETRICS ncm;
274 VERIFY( ms_GetNonClientMetrics(ncm) );
275 #ifndef _UNICODE
276 ncm.lfMenuFont.lfCharSet = SHIFTJIS_CHARSET;
277 #endif
278 return Set(ncm.lfMenuFont); //メニューのLOGFONT
279 }
280
281 #endif //_WIN32_WCE
282
290 HFONT Detach(void)
291 {
292 LOGFONT attr;
293 if ( GetAttributes(attr) )
294 {
295 HFONT f = ::CreateFontIndirect(&attr);
296 Null();
297 return f;
298 }
299 return NULL;
300 }
301
309 bool GetAttributes(LOGFONT& _attr) const
310 {
311 HFONT f = *this;
312 return GetAttributes(_attr, f);
313 }
314
321 void SetToWindow(HWND hWnd, bool isRedraw = true) const
322 {
323 ASSERT(::IsWindow(hWnd));
324 HFONT f = *this;
325 ::SendMessage(hWnd, WM_SETFONT, (WPARAM)f, isRedraw);
326 }
327
336 static bool GetAttributes(LOGFONT& _attr, HFONT hFont)
337 {
338 return ::GetObject(hFont, sizeof(LOGFONT), &_attr) != 0;
339 }
340
341private:
342
343 #ifndef _WIN32_WCE
344
346 static bool ms_GetNonClientMetrics(NONCLIENTMETRICS& _ncm)
347 {
348 _ncm.cbSize = sizeof(NONCLIENTMETRICS);
349 bool r = !! ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, _ncm.cbSize, &_ncm, 0);
350 #if(WINVER >= 0x0600)
351 if ( ! r )
352 {
353 _ncm.cbSize -= sizeof(int);
354 r = !! ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, _ncm.cbSize, &_ncm, 0);
355 }
356 #endif
357 return r;
358 }
359
360 #endif
361};
362
363
364
365};//TNB
ポインタハンドル関係のヘッダ
HFONT型ハンドルハンドル
Definition: TnbFontHandle.h:80
static bool GetAttributes(LOGFONT &_attr, HFONT hFont)
[取得] 属性取得.
bool SetSystemCaptionFont(void)
[設定] キャプションバーフォント設定.
bool Set(int pointSize, LPCTSTR lpszFaceName, HDC dc=NULL)
[設定] フォント設定.
bool Set(const LOGFONT &attr)
[設定] フォント設定.
CFontHandle(const CFontHandle &other)
コピーコンストラクタ.
Definition: TnbFontHandle.h:98
void SetToWindow(HWND hWnd, bool isRedraw=true) const
[取得] ウィンドウへ設定.
bool SetClone(HFONT hFont, double mul=1.0)
[設定] フォント設定.
CFontHandle(HFONT hFont)
代入コンストラクタ.
CFontHandle(const LOGFONT &attr)
代入コンストラクタ.
bool Set(const LOGFONT &attr, HDC dc)
[設定] フォント設定.
bool SetAsBold(HFONT hFont)
[設定] フォント設定.
bool GetAttributes(LOGFONT &_attr) const
[取得] 属性取得.
bool SetSystemMenuFont(void)
[設定] メニューフォント設定.
CFontHandle(void)
コンストラクタ.
Definition: TnbFontHandle.h:89
bool Set(HWND hWnd, double mul=1.0)
[設定] フォント設定.
HFONT Detach(void)
[設定] デタッチ.
ポインタハンドルテンプレートベースクラス
CPointerHandleBaseT & operator=(HFONT t)
[代入] 代入.
bool IsNull(void) const
[確認] NULLチェック
TNB Library
Definition: TnbDoxyTitle.txt:2