none
自作のMessageBoxについて RRS feed

  • 質問

  • タスクスケジューラーでポップアップメッセージを表示するために、Powershellで自作のMessageBoxを作りました。

    標準のMessageBoxだと表示方法がほとんどカスタマイズができないためです。
    ほぼほぼできたのですが、当たり前ですがメッセージ表示部分をlabelやTextBoxでつくると、文字列の一部を強調表示できず文字列全体に適用されてしまいます。
    メッセージ文字列の一部のみ強調表示するにはどうすればいいのでしょうか。

    つまり、HTML風に書くと

    「表示メッセージの中の<font color="Red"><b>ここが強調部分</b></font>です。」

    のように強調部分のみ赤字にしたり、ボールドにしたりして表示したいのです。

    フル機能は必要なく

    ・フォントサイズ
    ・文字色
    ・ボールド/イタリック/下線

    あたりが指定できれば十分です。

    RichTextBoxを使えばできそうですが、ググってみるとRichText⇒HTML変換ばかりで、

    HTML⇒RichTextの変換が見当たらないので、どうやって表示メッセージを作ればいいのかわかりません。

    何かうまい方法やアイディアはありませんでしょうか?

    実現方法にはこだわらないので、RichTextを使わずにHTMLの表示窓的なものをメッセージ部分にに表示するというやり方でもよいです。

    当方プログラミング歴がほとんどないので苦労しています。環境は
    Windows10
    Powershell 5.1
    です。よろしくお願いします。

    2018年11月7日 1:04

すべての返信

  • WebBrowserコントロールを使うのはどうですか? $webBrowser.DocumetTextにHTMLを直接代入することができます。
    2018年11月7日 1:29
  • Hongliangさん

    回答ありがとうございました。

    何もかもが初めてでWebBrowserコントロールというのも知りませんでした。

    ちょっとやってみましたがとりあえず文字は出ました。今は時間がないので詳しくできないですが、後でいろいろとやってみます。

    フォントの指定の仕方とか、行間はどうやれば狭くなるんだろうとか、課題はいっぱいありそうな感じでした。

    2018年11月7日 4:46
  • 動的にテキストを装飾して表示する必要がないなら、あらかじめ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


    2018年11月7日 16:03
    モデレータ
  • 牟田口さん

    サンプルコードまで上げていただきありがとうございました。
    RichTextBoxの使い方がいまいちわからなかったのですが、よくわかりました。こうやって使うんですね。
    ただ、自分でやる場合はこれで問題ないんですが、PCに疎いお姉ちゃんたちもいるので、rtf作成は敷居が高いです。
    テキストエディタでHTMLファイルを開き、メッセージ部分のみ修正できる方がお手軽なので、WebBrowserコントロールを使うやり方を模索しております。

    現在、Formのバックグラウンドカラーをどうやって、WebBrowserコントロール全体に反映させればいいのかでハマっています。
    初心者が見よう見まねでやっているので、試行錯誤しています。問題を整理して追加質問したいと思います。

    2018年11月8日 3:42
  • 牟田口さん

    1点教えていただけますか。
    rtfファイルはワードでも編集できると聞いて、メッセージ表示部分をWebBrowserコントロールで表示する機能に加え、お教えいただいたRichTextBoxコントロールにも対応しようとしています。

    ワードパッドでRTFファイルを作成し、

    $richTextBox.LoadFile([リッチテキストファイル], [System.Windows.Forms.RichTextBoxStreamType]::RichText)

    で読み込んで、一応の表示はできたのですが、文字色やボールドなどの装飾が有効になりません(単に普通のテキストが表示されただけ)。
    何か足りない設定でもあるのでしょうか。

    2018年11月10日 19:00
  • 私が書いたスクリプトで

    $messageRichTextBox.LoadFile("rtfファイルのフルパス", [System.Windows.Forms.RichTextBoxStreamType]::RichText)

    という行を追加すると、装飾が有効になった状態でrtfファイルの内容を表示することができました。

    特に設定等はないように思うのですが…。rtfファイルをワードパッドで開き直したとき、ちゃんと装飾されているか確認してみてください。

    2018年11月11日 3:02
    モデレータ
  • 牟田口さん

    回答ありがとうございました。いろいろと試行錯誤の結果、やっと原因が判明しました。

    子コントロールのフォント(ボタンなど)をまとめて設定するため、Form.Fontにメイリオを設定していたのが原因でした。
    メッセージ表示部分を WebBrowser で実装したときは、HTMLで指定したフォントが有効になっていて、Form.Fontの影響を受けなかったので気づきませんでした。
    RichTextBoxの場合は、Form.Fontの影響をもろに受けてしまうのですね。初心者なのでちょっとしたことで、もの凄く時間を使ってしまいました。先が長いです。

    2018年11月11日 13:46