フォント選択


フォント選択ダイアログ

フォント選択ダイアログは、一般的な画像アプリケーションや
ロゴ作成アプリケーション、ワードプロセッサなどでよく用いられます

システムからフォントを読み込み、それをリストボックスに列挙して
ユーザーにこれを正しく選択させるという過程は、大変面倒なものに感じるでしょう
しかし、コモンダイアログを使えば、この作業を全部引き受けてくれます

フォント選択ダイアログを作成するには ChooseFont() 関数を使います

BOOL ChooseFont(LPCHOOSEFONT lpcf);

lpcf には、初期化情報を格納した CHOOSEFONT 構造体へのポインタを指定します
ユーザーが OK ボタンを押したなら 0 以外、そうでなければ 0 が返ります

CHOOSEFONT 構造体は、次のように定義されています
typedef struct {    // cf 
    DWORD        lStructSize; 
    HWND         hwndOwner; 
    HDC          hDC; 
    LPLOGFONT    lpLogFont; 
    INT          iPointSize; 
    DWORD        Flags; 
    DWORD        rgbColors; 
    LPARAM       lCustData; 
    LPCFHOOKPROC lpfnHook; 
    LPCTSTR      lpTemplateName; 
    HINSTANCE    hInstance; 
    LPTSTR       lpszStyle; 
    WORD         nFontType; 
    WORD         ___MISSING_ALIGNMENT__; 
    INT          nSizeMin; 
    INT          nSizeMax; 
} CHOOSEFONT;
lStructSize には、この構造体のサイズを指定します
hwndOwner は、ダイアログボックスの親ウィンドウを指定します

hDC は、ダイアログのリストにプリンタでサポートするフォントのみを表示させたい場合
ここにプリンタのデバイスコンテキストを指定します
この時、Flags メンバには CF_PRINTERFONTS フラグを指定しなければなりません
それ以外の場合、このメンバは無視されます

lpLogFont は、LOGFONT 構造体へのポインタを指定します
このメンバに、ユーザーが選択したフォントの情報が格納されます
また、ダイアログを表示した時の初期選択フォントとして指定することもできます

iPointSize は、選択されたフォントの 1/10 ポイント単位のサイズが格納されます

Flags メンバは、ダイアログボックスの初期化フラグを指定します
このメンバには、以下の定数の組み合わせを指定することができます

定数解説
CF_APPLY 「更新」ボタンを有効にする
CF_ANSIONLY 廃止されている
CF_BOTH 有効なプリンタとスクリーンフォントを表示する
hDC は、プリンタのデバイスコンテキストを指す
CF_TTONLY TrueType のみを列挙し、有効にする
CF_EFFECTS 取り消し線、下線、カラー効果を有効にする
rgbColors と lpLogFont->lfStrikeOut
lpLogFont->lfUnderline メンバを用いて初期効果を設定する
ユーザーがフォントを選択すれば、その情報をこれらのメンバに格納する
CF_ENABLEHOOK lpfnHook で指定されたフック関数を有効にする
CF_ENABLETEMPLATE hInstance が lpTemplateName メンバで指定された
ダイアログテンプレートを含むリソースのインスタンスであることを示す
CF_ENABLETEMPLATEHANDLE hInstance メンバがロード済みのダイアログボックステンプレートを含む
メモリブロックを指していることを表す
このフラグが指定されている場合、lpTemplateName は無視される
CF_FIXEDPITCHONLY 固定ピッチフォントのみを選択する
CF_FORCEFONTEXIST ユーザーが存在しないフォントまたはスタイルを選ぼうとするならば
ChooseFont() 関数がエラーを示さなければならないことを示す
CF_INITTOLOGFONTSTRUCT lpLogFont メンバの情報でダイアログボックスを初期化する
CF_LIMITSIZE nSizeMin と nSizeMax で指定された範囲内の
フォントサイズのみを選択する
CF_NOOEMFONTS CF_NOVECTORFONTS と同じ
CF_NOFACESEL 初期設定でフォント名を選択しないことを示す
CF_NOSCRIPTSEL キャラクタセットコンボボックスで選択しないことを示す
CF_NOSTYLESEL 初期設定でスタイルを選択しないことを示す
CF_NOSIZESEL 初期設定でサイズを選択しないことを示す
CF_NOSIMULATIONS GDI フォントシュミレーションを無効にする
CF_NOVECTORFONTS ベクタフォント選択を無効にする
CF_NOVERTFONTS 水平方向フォントのみを表示する
CF_PRINTERFONTS hDC で指定されたデバイスコンテキストに関連付けられている
プリンタでサポートされるフォントのみを表示する
CF_SCALABLEONLY スケーラブルフォントの選択のみを可能とする
CF_SCREENFONTS システムでサポートされる、スクリーンフォントのみを表示する
CF_SCRIPTSONLY ANSI キャラクタセットだけではなく
非 OEM キャラクタセット、Symbol キャラクタセットも選択可能にする
CF_SELECTSCRIPT LOGFONT 構造体の lfCharSet メンバで指定された
キャラクタセットを使うフォントのみを表示する
CF_SHOWHELP 「ヘルプ」ボタンを表示する
CF_USESTYLE lpszStyle が「スタイル」コンボボックスの
スタイルデータを含むバッファであることを示す
ダイアログは、このバッファでスタイルコンボボックスの選択を初期化する
ユーザーが選択した場合、バッファにスタイルでータがコピーされる
CF_WYSIWYG プリンタと画面の両方で使えるフォントのみを選択可能にする
CF_BOTH と CF_SCALABLEONLY も指定されていなければならない

rgbColor メンバは、CF_EFFECTS フラグが指定されている場合
ダイアログの初期時には選択する色を指定し
ダイアログが閉じると選択されたテキストカラーが格納されます

lCustData は、フック関数に渡す追加情報を指定します
lpfnHook は、フック関数へのポインタを指定します

lpTemplateName には、標準ダイアログボックスの代わりに使用する
ダイアログボックステンプレートの名前を指定します
hInstance は、ダイアログテンプレートを含むモジュールのインスタンスハンドルを指定します

lpszStyle には、スタイルデータを含むバッファへのポインタを指定します
nFontType には、選択されたフォントのタイプが格納されます
このメンバには、以下の定数が格納されます

このフォントはスクリーンフォントである
定数解説
BOLD_FONTTYPE このフォントは太字である
ITALIC_FONTTYPE 斜体フォント属性が設定された
PRINTER_FONTTYPE このフォントはプリンタフォントである
REGULAR_FONTTYPE 通常のフォントである
SIMULATED_FONTTYPE このフォントは GDI によってシュミレートされる

nSizeMin は、ユーザーが選択できる最小のポイントサイズを
nSizeMax は、ユーザーが洗濯できる最大のポイントサイズを指定します
これらのメンバは、CF_LIMITSIZE フラグを指定されている場合にのみ有効です
#include <windows.h>
#define TITLE TEXT("Kitty on your lap")

LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	HFONT hFont;
	static LOGFONT lf;
	static CHOOSEFONT cf;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		cf.lStructSize = sizeof (CHOOSEFONT);
		cf.hwndOwner = hWnd;
		cf.lpLogFont = &lf;
		cf.Flags = CF_EFFECTS | CF_SCREENFONTS;
		
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd , &ps);

		hFont = CreateFontIndirect(&lf);
		SelectObject(hdc , hFont);
		SetTextColor(hdc , cf.rgbColors);
		TextOut(hdc , 0 , 0 , TITLE , lstrlen(TITLE));
		SelectObject(hdc , GetStockObject(SYSTEM_FONT));
		DeleteObject(hFont);

		EndPaint(hWnd , &ps);
		return 0;
	case WM_LBUTTONUP:
		if (!ChooseFont(&cf)) return 0;
		InvalidateRect(hWnd , NULL , TRUE);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TITLE ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL ,
			hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}


おなじみのダイアログボックスだと思います
このプログラムは、クライアント領域を左クリックするとダイアログが表示されるので
フォントを選択すれば、それが描画されている文字列に反映します


ChooseFont()

BOOL ChooseFont(LPCHOOSEFONT lpcf);

フォント選択ダイアログボックスを表示します

lpcf - 初期化情報を格納した CHOOSEFONT 構造体へのポインタを指定します

戻り値 - ユーザーが OK ボタンを押したなら 0 以外、そうでなければ 0



前のページへ戻る次のページへ