【问题标题】:How to clear graphics on a transparent control in windows forms如何在 Windows 窗体中清除透明控件上的图形
【发布时间】:2009-10-22 18:12:22
【问题描述】:

所以,我对 Windows 窗体开发非常陌生。

我正在尝试创建一个“嘿,我正忙着做事”的组件,它只是旋转一个形状。我希望这个控件是瞬态的,并在任何其他控件之上绘制。该类直接继承自 Control。

所以我在构造函数中有这个:

SetStyle(ControlStyles.Opaque, true);

还有这个:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams parms = base.CreateParams;
        parms.ExStyle |= 0x20; 
        return parms;
    }
}

这让我得到了一个可以在其他控件之上绘制的控件。

现在我的问题是这个。我每秒重绘几次控件,以呈现平滑动画的外观。但是,我不知道如何清除前一帧中绘制的内容。在OnPaint 中使用e.Graphics.Clear(Color.Transparent) 会使整个控件变黑。

有没有办法只清除控件的绘制内容?

我注意到调整控件大小会清除背景。

行不通的事情

  1. 重写 OnPaintBackground 以不执行任何操作。或者只是调用 base.OnPaintBackground。结果相同。

【问题讨论】:

    标签: c# .net winforms gdi+ transparent


    【解决方案1】:

    好的,我在这里找到了解决方案: https://web.archive.org/web/20141227200000/http://bobpowell.net/transcontrols.aspx

    实际上必须使父控件无效才能保留透明背景。

    【讨论】:

    • 你不必使整个父控件失效,只需使用户控件对应的区域失效:this.Parent.Invalidate(this.ClientRectangle, true);
    • @Eric:感谢您的提示。我想我可能就是这么做的!
    • 这将无法正常工作,除非用户控件位于位置 (0,0)。您必须使用户控件覆盖的父区域无效并使用父坐标。另外,如果用户控件有一个透明的非客户区,这个区域也不会失效。我会去this.Parent.Invalidate(new Rectangle(this.Location, this.Size), true);
    • 很抱歉重新打开此面板,但如何将此面板从透明更改为不透明并返回?我试过只使用 alpha 值进行绘画,但这不起作用。
    【解决方案2】:

    您可能需要覆盖本文介绍的 OnPaintBackground:http://saftsack.fs.uni-bayreuth.de/~dun3/archives/creating-a-transparent-panel-in-net/108.html

    当需要清除控件以强制调用 OnPaintBackground 时,您可能还需要使控件无效。

    【讨论】:

    • 这并不能解决问题。而且我之前使控件无效。不过还是谢谢。
    • 但我确实在该页面的 cmets 中找到了真正解决方案的链接,所以 +1,谢谢。
    • 不是每个控件都可以覆盖onpaintbackground,比如工具提示
    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多