到目前为止,我试图阻止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();
答案 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;
}
}
}