フォント選択ダイアログ



フォント選択ダイアログを表示します。
フォント選択ダイアログを表示するにはChooseFont(A)関数を使用します。

ChooseFont(A) (
    CHOOSEFONT構造体ポインタ
)
引数はこのCHOOSEFONT構造体ポインタのみなんですが、この構造体は色々とめんどくさいです。

CHOOSEFONT構造体 {
    .0 構造体サイズ(60)
    .1 親ウィンドウハンドル
    .2 プリンタのデバイスコンテキストハンドル(プリンタフォントを使用する場合)
    .3 LOGFONT構造体ポインタ
    .4 フォントサイズ
    .5 ダイアログ初期化フラグ
    .6 文字色
    .7 フック関数へ渡す値
    .8 フック関数ポインタ
    .9 ダイアログテンプレート
    .10 ダイアログテンプレートを含むメモリオブジェクト
    .11 フォントスタイル文字列
    .12 フォントタイプ
    .13 フォントサイズ最小値
    .14 フォントサイズ最大値
}
この構造体に選択されたフォント情報が格納されますが、関数呼び出し時にも少し初期化しておく必要があります。
まずフック関数、ダイアログテンプレートのところはHSPでは使えないので0でいいです。
指定しておかなければならないのは、構造体サイズ、親ウィンドウハンドル、LOGFONT構造体ポインタ、ダイアログ初期化フラグです。
それ以外は0でもちゃんと動作します。
ダイアログ初期化フラグには以下の定数を指定します。

CF_APPLY($00000200)適応ボタン表示
CF_TTONLY($00040000)TrueTypeのみ
CF_EFFECTS($00000100)色や修飾を有効にする
CF_FIXEDPITCHONLY($00004000)固定ピッチフォントのみ
CF_FORCEFONTEXIST($00010000)存在しないフォントを選択した時にエラー
CF_INITTOLOGFONTSTRUCT($00000040)LOGFONT構造体の内容でダイアログを初期化する
CF_LIMITSIZE($00002000)フォントサイズの制限を有効にする
CF_NOOEMFONTS($00000800)ベクターフォント無効
CF_NOVECTORFONTS(CF_NOOEMFONTS)同上
CF_NOFACESEL($00080000)初期設定でフォントを選択しない
CF_NOSCRIPTSEL($00800000)書体の種類を無効
CF_NOSIZESEL($00200000)初期設定でサイズを選択しない
CF_NOSIMULATIONS($00001000)フォントシミュレーションしない
CF_NOVERTFONTS($01000000)水平方向フォントのみ
CF_PRINTERFONTS($00000002)プリンタのフォントのみ
CF_SCALABLEONLY($00020000)スケーリング可能フォントのみ
CF_SCREENFONTS($00000001)スクリーンフォントのみ
CF_SELECTSCRIPT($00400000)LOGFONT構造体で指定したキャラクタセットを持つフォントのみ
CF_SHOWHELP($00000004)ヘルプボタン表示
CF_USESTYLE($00000080)スタイルを初期化
CF_WYSIWYG($00008000)スクリーンフォントとプリンタフォントの両方に対応するフォント
CF_BOTH(CF_SCREENFONTS | CF_PRINTERFONTS)スクリーンフォントとプリンタフォント

フォントが選択された時にCHOOSEFONT構造体の.12にフォントタイプがされます。
フォントタイプは以下の定数の組み合わせになっています。

BOLD_FONTTYPE($0100)ボールド
ITALIC_FONTTYPE($0200)イタリック
PRINTER_FONTTYPE($4000)プリンタフォント
REGULAR_FONTTYPE($0400)デフォルト
SCREEN_FONTTYPE($2000)スクリーンフォント
SIMULATED_FONTTYPE($8000)シミュレート

ポインタの示すLOGFONT構造体に実際に選択されたフォント名などのフォントに関す詳しい情報が格納されます。
このLOGFONT構造体がとっても面倒臭いんです…。

LOGFONT構造体 {
    4Byte フォントの高さ
    4Byte フォントの幅
    4Byte 行の角度
    4Byte ベースラインの角度
    4Byte フォントの太さ
    1Byte 1でイタリック体
    1Byte 1で下線
    1Byte 1で打ち消し線
    1Byte キャラクタセット(***_CHARSET)
    1Byte 出力精度(OUT_***_PRECIS)
    1Byte クリッピング精度(CLIP_***_PRECIS)
    1Byte 出力品質(***_QUALITY)
    1Byte ピッチとファミリ(***_PITCH , FF_***)
	32Byte フォント名
}
何が面倒臭いかといいますと、文字列方配列にしても数値型配列にしても参照しづらいというのもありますが、まず定数がやたらと多いです。 全部列挙するのも大変なので、上では定数名の形式のみで、定数の説明などはソースに含めておきます。

とりあえず以上でフォント選択ダイアログを表示させることは出来ます。
以下サンプル。
#include "llmod.as"

#define CF_APPLY		$00000200	;適応ボタン表示
#define CF_TTONLY		$00040000	;TrueTypeのみ
#define CF_EFFECTS		$00000100	;色や修飾を有効にする
#define CF_FIXEDPITCHONLY	$00004000	;固定ピッチフォントのみ
#define CF_FORCEFONTEXIST	$00010000	;存在しないフォントを選択した時にエラー
#define CF_INITTOLOGFONTSTRUCT	$00000040	;LOGFONT構造体の内容でダイアログを初期化する
#define CF_LIMITSIZE		$00002000	;フォントサイズの制限を有効にする
#define CF_NOOEMFONTS		$00000800	;ベクターフォント無効
#define CF_NOVECTORFONTS	CF_NOOEMFONTS	;同上
#define CF_NOFACESEL		$00080000	;初期設定でフォントを選択しない
#define CF_NOSCRIPTSEL		$00800000	;書体の種類を無効
#define CF_NOSIZESEL		$00200000	;初期設定でサイズを選択しない
#define CF_NOSIMULATIONS	$00001000	;フォントシミュレーションしない
#define CF_NOVERTFONTS		$01000000	;水平方向フォントのみ
#define CF_PRINTERFONTS		$00000002	;プリンタのフォントのみ
#define CF_SCALABLEONLY		$00020000	;スケーリング可能フォントのみ
#define CF_SCREENFONTS		$00000001	;スクリーンフォントのみ
#define CF_SELECTSCRIPT		$00400000	;LOGFONT構造体で指定したキャラクタセットを持つフォントのみ
#define CF_SHOWHELP		$00000004	;ヘルプボタン表示
#define CF_USESTYLE		$00000080	;スタイルを初期化
#define CF_WYSIWYG		$00008000	;スクリーンフォントとプリンタフォントの両方に対応するフォント
#define CF_BOTH			CF_SCREENFONTS | CF_PRINTERFONTS	;スクリーンフォントとプリンタフォント

#define BOLD_FONTTYPE		$0100	;ボールド
#define ITALIC_FONTTYPE		$0200	;イタリック
#define PRINTER_FONTTYPE	$4000	;プリンタ
#define REGULAR_FONTTYPE	$0400	;通常
#define SCREEN_FONTTYPE		$2000	;スクリーン
#define SIMULATED_FONTTYPE	$8000	;シミュレート

;フォントの太さ
#define FW_DONTCARE 0
#define FW_THIN 100
#define FW_EXTRALIGHT 200
#define FW_ULTRALIGHT 200
#define FW_LIGHT 300
#define FW_NORMAL 400
#define FW_REGULAR 400
#define FW_MEDIUM 500
#define FW_SEMIBOLD 600
#define FW_DEMIBOLD 600
#define FW_BOLD 700
#define FW_EXTRABOLD 800
#define FW_ULTRABOLD 800
#define FW_HEAVY 900
#define FW_BLACK 900

#define ANSI_CHARSET 0		;Windows 文字セット
#define BALTIC_CHARSET 186
#define CHINESEBIG5_CHARSET 136
#define DEFAULT_CHARSET 1	;指定なし
#define EASTEUROPE_CHARSET 238
#define GB2312_CHARSET 134
#define GREEK_CHARSET 161
#define HANGUL_CHARSET 129
#define MAC_CHARSET 77
#define OEM_CHARSET 255		OEM 文字セット
#define RUSSIAN_CHARSET 204
#define SHIFTJIS_CHARSET 128	;シフト JIS 文字セット
#define SYMBOL_CHARSET 2
#define TURKISH_CHARSET 162
#define JOHAB_CHARSET 130	;韓国版 Windows 用文字セット
#define THAI_CHARSET 222	;タイ版 Windows 用文字セット

#define OUT_DEFAULT_PRECIS 0	;デフォルトの動作に任せます。 
#define OUT_DEVICE_PRECIS 5	;同名フォント発見時デバイスフォント使用 
#define OUT_OUTLINE_PRECIS 8	;同名フォント発見時TrueType や他のアウトラインベースのフォント使用(WindowsNT系OSのみ) 
#define OUT_RASTER_PRECIS 6	;同名フォント発見時ラスタフォント使用 
#define OUT_STROKE_PRECIS 3	;同名フォント発見時ベクトルフォント使用(Windows9x系OSのみ) 
#define OUT_TT_PRECIS 4		;同名フォント発見時TrueTypeフォント使用 
#define OUT_TT_ONLY_PRECIS 7	;TrueTypeフォントのみ

#define CLIP_DEFAULT_PRECIS 0	;デフォルト
#define CLIP_LH_ANGLES 16	;座標系が右手座標系か左手座標系かで回転方向を決める
#define CLIP_EMBEDDED 128	;読み込み専用埋め込みフォント

#define DEFAULT_QUALITY 0	;フォントの文字品質を重視しない
#define DRAFT_QUALITY 1		;PROOF_QUALITY 使用時ほど重視しない
#define PROOF_QUALITY 2		;フォントの文字品質を論理フォントの属性を正確に一致させることより重視する
#define NONANTIALIASED_QUALITY 3	;アンチエイリアス表示しない
#define ANTIALIASED_QUALITY 4	;フォントがアンチエイリアスをサポートしている場合はアンチエイリアス表示
#define CLEARTYPE_QUALITY 5	;ClearTypeアンチエイリアスメソッドを使用してレンダリングする

#define DEFAULT_PITCH 0		;デフォルトピッチ
#define FIXED_PITCH 1		;固定長ピッチ
#define VARIABLE_PITCH 2	;可変長ピッチ
#define FF_DECORATIVE 80	;装飾付きフォント(Old English等)
#define FF_DONTCARE 0		;一般的なファミリ
#define FF_MODERN 48		;モノスペースフォントが指定されます(Pica、Elite、CourierNew等)
#define FF_ROMAN 16		;セリフのあるプロポーショナルフォント(Times New Roman等)
#define FF_SCRIPT 64		;手書き風のデザインのフォント(Script、Cursive 等)
#define FF_SWISS 32		;セリフのないプロポーショナルフォント

	dim lf,60	;LOGFONT構造体
	getptr lplf,lf

	dim cf,15	;CHOOSEFONT構造体
	cf.0 = 60	;構造体サイズ
	cf.1 = bmscr.13	;親ウィンドウハンドル
	cf.2 = 0	;プリンタのデバイスコンテキスト
	cf.3 = lplf	;LOGFONT構造体ポインタ
	cf.4 = 0	;フォントサイズ
	cf.5 = CF_SCREENFONTS | CF_EFFECTS	;初期化フラグ
	cf.6 = 0	;初期文字色
	cf.7 = 0	;フック関数へ渡す値
	cf.8 = 0	;フック関数ポインタ
	cf.9 = 0	;ダイアログテンプレート
	cf.10 = 0	;ダイアログテンプレートオブジェクト
	cf.11 = 0	;スタイル文字列
	cf.12 = 0	;フォントタイプ
	cf.13 = 0	;フォントサイズ最小値
	cf.14 = 0	;フォントサイズ最大値

	getptr lpcf,cf
	dllproc "ChooseFontA",lpcf,1,D_COMDLG

	sdim a,33
	memcpy a,lf.7,32
	font a,lf.0
	mes a
	stop

実際の処理部分よりも定数定義の方が長い…。


戻る