DOBON.NET DOBON.NETプログラミング掲示板過去ログ

モードレスダイアログの子コントロールの部分が透明になって背景が透けてしまう?

環境/言語:[WindowsXP/C#.NET/.NET Framework 3.5 SP1]
分類:[.NET]

お世話になります。
メインフォームからモードレスダイアログを表示し、モードレスダイアログ中で
1(s)の待機を行い、その後、メインフォームからモードレスダイアログを閉じる
処理を行っているのですが、

モードレスダイアログ内の子コントロールの部分が透けてしまってバックが現れ
てしまう現象に悩まされています。

原因はモードレスダイアログ内で再描画が行われていないためと思われますが、
モードレスダイアログ中で子コントロールを描画するためにはInvalidate()等の
特別な処理を呼ぶ必要があるのでしょうか?

ご助言をよろしくお願いします。

public partial class Form1 : Form
{
    /////////////////////////////////
    // メインフォーム中の処理
    /////////////////////////////////
    private void btn_Clicked( object sender , EventArgs e )
    {
        ModelessForm mf = new ModelessForm();
        mf.TopLevel = true;
        mf.Owner = this;
        mf.Show();
        mf.Sleep1000(); // ←1(s)待機
        mf.Dispose();
    }
}


/////////////////////////////////
// モードレスダイアログ
/////////////////////////////////
public partial class ModelessForm : Form
{
    public ModelessForm()
    {
    }
    
    public void Sleep1000()
    {
        // 1(s)スリープ
        System.Threading.Thread.Sleep( 1000 );
    }
}
■No26278に返信(セニョモンさんの記事)
> System.Threading.Thread.Sleep( 1000 );
Form/Control を生成したスレッドからは、上記を呼び出さないで下さい。

Sleep してしまうと、その間、ウィンドウメッセージを処理できないため、
画面の再描画等が行われなくなってしまいます。
(BackgroundWorker など、ワーカースレッド内で Sleep する分には構いませんが)


モードレスフォームを 1 秒後に閉じたいという事であれば、
こういう方法は如何でしょうか。

// ModelessForm
public void Sleep1000()
{
  timer1.Interval = 1000;
  timer1.Tick += delegate { this.Close(); };
  timer1.Start();
}

// Form1
mf.Show();
mf.Sleep1000();
ご助言ありがとうございました。

■No26287に返信(魔界の仮面弁士さんの記事)
> ■No26278に返信(セニョモンさんの記事)
>>System.Threading.Thread.Sleep( 1000 );
> Form/Control を生成したスレッドからは、上記を呼び出さないで下さい。
>
> Sleep してしまうと、その間、ウィンドウメッセージを処理できないため、
> 画面の再描画等が行われなくなってしまいます。
> (BackgroundWorker など、ワーカースレッド内で Sleep する分には構いませんが)
>
>
> モードレスフォームを 1 秒後に閉じたいという事であれば、
> こういう方法は如何でしょうか。
>
> // ModelessForm
> public void Sleep1000()
> {
> timer1.Interval = 1000;
> timer1.Tick += delegate { this.Close(); };
> timer1.Start();
> }
>
> // Form1
> mf.Show();
> mf.Sleep1000();
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板