フォントをカレントディレクトリから読み込む方法

このQ&Aのポイント
  • Win32アプリケーションでカレントディレクトリからフォントを読み込む方法について説明します。
  • CreateFont関数の引数を変更して、カレントディレクトリからフォントを読み込もうと試みましたが、うまくいきませんでした。
  • カレントディレクトリのフォントを使用するための方法について、アドバイスをいただきたいです。
回答を見る
  • ベストアンサー

フォントをカレントディレクトリから読み込む方法

win32アプリケーションを作成しています。 フォントを、WINDOWS\Fontsからではなく、そのアプリケーションがあるディレクトリから読み込む必要が出てきたので、 hFont = CreateFont(iHeight,0,0,0,FW_DONTCARE, FALSE, FALSE, FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,"MS ゴシック"); を最後の引数だけ変更して、 hFont = CreateFont(iHeight,0,0,0,FW_DONTCARE, FALSE, FALSE, FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,"./hoge.ttf"); のようにしたのですが、読み込めていないようです。 MSDNを見ると、最後の引数はフォント名だとなっているので hFont = CreateFont(iHeight,0,0,0,FW_DONTCARE, FALSE, FALSE, FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,"hoge"); としましたが、やはりうまく行きません。 どのようにすれば、カレントディレクトリのフォントを使用できるのか、わかる方、ご教授お願いします。 環境はvc 2005, XPです。

  • qOat
  • お礼率80% (42/52)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

CreateFontなどで直接フォントファイルを指定するのは無理だと思います CreateFontの最後の引数は FontFaceなので『MS 明朝』『MS ゴシック』などのフォント名になります フォント選択ダイアログに表示される名前です … ファイル名ではありません 簡単にやるなら AddFontResouceなどでそのフォントをWindowsに登録してからCreateFontなどを使うようにしましょう アプリケーションの終了時に RemoveFontResourceを実行する必要があるのでしたら適当なタイミングで実行するようにしましょう

qOat
質問者

お礼

早くの返答ありがとうございます。 無事、フォントを読み込めました。 ありがとうございます。

関連するQ&A

  • Edit_SetTextでのフォント指定についての質問です。

    Edit_SetTextでのフォント指定についての質問です。 Windowsのプログラム作成で、hEdit = CreateWindow(。。。)で作ったウインドにEdit_SetText(hEdit, "文字")で文字を書く処理を作っておりますが、この文字のフォントを変えるのに苦戦しております。 ちなみに、hFont = CreateFont(20, 0, 0, 0, FW_BOLD, TRUE, TRUE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DEFAULT_QUALITY ,VARIABLE_PITCH | FF_ROMAN, "MS ゴシック"); SetWindowFont(hEdit, hFont, false); を試しましたが、フォントの高さの値は効いているのですがフォントが変わりません。 どなたか、ご存知の方おりましたらご教示お願いしたく、宜しくお願いします。

  • エディットボックスのフォントを変えたい

    MFCで作ったダイアログ上の他のコントロールはいじらずに、 エディットボックスのフォントだけを大きく変えたいのですが、 行間が変わらない為か、文字の下のほうが切れてしまいます。 色々試してみていますが、どうしても出来ません。 元のダイアログのフォントは12ptです。 OnInitDialog関数内で、 CFont m_font;(メンバ変数)に以下を設定し、 m_font.CreateFont( 20, 0, 0, 0, FW_SEMIBOLD, FALSE, FALSE, 0, SHIFTJIS_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS P ゴシック" ); OnCtlColor関数内で、該当エディットボックスの場合だけ pDC->SelectObject( &m_font ); しています。 CreateFontのパラメータが間違っているのでしょうか? それとも、これら関数を呼び出す場所が間違っているのでしょうか? ご回答お待ちしております。

  • 日本語不可のフォントで日本語を出力させた場合の動作についての質問

    現在、任意で指定したフォント名を使用してある文字列を表示するようなプログラムを作成しています。 CreateFont()の文字セットには、SHIFTJIS_CHARSET、タイプフェイス名にはArialを指定しても環境によっては、日本語が文字化けしたままとなります。 何故、そうなるのか分からない状況ですので、ご教授ください。 また、解決方法がございましたらお願いいたします。 表示する文字列:テスト ⇒ 出力結果:□□□ 現在、CreateFont()には以下の指定を行っています。 CreateFont(X, ※1 0, 0, 0, 400, TRUE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FIXED_PITCH | FF_DONTCARE, Y); ※2 ※1 X:任意のサイズ ※2 Y:Arial CreateFontで作成されたハンドルはSelectObjectで関連付けています。 よろしくお願いします。

  • フォントの指定 猫でもわかるwindowsプログラミングより

    猫でもわかるwindowsプログラミングの本で勉強している学生なんですが、第2章の2.4フォントの指定のところでプログラムを打ち込んでコンパイルしたのですがなぜか識別子が見つかりませんというエラーがでてコンパイルできません。どなたかわかる方お願いします。 一応プログラム(CALLBACK関数と論理フォント作成の関数のみ)↓ //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ static HFONT hFont1, hFont2, hFont3; PAINTSTRUCT ps; HDC hdc; char *szName1 = "○○"; char *szName2 = "▲▲"; switch (msg) { case WM_CREATE: hFont1 = MyCreateFont(40, SHIFTJIS_CHARSET, "HG行書体"); hFont2 = MyCreateFont(40, ANSI_CHARSET, "Fraktur JS"); hFont3 = MyCreateFont(40, SHIFTJIS_CHARSET, "MS 明朝"); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SelectObject(hdc, hFont1); TextOut(hdc, 0, 0, (LPCTSTR)szName1, (int)strlen(szName1)); SelectObject(hdc, hFont2); TextOut(hdc, 0, 60, (LPCTSTR)szName2, (int)strlen(szName2)); SelectObject(hdc, hFont3); TextOut(hdc, 0, 120, (LPCTSTR)szName1, (int)strlen(szName1)); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hFont1); DeleteObject(hFont2); DeleteObject(hFont3); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //論理フォントの作成 HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName){ return(CreateFont(nHeight, 0, 0, 0, FW_DONTCARE. FALSE, FALSE, FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); } エラー内容↓ MyCreateFontの識別子が見つかりません。 論理フォントの関数のFALSEの値が構文エラーで参照できない。

  • hPF=SelectObject(hD,hF);は何故エラーに

    HFONT hF,hPF; ・・・・・・・・・・・・・・ hD=BeginPaint(hW,&ps); hF=CreateFont(10,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,  SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,  DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"System"); hPF=SelectObject(hD,hF);//ここがエラー ・・・・・・・・・・・・・・ において hPF=SelectObject(hD,hF);//ここがエラー を単に SelectObject(hD,hF);//これでエラーでなくなる とすればエラーでなくなります エラー内容は Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland goo.cpp: エラー E2034 goo.cpp 808: 'void *' 型は 'HFONT__ *' 型に変換できない(関数 __stdcall WinProcedure(HWND__ *,unsigned int,unsigned int,long) ) *** 1 errors in Compile *** hPFを後で使いたいので困っています どうしたらエラーがなくなるでしょうか?

  • フォント指定の受渡し法?

    私が作成中の .NET C++プログラムはフォント指定を他のC#アプリから受取っており、そのフォント指定に基づいて文字を表示することになっております 受け取るフォント情報はC#のフォントダイアログにより選択されたものです 具体的には (1) M S 明朝, 9.75pt, style=Italic (2) HGPゴシックM, 20.25pt, style=Bold などといった文字列です 私が作成するC++ではこれらの指定に基づいてCreateFontするのでしょうが、上記のC#フォント指定と下記のC++ CreateFontパラメータでは差があり過ぎて、どのようにしたら良いのか分かりません font.CreateFont( 20.25, // フォントの高さ(大きさ)。 0, // フォントの幅。 0, // 0でOK。 0, // 同じく角度 FW_DONTCARE, // 文字の太さ FALSE, // イタリックならTRUEを指定 FALSE, // 下線ならTRUE FALSE, // 取り消し線ならTRUE SHIFTJIS_CHARSET, // フォントの文字セット OUT_DEFAULT_PRECIS, // 出力精度の設定 CLIP_DEFAULT_PRECIS, // クリッピング精度 DRAFT_QUALITY, // フォントの出力品質 DEFAULT_PITCH, // フォントのピッチとファミリを指定 L("HGPゴシックM") // フォントのタイプフェイス名の指定 ); C#のフォントダイアログからの情報を簡単にC++のCreateFontのパラメータを作り出す方法はありますか? またC#から受け取る情報が基本的に間違っており、別の情報があるのではないかと心配です 宜しくご指導願います

  • リストコントロールの文字の大きさ

    ハンドルがhWの主ウィンドウに hL=CreateWindow("LISTBOX",NULL,WS_CHILD|WS_VISIBLE,0,0,600,400,hW,HMENU(IDL),hI,0); でハンドルがhLのリストを配置して hF=CreateFont(36,(16,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"MS Pゴシック"); SendMessage(hL,WM_SETFONT,(WPARAM)hF,1); として文字の大きさを2倍にしようとしたのですが リストコントロールは2倍になったと思って項目の間隔を文字が2倍であるかのように開くのですが肝心の文字が大きくなりません。 何が問題なのでしょうか?

  • グラフィカルパスについて

    グラフィカルパスについて教えてほしいことが2つあるんですが。 (1)1つ目は下記のソースのようにでフォントを作成しないと描画できないないのですが、その理由を教えて下さい。 デフォルトのフォントだとなぜダメなのでしょうか? (2)2つ目はフォントを作成した場合に、SetBkMode()の部分をコメントアウトすると、背景が塗りつぶされ、文字が塗りつぶされませんが、どうしてでしょうか?(このときフォント作成のコメントアウトは解除して下さい) MSDNにFillPath()の説明に「パスの内部を塗りつぶす」とありますが、このとき文字は「内部」の扱いにならないのでしょうか? どれが内部でどれが外部になるのかよく理解できていないだと思います。 // HFONT hFont; char Str[] = "ABCDE"; HDC hdc = GetDC( hWnd ); BeginPath( hdc ); SetBkMode( hdc, TRANSPARENT ); /* hFont = CreateFont( 80, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET ,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DEFAULT_QUALITY, 0 ,NULL ); SelectObject( hdc ,hFont ); */ TextOut( hdc, 0, 0, Str, lstrlen(Str) ); EndPath( hdc ); SelectObject( hdc, CreateHatchBrush(HS_DIAGCROSS ,0xFF) ); FillPath( hdc ); SelectObject( hdc ,GetStockObject( SYSTEM_FONT ) ); // DeleteObject( hFont ); DeleteObject( SelectObject( hdc, GetStockObject(WHITE_BRUSH) ) ); ReleaseDC( hWnd, hdc ); どなたか分かる方いらっしゃいましたらご教授下さい。 よろしくお願いします。

  • 5^3をAPIで表示するために

    HDC hD; PAINTSTRUCT ps; TEXTMETRIC tm; HDROP hDrop; HFONT hPF,hF; string str; int i_w,i_h; ................................................................ case WM_PAINT: hD=BeginPaint(hW,&ps); SelectObject(hD,GetStockObject(OEM_FIXED_FONT)); GetTextMetrics(hD,&tm); i_w=tm.tmAveCharWidth; i_h=tm.tmHeight; SetTextAlign(hD,TA_LEFT|TA_TOP); ///////////////////////////////////////////////// str="5"; TextOut(hD,0,0,str.c_str(),str.size()); ///////////////////////////////////////////////// hF=CreateFont (i_h/2,i_w/2,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS ,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"System"); hPF=(HFONT)SelectObject(hD,hF); ///////////////////////////////////////////////// str="3"; TextOut(hD,i_w,0,str.c_str(),str.size()); ///////////////////////////////////////////////// SelectObject(hD,hPF); DeleteObject(hF); EndPaint(hW,&ps); return 0; とすればできますがCreateFontによる文字サイズは思うようなサイズにならないことが多くてやってみないとサイズが半分になっているかどうかわかりません 酷い場合には半分のサイズを指定しても全くサイズが変わらない場合もあります 上の例では i_h=18でありi_w=8でありCreateFont後 キャラクタの高さはi_h/2=9となりキャラクタの幅はi_w/2=4になってくれました しかしこの場合はたまたまうまくいったので通常はこうはなりません 確実にもとのサイズの半分(面積比1/4)のキャラクタサイズにする方法を教えてください

  • 文字の色

    OpenGLによる文字の描画を行っています。 以下のソースで文字の表示・フォントの変更はできたのですが、 文字の色の変更ができません。 どなたかお分かりになる方御願い致します。 ------------------------------ draw_text(L"あいうえお"); void draw_text(const wchar_t *s) { SelectObject(hcdc, hbm); HFONT hFont; HGDIOBJ hFontOld; hFont = CreateFont( 50, // フォント高さ 0, // 文字幅 0, // テキストの角度 0, // ベースラインとx軸との角度 FW_BOLD, // フォントの重さ(太さ) FALSE, // イタリック体 FALSE, // アンダーライン FALSE, // 打ち消し線 SHIFTJIS_CHARSET, // 文字セット OUT_DEFAULT_PRECIS, // 出力精度 CLIP_DEFAULT_PRECIS, // クリッピング精度 PROOF_QUALITY, // 出力品質 FIXED_PITCH | FF_MODERN, // ピッチとファミリー (LPCTSTR)"MS ゴシック"); // 書体名 SetTextColor(hcdc, RGB(255,0,0)); hFontOld = SelectObject(hcdc, hFont); while(*s != L'\0'){ int w; GCP_RESULTSW gr = {sizeof(GCP_RESULTSW)}; gr.nGlyphs = 1; gr.nMaxFit = 1; w = GetCharacterPlacementW( hcdc, // デバイスコンテキストのハンドル s, // 文字列へのポインタ 1, // 文字列内の文字数 1000, // 表示された文字列に対する最大範囲 &gr, // 配置結果に対するバッファへのポインタ 0); // 配置フラグ w &= 0xffff; { ExtTextOutW( hcdc, // デバイスコンテキストのハンドル 0, // 開始位置(基準点)の x 座標 0, // 開始位置(基準点)の y 座標 ETO_OPAQUE, // 長方形領域の使い方のオプション NULL, // 長方形領域の入った構造体へのポインタ s, // 文字列 1, // 文字数 NULL); // 文字間隔の入った配列 glBitmap( 96, // ビットマップの幅 96, // ビットマップの高さ(ピクセル単位) -128, // ビットマップイメージの原点の位置(x軸) 140, // ビットマップイメージの原点の位置(y軸) w, // オフセット値(x軸) 0, // オフセット値(y軸) (const GLubyte *)chbuf); // 画像データ } s++; } SelectObject(hcdc,hFontOld); }