008:システムフォントを使う

自由にフォントが扱えるようになりました。作成するアプリケーションによっては、システムに内蔵されたフォントを使いたい場合も出てくるでしょう。そのような場合には、システムフォントを使用します。

システムフォントはWindows Mobileが標準的に備えているフォントです。標準的に使用するフォントは、環境によらず使えるように、標準フォントとして初めから用意され、様々な場面で標準フォント (デフォルト・フォント) として使用されます。
どのような環境でも同じように表示されるアプリケーションを作るためには、システムフォトを使用するのが良いですね。

システムフォントを取得するにはGetStockObject関数を使用します。

GetStockObject関数はフォント用というわけではなく、定義済み(ストック)のペン、ブラシ、フォント、パレットのいずれかを取得します。

HGDIOBJ GetStockObject(
 int fnObject   
// ストックオブジェクトのタイプ
);

fnObjectのフォント関係の主なオプションには次のようなタイプがあります。

ANSI_FIXED_FONT: Windows の固定幅(モノスペース)システムフォント
ANSI_VAR_FONT: Windows の可変幅(プロポーショナル)システムフォント
DEVICE_DEFAULT_FONT: デバイス依存のフォント
OEM_FIXED_FONT: OEM 文字の固定幅(モノスペース)フォント
SYSTEM_FONT: システムフォントを指定します。これはWindows文字セットに基づくプロポーショナルフォントです。システムフォントは常に利用可能ですが、他のフォントはインストールされている場合のみ利用可能です。
   

上記フォント関係Windows Mobileで使用できるのはSYSTEM_FONTだけです。

戻り値はHGDIOBJです。GDIオブジェクトのハンドルが戻ります(フォントの場合はHFONTです)。

サンプルプログラムを見てみましょう。

// text004.cpp
//
// ストックオブジェクトからシステムフォントを得る

#include <windows.h
>
#include <tchar.h
>
#include <strsafe.h
>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM
);
ATOM InitApp(HINSTANCE
);
HWND InitInstance(HINSTANCE, int
);

WCHAR szClassName[] = _T("text004");
// ウィンドウクラス。UNICODEとしての文字列定数

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,int nShowCmd
)
{
   MSG msg
;
   BOOL bRet
;
   HWND hWnd
;

   if (!InitApp(hInstance
))
       return FALSE
;
   if (!(hWnd = InitInstance(hInstance,nShowCmd
)))
       return FALSE
;
   while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
       if (bRet == -1
){
           break
;
       } else
{
           TranslateMessage(&msg
);
           DispatchMessage(&msg
);
       
}
   
}
   return (int)msg.wParam
;
}

// ウィンドウクラスの登録

ATOM InitApp(HINSTANCE hInst
)
{
   WNDCLASS wc
;
   wc.style        = CS_HREDRAW|CS_VREDRAW
;
   wc.lpfnWndProc  = WndProc;  
// プロシージャ名
   wc.cbClsExtra   = 0
;
   wc.cbWndExtra   = 0
;
   wc.hInstance    = hInst
;
   wc.hIcon        = NULL;     
// 未サポート
   wc.hCursor      = NULL;     
// 未サポート
   wc.hbrBackground= (HBRUSH) COLOR_WINDOW
;
   wc.lpszMenuName = NULL;     
// 未サポート
   wc.lpszClassName=(LPCTSTR) szClassName
;

   return (RegisterClass(&wc
));
}

// ウィンドウの生成
HWND InitInstance(HINSTANCE hInst, int nShowCmd
)
{
   HWND hWnd
;

   hWnd = CreateWindow(szClassName,_T("Window Title"),
       WS_CLIPCHILDREN,    
// ウィンドウの種類
       CW_USEDEFAULT,      
// x座標
       CW_USEDEFAULT,      
// y座標
       CW_USEDEFAULT,      
// 幅
       CW_USEDEFAULT,      
// 高さ
       NULL,               
// 親ウィンドウのハンドル。親を作るのでNULL
       NULL,               
// メニューハンドルまたは子ウィンドウID
       hInst,              
// インスタンスハンドル
       NULL
);
   if (!hWnd
)
       return FALSE
;
   ShowWindow(hWnd, nShowCmd
);
   UpdateWindow(hWnd
);
   return hWnd
;
}

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp
)
{
   PAINTSTRUCT ps
;
   HDC hdc
;
   LPTSTR lpszStr= _T("WindowsMobile Win32APIプログラミング"
);
   size_t size;        
// 文字列のサイズを格納する
   StringCchLength(lpszStr,STRSAFE_MAX_CCH,&size);
// 安全な文字列取得
   HGDIOBJ hFont
;
   HGDIOBJ hFontOld
;

   switch (msg
){
       case WM_PAINT
:
           hdc = BeginPaint(hWnd,&ps);     
// 描画処理を開始します。

           hFont = GetStockObject(SYSTEM_FONT);    
// システムフォントを取得する
           hFontOld = SelectObject(hdc,hFont);     
// フォントを指定・現在のフォントを退避
           ExtTextOut(hdc, 0, 20, NULL, NULL, lpszStr, size, NULL
);
           SelectObject(hdc,hFontOld);             
// フォントを元に戻す

           EndPaint(hWnd,&ps
);
           break
;
       case WM_DESTROY
:
           PostQuitMessage(0
);
           break
;
       default
:
           return (DefWindowProc(hWnd, msg, wp, lp
));
   
}
   return 0
;
}

実行結果

今日はここまでです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です