質問者
自作のMessageBoxについて

質問
-
タスクスケジューラーでポップアップメッセージを表示するために、Powershellで自作のMessageBoxを作りました。
標準のMessageBoxだと表示方法がほとんどカスタマイズができないためです。
ほぼほぼできたのですが、当たり前ですがメッセージ表示部分をlabelやTextBoxでつくると、文字列の一部を強調表示できず文字列全体に適用されてしまいます。
メッセージ文字列の一部のみ強調表示するにはどうすればいいのでしょうか。つまり、HTML風に書くと
「表示メッセージの中の<font color="Red"><b>ここが強調部分</b></font>です。」
のように強調部分のみ赤字にしたり、ボールドにしたりして表示したいのです。
フル機能は必要なく
・フォントサイズ
・文字色
・ボールド/イタリック/下線あたりが指定できれば十分です。
RichTextBoxを使えばできそうですが、ググってみるとRichText⇒HTML変換ばかりで、
HTML⇒RichTextの変換が見当たらないので、どうやって表示メッセージを作ればいいのかわかりません。
何かうまい方法やアイディアはありませんでしょうか?
実現方法にはこだわらないので、RichTextを使わずにHTMLの表示窓的なものをメッセージ部分にに表示するというやり方でもよいです。
当方プログラミング歴がほとんどないので苦労しています。環境は
Windows10
Powershell 5.1
です。よろしくお願いします。
すべての返信
-
動的にテキストを装飾して表示する必要がないなら、あらかじめrtfフォーマットのテキストを作っておいて、それをRichTextBoxに表示させれば簡単かと思います。
rtfフォーマットのテキストは、Windowsに付属している「ワードパッド」で作成できます。ワードパッドでrtfファイルとして保存し、メモ帳でrtfファイルをテキストファイルとして開けばOKです。
RichTextBoxオブジェクトのRtfプロパティに、作成したrtfテキストを代入すれば、ワードパッドで作成した装飾テキストがそのまま反映されるかと思います。
以下はRichTextBoxを使って、装飾文字列を表示したダイアログを出すサンプルです。
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $form = New-Object System.Windows.Forms.Form -Property @{ Text = "テスト" Size = New-Object System.Drawing.Size 260,160 StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog MaximizeBox = $false MinimizeBox = $false } $messageRichTextBox = New-Object System.Windows.Forms.RichTextBox -Property @{ Location = New-Object System.Drawing.Point 10,20 Size = New-Object System.Drawing.Size 250,40 BorderStyle = [System.Windows.Forms.BorderStyle]::None BackColor = $form.BackColor ReadOnly = $true ScrollBars = [System.Windows.Forms.RichTextBoxScrollBars]::None Rtf = @' {\rtf1\ansi\ansicpg932\deff0\nouicompat\deflang1033\deflangfe1041{\fonttbl{\f0\fnil\fcharset128 \'82\'6c\'82\'72 \'96\'be\'92\'a9;}} {\colortbl ;\red255\green0\blue0;} {\*\generator Riched20 10.0.17134}\viewkind4\uc1 \pard\sa200\sl276\slmult1\ul\f0\fs22\lang1041\'82\'b1\'82\'ea\ulnone\b\'82\'cd\cf1\b0\'83\'65\'83\'58\'83\'67\cf0\i\fs40\'95\'b6\'8f\'cd\i0\fs22\'82\'c5\'82\'b7\'81\'42\lang17\par } '@ } $okButton = New-Object System.Windows.Forms.Button -Property @{ Location = New-Object System.Drawing.Point 40,80 Size = New-Object System.Drawing.Size 75,30 Text = "OK" DialogResult = [System.Windows.Forms.DialogResult]::OK } $cancelButton = New-Object System.Windows.Forms.Button -Property @{ Location = New-Object System.Drawing.Point 130,80 Size = New-Object System.Drawing.Size 75,30 Text = "Cancel" DialogResult = [System.Windows.Forms.DialogResult]::Cancel } $form.AcceptButton = $okButton $form.CancelButton = $cancelButton $form.Controls.AddRange(@($okButton, $cancelButton, $messageRichTextBox)) $result = $form.ShowDialog() $result
- 編集済み 牟田口大介Moderator 2018年11月7日 16:03
-
牟田口さん
サンプルコードまで上げていただきありがとうございました。
RichTextBoxの使い方がいまいちわからなかったのですが、よくわかりました。こうやって使うんですね。
ただ、自分でやる場合はこれで問題ないんですが、PCに疎いお姉ちゃんたちもいるので、rtf作成は敷居が高いです。
テキストエディタでHTMLファイルを開き、メッセージ部分のみ修正できる方がお手軽なので、WebBrowserコントロールを使うやり方を模索しております。現在、Formのバックグラウンドカラーをどうやって、WebBrowserコントロール全体に反映させればいいのかでハマっています。
初心者が見よう見まねでやっているので、試行錯誤しています。問題を整理して追加質問したいと思います。 -
牟田口さん
1点教えていただけますか。
rtfファイルはワードでも編集できると聞いて、メッセージ表示部分をWebBrowserコントロールで表示する機能に加え、お教えいただいたRichTextBoxコントロールにも対応しようとしています。ワードパッドでRTFファイルを作成し、
$richTextBox.LoadFile([リッチテキストファイル], [System.Windows.Forms.RichTextBoxStreamType]::RichText)
で読み込んで、一応の表示はできたのですが、文字色やボールドなどの装飾が有効になりません(単に普通のテキストが表示されただけ)。
何か足りない設定でもあるのでしょうか。 -
牟田口さん
回答ありがとうございました。いろいろと試行錯誤の結果、やっと原因が判明しました。
子コントロールのフォント(ボタンなど)をまとめて設定するため、Form.Fontにメイリオを設定していたのが原因でした。
メッセージ表示部分を WebBrowser で実装したときは、HTMLで指定したフォントが有効になっていて、Form.Fontの影響を受けなかったので気づきませんでした。
RichTextBoxの場合は、Form.Fontの影響をもろに受けてしまうのですね。初心者なのでちょっとしたことで、もの凄く時間を使ってしまいました。先が長いです。