CreateFont関数で取得したフォントが反映されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あみゃ

CreateFont関数で取得したフォントが反映されない

#1

投稿記事 by あみゃ » 6年前

Win32APIを用いて、画面に文字を表示する次のような関数を書きました。16行目より上は可変長引数の処理なので、無視してもらって構いません。

コード:

void draw_string(int32_t x, int32_t y, uint32_t color, const char *format, ...) {
	// 可変引数の処理
	va_list list = nullptr;
	va_start(list, format);								// 可変長引数の利用開始
	int32_t format_size = _vscprintf(format, list);				// 可変長引数を展開した後のサイズ
	char* buff = (char*)calloc(format_size + 1, sizeof(char));		// メモリ確保(終端挿入のための+1)

	// メモリの確保失敗
	if (buff == nullptr) {
		va_end(list);
		return ;
	}

	vsnprintf_s(buff, format_size + 1, format_size, format, list);	// 可変長引数を展開
	va_end(list);										// 可変長引数の利用終了

	// 文字を描画
	HDC h_dev = GetDC(gh_window);		// デバイスコンテキストのハンドルを取得
	SelectObject(h_dev, &g_font);                     // フォントセット
	TextOut(h_dev, x, y, buff, format_size);	// 描画
	ReleaseDC(gh_window, h_dev);		        // デバイスコンテキストの解放
	
	// メモリ解放
	free(buff);
	buff = nullptr;

	return ;
}
18, 21行目にあるgh_windowと、19行目にあるg_fontはグローバル変数です。
gh_windowはHWND型であり、文字を描画するwindowのハンドルが格納されています。
g_fontはHFONT型であり、CreateFont関数の戻り値が格納されています。
ここで、この関数では19行目でフォントの変更を行っていますが、これが適応されません。
いろいろと試した結果、19行目を次のように書き換えることで、フォントを変更することができました。

コード:

SelectObject(h_dev, CreateFont(
		50, 0,						// フォントの高さ、幅
		0, 0,						// 文字送り方向とベースラインの角度
		FW_NORMAL,					// 文字の太さ
		false, false, false,		// イタリックか、下線を引くか、取り消し線を引くか
		DEFAULT_CHARSET,			// フォントの文字セット
		OUT_DEFAULT_PRECIS,			// 出力精度の設定	
		CLIP_DEFAULT_PRECIS,		// クリッピング精度
		DRAFT_QUALITY,				// フォントの出力品質
		DEFAULT_PITCH | FF_SWISS,	// フォントのピッチとファミリを指定
		NULL						// フォントのタイプフェイス名の指定
	));
しかし、これは実用的ではありません。私は、フォントの指定を別の関数で行い、このdraw_string関数では描画のみを行うようにしたいからです。
これ以外の場所で生成したフォントに変更できない理由を知っている方、いらっしゃれば教えてください。
よろしくお願いします。

アバター
tk-xleader
記事: 158
登録日時: 13年前
連絡を取る:

Re: CreateFont関数で取得したフォントが反映されない

#2

投稿記事 by tk-xleader » 6年前

SelectObject関数にg_fontの値ではなくアドレスを渡しているのが原因だと思います。19行目の&を外してみるといかがでしょうか。

あみゃ

Re: CreateFont関数で取得したフォントが反映されない

#3

投稿記事 by あみゃ » 6年前

すみません、自己解決しました。

19行目

コード:

 SelectObject(h_dev, &g_font); 
上記は誤りで、正しくは

コード:

 SelectObject(h_dev, g_font); 
でした。
SelectObject関数の第二引数にはvoid型のポインタを渡せばいいのですが、HFONT型自体がHFONT__構造体のポインタみたいなので、ポインタのポインタを渡してしまっていたみたいです。
お騒がせしました。

あみゃ

Re: CreateFont関数で取得したフォントが反映されない

#4

投稿記事 by あみゃ » 6年前

tk-xleaderさん、仰るとおりでした。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る