我试图创造一些皮肤的形式(只是边框和标题)使用不同的方法比大家平时看到的,但我有与形式闪烁的一些问题,同时我调整的形式。

我不知道该怎么解释这个问题,所以这里是我创建演示该问题的视频: http://www.screencast.com/t/AIqK9Szmz

此外,这里是与重画形式边界整个代码VS2008测试溶液: HTTP: //stuff.nazgulled.net/misc/TestForm.zip

希望有人能帮助我摆脱闪烁...

有帮助吗?

解决方案

(这是一个特定的Vista的溶液;启用桌面合成时它仅适用)

它看起来像Windows被转移到新的领域在形式的原始边界像素复制初始化的调整大小的表格内容。在你的情况下,新的区域都初始化黑色可能是因为形式原本黑色像素在其边境。

要摆脱闪烁的,只是保持始终设置为TransparencyKey形式像素的最右边和最后一行 - 这将让新的区域透明,直到你得到一个机会,重新油漆一下。即,使窗体1像素比必要的更广泛和更高,和油漆的额外的像素是透明的。

例: TransparentForm.zip

其他提示

这就是我在基地窗体的构造函数中使用:

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

我认为主要是利用 “AllPaintingInWmPaint”。

如果你想使你的表格有一个不规则的形状,你将不得不转向地区(如果你能使用的几何形状,如圆形和矩形很容易地定义你的窗体的区域)。创建一个System.Drawing.Graphics.Region对象,并添加形状给它。我想在窗体上的属性称为区域 - 分配给它,你创建你的区域

您另一种选择是使用分层窗口。有人所做的一切都是为您的工作。分层的窗口不会在Windows版本超过2000年长工作,但他们拥有的是半透明的好处。

您最终的选择是使用WPF并设置AllowsTransparency =“真” WindowStyle =“无”。这将去除铬(谷歌“边框窗口WPF”为像一百万的例子)。

最后,如果你是勇敢和耐心,你可以随时捕捉你的窗口背后的桌面和任何事情之前绘制它。您将需要采取一些花哨的两轮牛车,如果你的窗口时:我真的不推荐这种方法 - 但你需要知道所有的选项

您将不得不放弃,如果你想避免丑陋的初始化黑视频覆盖闪烁使用Form.TransparencyKey财产。它不会做任何有用的东西在你的示例程序。

尝试使DoubleBuffering?

哦,顺便说一下,使用SLIMcode的代码,除非你把你所有的绘画逻辑覆写将无法正常工作的OnPaint()。如果这听起来并不熟悉你可能不知道,你可以强行表单上调用Invalidate()要求重绘。这是重构你的代码到一个单一的涂料方法的任务 - 但它会导致更干净的代码到底

要在缩放赢形式摆脱闪烁,暂停布局,同时调整。覆盖如下面的表格resizebegin / resizeend方法。

protected override void OnResizeBegin(EventArgs e) {
    SuspendLayout();
    base.OnResizeBegin(e);
}
protected override void OnResizeEnd(EventArgs e) {
    ResumeLayout();
    base.OnResizeEnd(e);
}

这将留下控件完整的(因为它们尺寸调整之前在那里),并强制一个重绘完成调整操作时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top