テキストのフォントを変更します。
テキストの表示 - インコのWindowsSDK で作成したソースを修正します。
流れ
WM_PAINT
1.CreateFont()で、論理フォントを作成。
△ 物理フォント ・・・ 「MS ゴシック」、「MS 明朝」などの一般に『フォント』と呼んでいるもの。
△ 論理フォント ・・・ 「Serif」「Sans-serif」など、特定の物理フォントを指定せず、抽象的な指定。
論理フォントと物理フォントを結びつける設定が別にあります。
物理フォントを指定する際には、全角半角、スペースを正しく入力してください。
HFONT CreateFont( int nHeight, // 文字セルまたは文字の高さ int nWidth, // 平均文字幅 int nEscapement, // 文字送りの方向とX軸との角度 int nOrientation, // 各文字の回転角度 int nWeight, // フォントの太さ DWORD fdwItalic, // イタリック体 DWORD fdwUnderline, // 下線付き DWORD fdwStrikeOut, // 打ち消し線付き DWORD fdwCharSet, // キャラクタセット DWORD fdwOutPrecision, // 出力精度 DWORD fdwClipPrecision, // クリッピングの精度 DWORD fdwQuality, // 出力品質 DWORD fdwPitchAndFamily, // ピッチとファミリ PCTSTR pszFaceName // フォント名 );
nHeight |
文字セルまたは文字の高さ ・正の数字・・・文字セルの高さ ・0・・・自動 ・負の数字・・・その絶対値が文字の高さ |
nWidth |
平均文字幅x座標 ・0の場合自動 |
nEscapement |
文字送りの方向とX軸との角度 10分の1度単位で指定 例:0・・・左から右へ文字を描画、 900・・・下から上へ文字を描画 |
nOrientation |
各文字の回転角度 10分の1度単位で指定 ※グラフィックモードがデフォルトのGM_COMPATIBLEの時は無視され、各文字の回転角度はnEscapementで指定したものになります。 マイクロソフトのMSDNでは、グラフィックモードがデフォルトのGM_COMPATIBLEの時は、nEscapementとnOrientationとを同じ値を入れるように記載されています。 グラフィックモードは、SetGraphicsMode()で切り替えます。 |
nWeight |
フォントの太さ ・0・・・デフォルト ・FW_BOLD ・・・太字 |
fdwItalic |
イタリック体 ・1 (TRUE) でイタリック体 |
fdwUnderline |
下線付き ・1 (TRUE) で下線付きあり |
fdwCharSet |
キャラクタセット ・日本語環境の場合は、SHIFTJIS_CHARSET (シフトJIS文字セット) |
fdwOutPrecision |
出力精度 ・OUT_DEFAULT_PRECIS・・・デフォルトの動作 |
fdwClipPrecision |
クリッピングの精度 ・CLIP_DEFAULT_PRECIS・・・デフォルトの動作 |
fdwQuality |
出力品質 ・DEFAULT_QUALITY・・・デフォルトの動作 |
fdwPitchAndFamily |
フォントのピッチとファミリ ピッチを指定する値とフォントファミリを指定する値をひとつずつ OR 演算子“|”で組み合わせて指定 ●フォントのピッチ ・DEFAULT_PITCH・・・デフォルト ●フォントファミリ ・FF_DONTCARE・・・指定なし |
pszFaceName | フォント名 |
2.SelectObject()で、指定されたデバイスコンテキストのオブジェクト(ここではフォント)を選択。
HGDIOBJ SelectObject( HDC hDC, // デバイスコンテキストのハンドル HGDIOBJ hObject // 選択するオブジェクトのハンドル );
3.GetStockObject()で、ストックオブジェクト(ここではシステムのフォント)を取得。
ストックオブジェクトとは、システムで定義されているのペン、ブラシ、フォントなどのことです。
HBRUSH GetStockObject( int fnObject // ストックオブジェクトの型 );
4.DeleteObject()で、作成したオブジェクト(ここではフォント)を削除。
BOOL DeleteObject( HGDIOBJ hObject // オブジェクトのハンドル );
ソースコードの入力
ソースコードは下記のように入れてください。
test.cpp
#include <windows.h> #include <tchar.h> #include "resource.h" // このコード モジュールに含まれる関数の宣言を転送します: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; MyRegisterClass(hInstance); // アプリケーションの初期化を実行します: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } // メイン メッセージ ループ: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL , IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_HP); wcex.lpszClassName = TEXT("HP"); wcex.hIconSm = LoadIcon(NULL , IDI_APPLICATION); return RegisterClassEx(&wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: メイン ウィンドウを作成します。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(TEXT("HP"), TEXT("HP"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; LPCTSTR str = TEXT("テキスト"); HFONT hFont; // フォントハンドル switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hFont = CreateFont(20, // 文字セルまたは文字の高さ 0, // 平均文字幅 0:自動 0, // 文字送りの方向とX軸との角度 0, // ベースラインとX軸との角度 FW_NORMAL, // フォントの太さ FALSE, // イタリック体指定 FALSE, // 下線付き指定 FALSE, // 打ち消し線付き指定 SHIFTJIS_CHARSET, // キャラクタセット OUT_DEFAULT_PRECIS, // 出力精度 CLIP_DEFAULT_PRECIS, // クリッピングの精度 DEFAULT_QUALITY, // 出力品質 (DEFAULT_PITCH | FF_DONTCARE), // ピッチとファミリ TEXT("MS 明朝")); // フォント名 SelectObject(hdc, hFont); TextOut(hdc, 10, 10, str, _tcslen(str)); SelectObject(hdc, GetStockObject(SYSTEM_FONT)); DeleteObject(hFont); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
上記の太線で示している箇所のみ追加です。
resource.h (変更なし)
#define IDM_ABOUT 104 #define IDM_EXIT 105 #define IDC_HP 109
test.rc リソースファイル (変更なし)
#include "resource.h" ///////////////////////////////////////////////////////////////////////////// // // メニュー // IDC_HP MENU BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "アプリケーションの終了(&X)", IDM_EXIT END POPUP "ヘルプ(&H)" BEGIN MENUITEM "バージョン情報(&A)...", IDM_ABOUT END END