为什么重写OnPaint()没有明显的效果?

时间:2014-09-27 08:46:39

标签: c# winforms

protected override void OnPaint(PaintEventArgs e)
{
    // Nothing here...
}

我写了一个继承System.Windows.Forms.Form的类。我重写了方法OnPaint并且没有做任何事情,如上所示。当我运行代码时,我希望屏幕上看不到任何内容,但窗口像往常一样出现。

我确保没有画任何东西,但它看起来完全正常。为什么会这样?

2 个答案:

答案 0 :(得分:3)

你启用了用户绘画吗? 从构造函数中调用它,看看会发生什么

SetStyle(
    ControlStyles.AllPaintingInWmPaint
    | ControlStyles.UserPaint
    | ControlStyles.OptimizedDoubleBuffer
    | ControlStyles.ResizeRedraw, true);

答案 1 :(得分:3)

Form.OnPaint()方法已经完成了 no 绘画。所以你没有做任何改变,你唯一做的就是通过不调用base.OnPaint()来阻止Paint事件被触发。当然不是很有用。

您忘记了绘制的其他方法,即OnPaintBackground()方法。它绘制BackColor属性设置的窗口背景,如果您设置了BackgroundImage属性,则为图像。 OnPaint()和任何Paint事件处理程序都在其上绘制。闪烁的根本原因。

尝试引导您为何这样做:不,这不是实现透明度的正确方法。未上漆的窗口显示随机像素,无论在创建窗口之前是否存在于视频帧缓冲区中。哪个看起来像一样透明,但只是很短的时间。当用户调整大小或移动窗口时搞砸了。 Windows基本上是不透明的。正确的方法是使用TransparencyKey属性,它启用一个组合多个窗口像素的混音器。也是Opacity属性的工作方式。