お世話になっておりますKonです。よろしくお願いします。
PCはWinXP、MicrosoftVisualC++6.0 を使用しています。
MFC で、基本クラスをCFormView にしてプロジェクトを作りました。
EditBoxのフォントを指定したいと思っています。
こちらの掲示板を参考にして
class CInterFaceView : public CFormView{
・・・
public:
CFont m_Font;
}
void CInterFaceView::OnInitialUpdate(){
・・・
m_Font.CreatePointFont(90,MS ゴシック);
m_edit_file.SetFont(&m_Font);
m_Font.DeleteObject();
・・・
}
と記述したところ、
0,フォントは替わった気がする
1,9ポイントの文字で表示されない
2,文字が縦に重なり合う
3,MS ゴシック なのに、フォントの幅がそろわない
という問題が出て解決できません。
何がいけないのか、おわかりになりませんか?
> m_Font.DeleteObject();
は必要ないような。。。
「CreateFont」を使うと解決しそうですね。
3.「FIXED_PITCH」を指定する。
失礼しました、「EditBox」ですね。
「RichEdit」を使ったほうがいいです。
「AfxInitRichEdit()」を最初に入れます。
ご回答ありがとうございます。
m_Font.CreateFont(9,0,0,0,FW_NORMAL,FALSE,FALSE,0,
SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
FIXED_PITCH,MS ゴシック);
m_edit_file.SetFont(&m_Font);
m_Font.DeleteObject();
と修正してみましたが、状況が変わりません。
m_Font.DeleteObject();が無い場合は、正しく表示されるようですか
Assertionが出て落ちます。
使い方間違ってますか?
すみません、すれ違ってしまいました。
RichEditとはCRichEditCtrlのことですか?
当方、ポインタが危ういプログラマーでして
もう少しヒントをいただけると嬉しいのですが・・・。
WindowsXP SP2 Pro/VC++6.0 SP6 Stand/MFC SDI FormView
で上記のように試してみましたが、
> m_Font.DeleteObject();が無い場合は、正しく表示されるようですか
> Assertionが出て落ちます。
の状態になりませんでした。
Assertionは何をいっているのか調べてみてはどうでしょうか?
# VS2005 Pro でも試しましたが発生しませんでした
>m_Font.DeleteObject();が無い場合は、正しく表示されるようですか
>Assertionが出て落ちます。
OnInitialUpdate()が2回以上呼ばれてるとか?
「CRichEditCtrl」です。
誤りがありましたらどなたかフォローをお願いします。
CEDITには、本来フォントを変えることが出来ません。
Konさんもご存知の通りフォントを変えるには、「SetFont」
を使ってフォントを変更します。
CRichEditCtrlは、フォントを変更可能です。
SetDefaultCharFormatで変えます
皆様回答ありがとうございます。
まず、Assertionの件についてだけ報告します。
>Assertionは何をいっているのか調べてみてはどうでしょうか?
WINGDI.CPPというファイルの
BOOL CGdiObject::Attach(HGDIOBJ hObject)
で止まっているようですが、それが何をいみしているのか分かりませんでした。
>OnInitialUpdate()が2回以上呼ばれてるとか?
呼ばれています。
起動したときと、ファイルを読み込んだ時です。
2回呼ばれると、いけないのですか?
> 2回呼ばれると、いけないのですか?
「初期化」というと、二度以上呼び出されることを考慮しない
コードを書くことがよくありますから、
問題が発生する可能性があるでしょう。
上記の場合、フォントを二度作ろうとしてエラーになっています。
かといって、フォントを削除してしまうと、
そのフォントは表示されません。
既に作成済みかどうかのチェックを入れればいけそうですけど。
if ( !m_Font.GetSafeHandle() )
{
m_Font.CreatePointFont(90,MS ゴシック);
}
m_edit_file.SetFont(&m_Font);
SDIなどでは、OnInitialUpdateは2回以上呼ばれる
可能性があります。
OnInitialUpdateではなく、OnCreate(WM_CREATE)で
作成してみてはいかがですか?
皆様回答ありがとうございます。
Blueさんの記述でうまくいきました。
「CreateFont」でも問題ないようです。
おかげで表示が見やすくなりました。m(_ _)m
Kerry さんありがとうございます。
CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
は見つかりましたが、
OnCreate(WM_CREATE) は見つかりませんでした。
CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
は一度しか呼ばれないようなので、
ここにフォントの記述を移せば同じ動作になるのでしょうか?
まだ、コンパイルが通りませんが、できそうな雰囲気です。