首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在winform C#中滚动时出现闪烁和混乱的flowLayoutPanel项目

在winform C#中滚动时出现闪烁和混乱的flowLayoutPanel项目
EN

Stack Overflow用户
提问于 2020-01-20 01:29:42
回答 1查看 156关注 0票数 0

我有一个flowLayoutPanel,里面有一些东西..这些项目是我创建的自定义UserControl。当我移动的时候,这些东西会闪烁。

因此,我创建了Custom FLP并将以下代码放入其构造函数中:

代码语言:javascript
运行
复制
this.SetStyle(
        ControlStyles.AllPaintingInWmPaint |
        ControlStyles.UserPaint |
        ControlStyles.DoubleBuffer, true);

但它仍然在闪烁..然后我找到了这段代码,并添加了它:

代码语言:javascript
运行
复制
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;
            return cp;
        }
    }

闪烁问题解决了..但是这段代码会在滚动面板中导致一些性能问题。它变得很慢,并且有糟糕的用户体验:(

任何人都可以帮助解决这个问题??

EN

回答 1

Stack Overflow用户

发布于 2020-03-31 17:13:47

您也可以尝试此样式:

代码语言:javascript
运行
复制
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

如果这还不够,您可以使用以下方法手动停止和恢复窗体或控件绘图:

代码语言:javascript
运行
复制
[DllImport("user32.dll", EntryPoint = "SendMessageA", ExactSpelling = true, CharSet = 
CharSet.Ansi, SetLastError = true)]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

private const int WM_SETREDRAW = 0xB;

public static void SuspendDrawing(Control target)
{
    if (target != null && !target.IsDisposed)
        SendMessage(target.Handle, WM_SETREDRAW, 0, 0);
}

public static void ResumeDrawing(Control target, bool redraw)
{
    if (target != null && !target.IsDisposed)
    {
        SendMessage(target.Handle, WM_SETREDRAW, 1, 0);

        if (redraw)
            target.Refresh();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59812586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档