2

我正在尝试在我的应用程序中创建灯箱效果。为了实现这一点,我有一个用户控件,它带有一个代表半透明覆盖的面板和一个单独的面板,其中包含所有必要的内容。

当我展示这个 UserControl 时,它经常尝试渲染自己 2-3 次,导致背景看起来越来越暗。我想过在 UserControl 中执行以下操作

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

    base.OnPaint( e );
} 

不幸的是,这似乎会导致可怕的循环效果,即 Parent red-raws itelf 然后 teh UserControl 重绘 itelf ......非常混乱。有没有办法以某种方式阻止这种情况?可能通过从应用程序中获取打印屏幕图像,在用户控件中显示该图像,并在顶部覆盖?

编辑

我注意到了这个问题,尽管我希望我不需要为我创建的每个灯箱创建一个新表单!

4

2 回答 2

0

根据经验,.Invalidate() 通常比 .Refresh() 好得多,因为 .Refresh() 会导致立即重绘,因此如果您调用它两次,则会进行两次重绘。不过,我认为这对您没有多大帮助。

于 2009-02-10T19:31:57.400 回答
0

这种行为似乎是因为我在 onPaint 函数中更新了 UserControl 的区域,例如

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 回答