- ベストアンサー
フォントダイアログのサンプル文字を変更するには?
- みんなの回答 (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()でメッセージキューに独自メッセージを積む。 で、独自メッセージを受けたらサンプルの文字列を書き換えて再描画を強制する。 う~ん……かなり無理矢理ですなぁ…。 手間かけている割には見返りは自己満足だけ…という。
その他の回答 (3)
- Wr5
- ベストアンサー率53% (2173/4061)
フォントの選択を変更したら上書きされますな。 ……う~ん…結構面倒かも知れないです。 フォントの選択を変更した後、書き換えられたら再度上書きする。という処理が必要そうです。 StaticTextのウィンドウをサブクラス化できれば簡単なのかも知れませんけどね…。 # Spy++で覗いても…ちょっと厳しいですかねぇ。 自前でサンプルの上にLabelなり乗っけて、フォントが選択された時にそのLabelのフォント設定を変更する。 とか……。 # まあ、そのフォントを選択した(Fontプロパティが変化した)って状態を検出できないんですが。 自前で作った方が楽かも知れませんねぇ……。
お礼
重ねて御礼申し上げます
- Wr5
- ベストアンサー率53% (2173/4061)
CommonDialogクラスのHookProcメソッドをオーバーライドすることになりますかねぇ……。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.commondialog.hookproc%28v=vs.100%29.aspx ということで、ちょこっといぢってみました。 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); } }
お礼
ありがとうございました
- Picosoft
- ベストアンサー率70% (274/391)
フォントダイアログのサンプル文字を変える方法は準備されていません。 自前でフォントダイアログを作るしかないようです。
お礼
ありがとうございます やはり自前のフォントダイアログを作成しなければなりませんかぁ~・・・・ パラメータで簡単に変更出来るかときたいしていたのですが・・・・ 残念です ありがとうございました
お礼
重ね重ねありがとうございました でも難しくて手が出ません このご回答が何れの日にか、誰かの役に立つことを心から祈ります で私のプログラムは・・・・・ ダイアログに似たフォームを作りました ありがとうございました