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


にーます  2012-01-11 18:10:15  No: 73095  IP: 192.*.*.*

エディットボックスのフォントを変更できるようにしたいと思っています。
どのようにしたらいいでしょうか?

hWndEdit1 = CreateWindow("EDIT",
      "",
      WS_CHILD | WS_VISIBLE | WS_BORDER,
      (sPos.left + sSize.cx + 7),
      sPos.top,
      200,
      22,
      hWnd,
      (HMENU)EDIT1,
      (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
      NULL);

上記のような形でエディットボックスを生成しています。

編集 削除
瀬戸っぷ  2012-01-11 22:13:17  No: 73096  IP: 192.*.*.*

「エディットボックス フォント」で検索したことはありますか?

編集 削除
にーます  2012-01-11 22:24:01  No: 73097  IP: 192.*.*.*

検索したことはあります。
ですが、自分のソースの書き方から
どうしたらよいのかわかりませんでした。

編集 削除
YuO  2012-01-11 23:29:28  No: 73098  IP: 192.*.*.*

MSDN: Edit Control Text Operations # Changing the Font Used by an Edit Control
http://msdn.microsoft.com/en-us/library/windows/desktop/bb775460.aspx#changing_fonts
> An application can change the font that an edit control uses by sending the WM_SETFONT message.

検索してちゃんと調べれば一次資料である上記に行き着くはず。
さて,何がわからないのでしょうか。
・フォントの作成方法がわからない
・メッセージをコントロールにSendする方法が分からない
・その他 (具体的に)

編集 削除
にーます  2012-01-12 10:52:48  No: 73099  IP: 192.*.*.*

アプリケーション上で自由にフォントを変更できるようにするプログラムの書き方がわかりません。

編集 削除
YuO  2012-01-12 11:08:41  No: 73100  IP: 192.*.*.*

> アプリケーション上で自由にフォントを変更できるようにするプログラムの書き方がわかりません。

・メニュー選択か何かをトリガにフォント選択ダイアログを表示させる
・フォント選択ダイアログでフォントが選択されて戻ってきたら,エディットコントロールにフォントを設定する
でやりたいことが実現できそうなので,そう書けば良いです。
# 大雑把な質問に対する回答は,大雑把にしかできませんよ。

編集 削除
にーます  2012-01-21 00:37:00  No: 73101  IP: 192.*.*.*

大雑把な質問しかできなくてすみませんでした。

まず、フォント選択のダイアログを表示させるプログラムがどのように書けばいいのかがまずわかりません。
次にフォントが選択されて戻ってきた場合にエディットコントロールにフォントを設定する方法もよく理解できませんでした。

編集 削除
Ryo  2012-01-21 00:44:12  No: 73102  IP: 192.*.*.*

とりあえず、
自分で試してみたソースをあげてみて
それすらできないとなると掲示板では無理。
本を買って基礎を学ぶしかない

編集 削除
にーます  2012-01-21 12:03:31  No: 73103  IP: 192.*.*.*

case WM_PAINT:
    // クライアント領域を再描画する処理
    hDC = BeginPaint(hWnd, &ps);
    
    hFont = CreateFontIndirect(&lf);
    SelectObject(hDC , hFont);
    SetTextColor(hDC , cf.rgbColors);
    SelectObject(hDC , GetStockObject(SYSTEM_FONT));
    
    TextOut(hDC, sPos.left, sPos.top, skypeid, lstrlen(skypeid));
    TextOut(hDC, timePos.left, timePos.top, time, lstrlen(time));
    TextOut(hDC, themePos.left, themePos.top, theme, lstrlen(theme));
    TextOut(hDC, nPos.left, nPos.top, now, lstrlen(now));
    TextOut(hDC, wPos.left, wPos.top, wait, lstrlen(wait));
    TextOut(hDC, hPos.left, hPos.top, history, lstrlen(history));
    wsprintf(wBuff, "%d人", w);
    TextOut(hDC, wPos.left + wSize.cx + 15, wPos.top, wBuff, lstrlen(wBuff));

    DeleteObject(hFont);
    EndPaint(hWnd, &ps);
    return 0;
  case WM_COMMAND:
    // ボタンがクリックされた時の処理
    if (LOWORD(wParam) == BTN1)
    {
      GetWindowText(hWndEdit4, sBuff, 999);  
      GetWindowText(hWndEdit5, hBuff, 999);
      lstrcat(hBuff,sBuff);
      lstrcat(hBuff, "、");
      SetWindowText(hWndEdit5, hBuff);
      SetWindowText(hWndEdit4, "");
      if(w > 0)
      {
        w--;
      }
    }

    if (LOWORD(wParam) == BTN2)
    {
      w++;
    }
    
    if (LOWORD(wParam) == BTN3)
    {
      if(w > 0)
      {
        w--;
      }
    }

    if (LOWORD(wParam) == BTN4)
    {
      if (!ChooseFont(&cf)) return 0;
    }

    InvalidateRect(hWnd, NULL, TRUE);

    return 0;
ボタンを押したらダイアログを出してフォントの選択を行い、そのフォントをエディットボックスに適応させたいのですが上手く反映されません。

編集 削除
瀬戸っぷ  2012-01-21 13:19:29  No: 73104  IP: 192.*.*.*

対象は「エディットボックス」じゃなかったんですか?
掲示されたコードだと、クライアント領域に描画しているフォントを変更していることになりますけど。

フォントの指定が変更される契機と、実際の画面描画が走る契機、どっちの方が多いでしょうか?
描画がかかるたびに、フォント作って、使って、消してを繰り返すコードに無駄があるとは思えませんか?

各変数の寿命が不明です。
lfやw、cfがただのローカル変数なら、期待した動作はしないでしょう。
# コピペするときにカットしたのかもしれませんが…エラー処理はちゃんとやっているんですよね?

編集 削除
にーます  2012-01-21 17:23:44  No: 73105  IP: 192.*.*.*

対象はエディットボックスのフォントです。
自分なりに調べてみてこの形になってしまいました。

エラーは処理しているのでありません。

編集 削除
YuO (via mobile)  2012-01-21 21:39:22  No: 73106  IP: 192.*.*.*

まずはエディットボックスのフォントを設定することだけをしてみてはどうですか。
いろいろとやろうとして,したいことが完全に抜けているように思えます。

編集 削除
にーます  2012-02-13 02:35:31  No: 73107  IP: 192.*.*.*

わかりました

そうしてみます。

編集 削除
forty-five  2012-02-13 08:39:19  No: 73108  IP: 192.*.*.*

真面目な話、フォントの廃棄ってどうやるんだろう。

hWndEdit1 = CreateWindow(...);
hFontEdit1 = CreateFont(
  10,
  0,
  0,
  0,
  0,
  FALSE,
  FALSE,
  FALSE,
  ANSI_CHARSET,
  OUT_DEFAULT_PRECIS,
  CLIP_DEFAULT_PRECIS,
  DEFAULT_QUALITY,
  FF_DONTCARE,
  TEXT("MS UI Gothic"));
SendMessage(hWndEdit1, (WPARAM)hFontEdit1, TRUE);

こうした場合、ダイアログの WM_DESTROY 辺りで、

SendMessage(hWndEdit1, NULL, FALSE);
DeleteObject(hFontEdit1);

こうするのかな。
WM_DESTROY のタイミングで hWndEdit1 が生きているかが不安。
かと言って、WM_INITDIALOG の対となるメッセージは無いし・・・

確か WS_POPUP のウィンドウは親ウィンドウの WM_DESTROY の
タイミングでは既に消滅していたと思う。
WS_CHILD なら大丈夫だったような気もするけど、
スマートにやるなら、やはり hWndEdit1 をサブクラス化して、
hWndEdit1 の WM_DESTROY で DeleteObject() すべきなのかな。
でも面倒なんだよね><

編集 削除
YuO  2012-02-13 13:17:54  No: 73109  IP: 192.*.*.*

ヲサヲサラペトナモヤメマルヲサのタイミングでヲサラナアヲサが生きているかが不安。
自分でトラしたならともかく,そうでないのであれば生きているとみなせます。

ヘモトホコヲサラペトナモヤメマルヲサ
コッッョョッュッッッッカウイカイーョ
ヲサヲサヤヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサィヲサゥヲサヲサヲサヲサョヲサトヲサヲサヲサヲサヲサャヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサョ
スススススススススススススススススススススススススススススススススススススススス
ニコ 仲澤@失業者
トコ イーアイッーイッアウィ月ゥ アカコイケコアア  書込者ノト:ロ 」 「」 。 ン

フォントのハンドルの寿命はプログラマに任せられていて
任意です。これは、引数やパラメータにネラホトやネトテがない
ことをみれば自明ですね。従って単一のフォントが異なる
ネラホトを基に作られた複数のネトテで使用されることも許可され
ているわけです。以上の条件からフォントを破棄してよい
条件とは
  アョそれを使用しているネトテが一つも無い時。
ですね。  
ラペトナモヤメマルの後ではラペミチノホヤを受け取る可能性はないので、
ネトテを使用する機会はもはやありません。現実的には、その
タイミングで大本のネニマホヤを破棄してかまいません。
スススススススススススススススススススススススススススススススススススススススス
ニコ ュ
トコ イーアイッーイッアオィ水ゥ アアコエイコーク シ  スュアセヲサアイイョイエケョキアョアエクヲサシッセ 書込者ノト:ロ 「「。 、  ン

ありがとうございました。参考になりました。
スレ主さんも頑張ってね。

編集 削除