我有一个有背景的Windows窗体应用程序,在其中有一个透明背景的flowlayoutpanel。当我滚动时,会出现以下情况:
同时我还看到一些闪烁。我尝试了所有双缓冲业务,但都没用。
有什么建议吗?
我有一个有背景的Windows窗体应用程序,在其中有一个透明背景的flowlayoutpanel。当我滚动时,会出现以下情况:
同时我还看到一些闪烁。我尝试了所有双缓冲业务,但都没用。
有什么建议吗?
这是对我有效的方法。
public class CustomFlowLayoutPanel : FlowLayoutPanel
{
public CustomFlowLayoutPanel()
: base()
{
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
}
protected override void OnScroll(ScrollEventArgs se)
{
this.Invalidate();
base.OnScroll(se);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // WS_CLIPCHILDREN
return cp;
}
}
}
是的,那样行不通。这里提供一个类可以稍微改进一下:
using System;
using System.Windows.Forms;
class MyFlowLayoutPanel : FlowLayoutPanel {
public MyFlowLayoutPanel() {
this.DoubleBuffered = true;
}
protected override void OnScroll(ScrollEventArgs se) {
this.Invalidate();
base.OnScroll(se);
}
}
将其编译并从工具箱顶部拖到表单上。然而,它无法解决根本问题,“拖动时显示窗口内容”选项。这是系统选项,将在以后的Windows版本中打开。当它打开时,Windows本身滚动面板的内容,然后要求应用程序绘制由滚动揭示的部分。OnScroll方法覆盖了该操作,确保重新绘制整个窗口以保持背景图像不变。最终结果看起来不太美观,你会看到图像在滚动时“跳跃”或“弹跳”。
唯一的解决办法是关闭系统选项。这不是一个实际的解决办法,用户喜欢这个选项,它会影响每个程序,而不仅仅是你的程序。如果你不能忍受这种“跳跃”效果,那么你就必须放弃透明度。
我在FlowPanel的滚动事件中添加了Application.DoEvents(),这样就可以避免FlowPanel子控件模糊的问题。
尝试使用扩展窗口样式
class MyFlowLayoutPanel : FlowLayoutPanel
{
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ExStyle |=0x2000000 | 0x02000000;
return cp;
}
}
public MyFlowLayoutPanel()
{
this.DoubleBuffered = true;
}
protected override void OnScroll(ScrollEventArgs se)
{
this.Invalidate();
base.OnScroll(se);
}
}
CreateParams
实际上是做什么的吗?你是怎么找到它的?是自己发现的吗? - Mike de Klerk