モードレスメッセージボックスを作成するにはどうすればよいでしょうか。独自のWindowsフォームクラスを作成して使用する必要がありますか?もしそうなら、警告アイコンを追加し(自分の画像を挿入するのではなく)、テキストの量に基づいてサイズを変更する簡単な方法はありますか?
7 に答える
コードがバックグラウンドで実行されている間だけ表示されるメッセージボックスが必要な場合(ボックスはまだモーダルであり、[OK]をクリックするまでユーザーが他のウィンドウを使用できないようにします)、いつでも独自のスレッドでメッセージボックスを開始できます元のスレッドで行ったことを続けます。
// Do stuff before.
// Start the message box -thread:
new Thread(new ThreadStart(delegate
{
MessageBox.Show
(
"Hey user, stuff runs in the background!",
"Message",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
})).Start();
// Continue doing stuff while the message box is visible to the user.
// The message box thread will end itself when the user clicks OK.
フォームを作成し、Show()
それをモードレスで表示するために使用する必要があります。MessageBox.Show(...)
ghibozの例に見られるようにモーダルで動作しました。「メッセージの説明」は、ユーザーがボタンを押すまで表示されます。
MessageBox.Show(...)
メッセージボックスを閉じるとすぐに結果が得られます。モードレスメッセージボックスを使用する場合、コードには、ユーザーが最終的にメッセージボックスで何かを選択したときに反応するイベントなどのメカニズムが必要になります。
コードを書く以外に、コンストラクターで次のような小さなフォームを作成できます。
- 表示するメッセージとしてパラメータ文字列を取ります
- フォームのラベルにこの文字列を入力します
- 次のいずれかのアイコンをロードします(コンストラクターに列挙型を渡します)
SystemIcons.Application
SystemIcons.Asterix
SystemIcons.Error
SystemIcons.Exclamation
SystemIcons.Hand
SystemIcons.Information
SystemIcons.Question
SystemIcons.Shield
SystemIcons.Warning
SystemIcons.WinLogo
- Show()を呼び出すと、モーダルダイアログになります
本当に必要な場合は、[OK]ボタンが押されたときに発生するイベントを聞くことができます。
標準のシステム警告アイコンは、SystemIcons
フォームを使用してshowDialog()を呼び出す必要があります
そしてアイコンの使用のために
MessageBoxIcon.Warning
//通信なし
object sync = new object();
ManualResetEvent Wait = new ManualResetEvent();
//you should create a place holder named MessageData for Message Data.
List<MessageData> Messages = new List<MessageData>();
internal void ShowMessage(string Test, string Title, ....)
{
MessageData MSG = new MessageData(Test, Title);
Wait.Set();
lock(sync) Messages.Add(MSG);
}
// another thread should run here.
void Private_Show()
{
while(true)
{
while(Messsages.Count != 0)
{
MessageData md;
lock(sync)
{
md = List[0];
List.RemoveAt(0);
}
MessageBox.Show(md.Text, md.Title, md....);
}
Wait.WaitOne();
}
}
同時メッセージボックスには、より多くのスレッドとより多くのコード(書くのに十分な時間がありません)が必要です。
注:これにより、モーダルダイアログボックスが作成されますが、これは質問が求めているものではありません
これがサンプルコードです
if (MessageBox.Show("Description of the message", "Caption text", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.Yes)
{
// Do some stuff if yes pressed
}
else
{
// no pressed
}