たびたびお世話になっています。
特定のコントロールのフォントスタイルを変更する方法を教えてください。
1.ダイアログ上のリストボックスのフォントを等幅フォントにしたい。
→OSの言語に依存させたくないので、システムフォントに一番近い等幅フォントにしたい。
(フォント名称は指定したくない)
2. 特定のスタティックコントロール(ラベル)だけ、BOLDにしたい。
フォント名称やその他設定は全てシステムに依存させたいので、
日本語OSだとMSPゴシック 9ポイント でBOLDに。
英語OSならMS Scan SerifのBOLD体したい。
使っているのはMFCですか? SDK?
MFCで話してしまいますけれど、
基本的にコントロールもウインドウです。
したがって、CWndクラスのメソッドを使用すれば可能です。
ここは、大事なポイントです。
おさえて置いてください。
SetFontというメソッドが見つかるはずです。
このメソッドでフォントの変更が出来ます。
CFontクラスのインスタンスをダイアログのメンバー変数に追加します。
必要なフォントの種類に応じて個数を調整してください。
CFontクラスをSetFontに渡せば、渡したフォントに変更できます。
後はご自分で調べてください。
CFontオブジェクトに対して、
CreateFont()すればよいのですか?
この時、引数を指定しますが、BOLDにする以外は全てシステムのフォントにしたいのですが、
どうしたらよいのでしょう。
システムフォントやデフォルト固定幅フォントを得るには、
GetStockObject()を使用します。
フォント属性の一部を変えたフォントを作るには、
GetObject()で基準とするフォントのLOGFONTを取得し、
変更したい属性だけを修正して、CreateFontIndirect()で
新しいフォントを作成します。
何度も申し訳ありません。
MFCを使ってコーディングしているのですが、GetStockObject()やGetObject()の使い方がわ
かりません。
::OnInitUpdate()内で行うのですか?
GetStockObjectやGetObjectのHELPはよく読まれましたか?
これらの関数はMFCではなくてWin32APIと呼ばれる関数です。
これらの呼び出しは、呼び出しに必要な情報が揃っていれば、
基本的に何処でも出来ます。
これから得られる情報を使ってCreateFontIndirectを呼びたいわけですから、
これを呼ぶ前に呼んでおく必要があるでしょう。
私が進めるのは、ダイアログクラスから派生したクラスのコンストラクタで
処理してしまうという方法です。
ここでフォントを全て作成しておきます。
ところでOnInitUpdateという話が出ていますが、CDialogからの派生でなくて
CFormViewからの派生でやっているのですか?
こういうことは答えに影響するのできちんと提示しましょう。
出来れば、追加発言欄のところにある使用上の注意をよく読んでください。
提示すべき情報について書いてあります。
MFCであるならば、
CGdiObject::CreateStockObject();
CFont::GetLogFont();
CFont::CreateFontIndirect();
を使用した方がいいですね。
> ::OnInitUpdate()内で行うのですか?
この記述は、OnInitUpdate()というグローバル関数
という意味になりますけど、
CView::OnInitialUpdate()のことでしょうか?
フォントを設定する前ならば、
どこでも好きな場所でフォントを作ることができます。
解答ありがとうございました。
今までVBのみで開発していた為、VC++に関しては本当に初心者で、MSDNのヘルプ
を読んでもよくわからない事が多々ありましたが、なんとかいけました。
下記のコードでいけました。
CFont* pFont; //現在のフォント
LOGFONT lf;
pFont = GetDlgItem(IDC_TITLE_1)->GetFont();
pFont->GetLogFont(&lf);
lf.lfWeight = FW_BOLD;
//m_fntBoldはメンバ変数。
m_fntBold.DeleteObject(); // 一旦削除する
m_fntBold.CreateFontIndirect(&lf);
GetDlgItem(IDC_TITLE_1)->SetFont(&m_fntBold);