Как предотвратить мерцание TextBox?

Я пытаюсь предотвратить мерцание TextBox, но пока безуспешно.
TextBox является многострочным только для чтения.

Этот код запускается несколько раз в секунду. Текст содержит около 10 тыс. Символов.

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 ответа

Решение

Оказывается, что 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;
        }
    }

**** Это идеальный способ.** есть собственный элемент управления 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;
            }
        }


    }
Другие вопросы по тегам