この人頭いいなと思ったエピソード

.NET C# でフォントダイアログボックスを表示しています

フォントダイアログボックスの中のサンプル文字(添付写真の赤丸内の文字)を変更することは可能でしょうか?

ボックスで指定したフォントは数字しか使用しません
よって漢字、アルファベットのサンプルは不要なのです
出来ればサンプル文字を半角文字の 1234567890 と出来ればベストなのですが・・・・・

色々と調べましたが分かりません
ご存知でしたらお教えください

「フォントダイアログのサンプル文字を変更す」の質問画像

A 回答 (4件)

>フォントの選択を変更した後、書き換えられたら再度上書きする。

という処理が必要そうです。

ということで、無駄なあがきをしてみる(見苦しいとも言う)。
WindowsXP Sp3 + VC# 2010 EE(.Net Framework 4.0 Client Profile)で確認。

class CustomFontDialog : FontDialog
{
 const int WM_INITDIALOG = 0x0110;
 const int WM_COMMAND = 0x0111;
 const int CBN_SELCHANGE = 1;
 const int WM_SETTEXT = 0x000C;
 const int WM_APP = 0x8000;

 private IntPtr hStaticWnd;

 [DllImport("user32.dll")]
 static extern IntPtr GetDlgItem(IntPtr hWnd, int nIDDlgItem);
 [DllImport("user32.dll")]
 static extern int SendMessage(IntPtr hwnd, int msg, int wParam, string lParam);
 [DllImport("user32.dll")]
 static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
 [DllImport("user32.dll")]
 static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, Boolean bErase);

 [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
 protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
 {
  switch (msg)
  {
   case WM_INITDIALOG:
    hStaticWnd = GetDlgItem(hWnd, 0x0444);
    SendMessage(hStaticWnd, WM_SETTEXT, 0, "1234567890");
    break;
   case WM_COMMAND:
    if ((wParam.ToInt32() >> 16) == CBN_SELCHANGE && (wParam.ToInt32() & 0xFFFF) == 0x470)
     PostMessage(hWnd, WM_APP, 0, 0);
    break;
   case WM_APP:
    SendMessage(hStaticWnd, WM_SETTEXT, 0, "1234567890");
    InvalidateRect(hWnd, IntPtr.Zero, false);
    break;
  }

  return base.HookProc(hWnd, msg, wParam, lParam);
 }
}


「フォント名」の選択が変更されると親ウィンドウにCBN_SELCHANGEが通知されるので…PostMessage()でメッセージキューに独自メッセージを積む。
で、独自メッセージを受けたらサンプルの文字列を書き換えて再描画を強制する。

う~ん……かなり無理矢理ですなぁ…。
手間かけている割には見返りは自己満足だけ…という。
    • good
    • 0
この回答へのお礼

重ね重ねありがとうございました

でも難しくて手が出ません
このご回答が何れの日にか、誰かの役に立つことを心から祈ります

で私のプログラムは・・・・・ ダイアログに似たフォームを作りました

ありがとうございました

お礼日時:2013/10/17 10:08

フォントの選択を変更したら上書きされますな。


……う~ん…結構面倒かも知れないです。

フォントの選択を変更した後、書き換えられたら再度上書きする。という処理が必要そうです。
StaticTextのウィンドウをサブクラス化できれば簡単なのかも知れませんけどね…。
# Spy++で覗いても…ちょっと厳しいですかねぇ。

自前でサンプルの上にLabelなり乗っけて、フォントが選択された時にそのLabelのフォント設定を変更する。
とか……。
# まあ、そのフォントを選択した(Fontプロパティが変化した)って状態を検出できないんですが。

自前で作った方が楽かも知れませんねぇ……。
    • good
    • 0
この回答へのお礼

重ねて御礼申し上げます

お礼日時:2013/10/17 10:04

CommonDialogクラスのHookProcメソッドをオーバーライドすることになりますかねぇ……。



http://msdn.microsoft.com/ja-jp/library/system.w …

ということで、ちょこっといぢってみました。
SendDlgItemMessage()の第2引数に渡すコントロールIDはSpy++で確認。
# Dlgs.hをインクルードできるならstc5…ですかねぇ。まぁ、C#なんで…そのまま直値で書いてますが。


class CustomFontDialog : FontDialog
{
 const int WM_INITDIALOG = 0x0110;
 const int WM_SETTEXT = 0x000C;

 [DllImport("user32.dll")]
 extern static IntPtr SendDlgItemMessage(IntPtr hWnd, int nIDDlgItem, int msg, IntPtr wParam, string lParam);
 [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
 protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
 {
  switch (msg)
  {
   case WM_INITDIALOG:
    SendDlgItemMessage(hWnd, 0x0444 ,WM_SETTEXT, IntPtr.Zero, "1234567890");
    break;
  }

  return base.HookProc(hWnd, msg, wParam, lParam);
 }
}
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2013/10/17 10:03

フォントダイアログのサンプル文字を変える方法は準備されていません。


自前でフォントダイアログを作るしかないようです。
    • good
    • 0
この回答へのお礼

ありがとうございます

やはり自前のフォントダイアログを作成しなければなりませんかぁ~・・・・

パラメータで簡単に変更出来るかときたいしていたのですが・・・・

残念です

ありがとうございました

お礼日時:2013/10/02 11:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!