質問

Modeless MessageBoxを作成するにはどうすればよいでしょうか?独自のWindowsフォームクラスを作成して使用する必要がありますか?もしそうなら、警告アイコンを(自分のイメージを挿入するのではなく)、テキストボリュームに基づいてサイズを変更する簡単な方法がありますか?

役に立ちましたか?

解決

フォームを作成して使用する必要があります Show() モットレス表示します。 MessageBox.Show(...) Ghibozの例に見られるように、動作しました。 「メッセージの説明」は、ユーザーがボタンを押すまで表示されます。

MessageBox.Show(...) メッセージボックスが閉じられるとすぐに結果が得られます。モードレスメッセージボックスを使用すると、ユーザーが最終的にメッセージボックスで何かを選択したときに反応するイベントなどのメカニズムが必要です。

他のヒント

コードがバックグラウンドで実行され続けている間に自分自身を表示するだけのメッセージボックスが必要な場合(ボックスはまだモーダルであり、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.

コードを書く以外に、コンストラクターで次のようにする小さなフォームを作成できます

  • 表示するメッセージとしてパラメーター文字列を使用します
  • この文字列でフォームのラベルを埋めます
  • 次のいずれかのいずれかのいずれかのアイコンをロードします(コンストラクターに列挙で渡します)
    • 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

// commnetなし

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
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top