2

アプリケーション内でライトボックス効果を作成しようとしています。これを実現するために、半透明のオーバーレイを表すパネルと、必要なすべてのコンテンツをホストする別のパネルを備えた UserControl を用意しました。

この UserControl を表示すると、2 ~ 3 回自分自身をレンダリングしようとすることが多く、背景がどんどん暗くなるように見えます。UserControl で次のことを考えました

protected override void OnPaint ( PaintEventArgs e )
{
    if ( Parent != null )
    {
        Parent.Refresh();
    }

    base.OnPaint( e );
} 

残念ながら、これは恐ろしいループ効果を引き起こし、親が itelf を再描画し、次に UserControl が itelf を再描画するように見えます... 非常に面倒です。これをどうにかして止める方法はありますか?おそらく、アプリケーションからプリントスクリーン画像を取得し、それをユーザーコントロールにオーバーレイを表示して表示しますか?

編集

この質問に気づきましたが、作成するすべてのライトボックスに対して新しいフォームを作成する必要がないことを願っています!

4

2 に答える 2

0

経験則として、.Invalidate()は.Refresh()よりもはるかに優れていることがよくあります。これは、.Refresh()によって即座に再描画が行われるため、2回呼び出すと、2回の再描画が行われるためです。ただし、ここではあまり役に立たないと思います。

于 2009-02-10T19:31:57.400 に答える
0

この動作は、onPaint 関数内で UserControl の Region を更新していたためのようです。

protected override void OnPaint ( PaintEventArgs e )
{
    // Update Region here

    base.OnPaint( e );
}

これにより、コントロールがそれ自体を無効化し、それ自体を再描画して、私が使用したこれを克服したようです:

Graphics g = e.Graphics;
g.SetClip( Region, CombineMode.Intersect );

これを使用して、コンテンツ自体をペイントできるようにしながら、不透明なライトボックス効果をペイントできます。

于 2009-02-11T09:57:27.213 に答える