如何防止TextBox闪烁?

时间:2013-12-18 13:29:00

标签: c# winforms textbox flicker doublebuffered

到目前为止,我试图阻止TextBox闪烁但没有成功 TextBox是多行只读。

此代码每秒运行几次。该文本大约有10k个字符。

int ss = txt.SelectionStart;
int sl = txt.SelectionLength;
txt.Text = s;
txt.SelectionStart = ss;
txt.SelectionLength = sl;

解决问题给了我以下可能的解决方案
- 但他们都没有工作。

1)LockWindowUpdate

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool LockWindowUpdate(IntPtr hWndLock);

//...

LockWindowUpdate(txt.Handle);
txt.Text = someText;
LockWindowUpdate(IntPtr.Zero);

2)SetStyle

this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

3)SuspendLayout / ResumeLayout(猜测它与油漆无关 - 只是一试)

txt.SuspendLayout();
txt.Text = s;
txt.ResumeLayout();

2 个答案:

答案 0 :(得分:0)

事实证明,父表单的CreateParams必须使用WS_EX_COMPOSITED标记:

    protected override CreateParams CreateParams {
        get {
            new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand();
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;   // WS_EX_COMPOSITED
            return cp;
        }
    }

答案 1 :(得分:0)

****这是一种完美的方法。**有一个本地Win32控件支持IP地址的处理

 public class IPTextBox : TextBox
    {
        public IPTextBox() : base()
        {

        }

        protected override CreateParams CreateParams
        {
            get
            {
                new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand();
                CreateParams cp = base.CreateParams;
                cp.ClassName = "SysIPAddress32";
                return cp;
            }
        }


    }