エディットボックスのフォント変更

[戻る]
Kon 2006/03/15(水) 18:18:53
お世話になっております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 ゴシック なのに、フォントの幅がそろわない
という問題が出て解決できません。
何がいけないのか、おわかりになりませんか?

Blue 2006/03/15(水) 18:24:33
> m_Font.DeleteObject();
は必要ないような。。。

ITO 2006/03/15(水) 18:50:19
「CreateFont」を使うと解決しそうですね。

3.「FIXED_PITCH」を指定する。

ITO 2006/03/15(水) 18:58:27
失礼しました、「EditBox」ですね。
「RichEdit」を使ったほうがいいです。
「AfxInitRichEdit()」を最初に入れます。

Kon 2006/03/15(水) 19:13:47
ご回答ありがとうございます。

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が出て落ちます。
使い方間違ってますか?

Kon 2006/03/15(水) 19:44:58
すみません、すれ違ってしまいました。

RichEditとはCRichEditCtrlのことですか?
当方、ポインタが危ういプログラマーでして
もう少しヒントをいただけると嬉しいのですが・・・。

Blue 2006/03/15(水) 22:49:08
WindowsXP SP2 Pro/VC++6.0 SP6 Stand/MFC SDI FormView
で上記のように試してみましたが、

> m_Font.DeleteObject();が無い場合は、正しく表示されるようですか
> Assertionが出て落ちます。

の状態になりませんでした。
Assertionは何をいっているのか調べてみてはどうでしょうか?

# VS2005 Pro でも試しましたが発生しませんでした

subaru 2006/03/15(水) 23:04:44
>m_Font.DeleteObject();が無い場合は、正しく表示されるようですか
>Assertionが出て落ちます。
OnInitialUpdate()が2回以上呼ばれてるとか?

ITO 2006/03/15(水) 23:45:03
「CRichEditCtrl」です。

誤りがありましたらどなたかフォローをお願いします。
CEDITには、本来フォントを変えることが出来ません。
Konさんもご存知の通りフォントを変えるには、「SetFont」
を使ってフォントを変更します。
CRichEditCtrlは、フォントを変更可能です。
SetDefaultCharFormatで変えます

Kon 2006/03/16(木) 08:54:22
皆様回答ありがとうございます。
まず、Assertionの件についてだけ報告します。

>Assertionは何をいっているのか調べてみてはどうでしょうか?

WINGDI.CPPというファイルの
BOOL CGdiObject::Attach(HGDIOBJ hObject)
で止まっているようですが、それが何をいみしているのか分かりませんでした。

>OnInitialUpdate()が2回以上呼ばれてるとか?

呼ばれています。
起動したときと、ファイルを読み込んだ時です。
2回呼ばれると、いけないのですか?

dairygoods 2006/03/16(木) 09:36:44
> 2回呼ばれると、いけないのですか?

「初期化」というと、二度以上呼び出されることを考慮しない
コードを書くことがよくありますから、
問題が発生する可能性があるでしょう。

上記の場合、フォントを二度作ろうとしてエラーになっています。


かといって、フォントを削除してしまうと、
そのフォントは表示されません。

Blue 2006/03/16(木) 09:41:33
既に作成済みかどうかのチェックを入れればいけそうですけど。

  if ( !m_Font.GetSafeHandle() )
  {
   m_Font.CreatePointFont(90,"MS ゴシック");
  }
 m_edit_file.SetFont(&m_Font);

Kerry 2006/03/16(木) 10:09:17
SDIなどでは、OnInitialUpdateは2回以上呼ばれる
可能性があります。

OnInitialUpdateではなく、OnCreate(WM_CREATE)で
作成してみてはいかがですか?

Kon 2006/03/16(木) 10:42:07
[[解決]]
皆様回答ありがとうございます。

Blueさんの記述でうまくいきました。
「CreateFont」でも問題ないようです。

おかげで表示が見やすくなりました。m(_ _)m

Kon 2006/03/16(木) 11:32:03
Kerry さんありがとうございます。

CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
は見つかりましたが、
OnCreate(WM_CREATE) は見つかりませんでした。

CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
は一度しか呼ばれないようなので、
ここにフォントの記述を移せば同じ動作になるのでしょうか?
まだ、コンパイルが通りませんが、できそうな雰囲気です。

Ban 2006/03/16(木) 12:36:17
> OnCreate(WM_CREATE) は見つかりませんでした。

こういう関数があるということではないです。

OnCreate という MFC のハンドラは、
内部的に WM_CREATE メッセージを受信した際に呼ばれるので、
このあたりを、括弧つきで補足されたものと思われます。

古いスレッドには追加発言できません。