Как предотвратить мерцание 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;
}
}
}