在System.Windows.Forms.RichTextBox中禁用绘制VScrollbar

我有一个从RichTextBoxinheritance的自定义控件。 该控件具有“禁用”富文本编辑的function。 我通过在TextChanged事件期间将Rtf属性设置为text属性来实现此目的。

这是我的代码是这样的:

private bool lockTextChanged; void RichTextBox_TextChanged(object sender, EventArgs e) { // prevent StackOverflowException if (lockTextChanged) return; // remember current position int rtbstart = rtb.SelectionStart; int len = rtb.SelectionLength; // prevent painting rtb.SuspendLayout(); // set the text property to remove the entire formatting. lockTextChanged = true; rtb.Text = rtb.Text; rtb.Select(rtbstart, len); lockTextChanged = false; rtb.ResumeLayout(true); } 

这很好。 然而,在一个像200行的大文本中,控件抖动(你看到了第一行的文字)。

为了防止发生这种情况,我过滤了SuspendLayout()和ResumeLayout()之间的WM_PAINT

  private bool layoutSuspended; public new void SuspendLayout() { layoutSuspended = true; base.SuspendLayout(); } public new void ResumeLayout() { layoutSuspended = false; base.ResumeLayout(); } public new void ResumeLayout(bool performLayout) { layoutSuspended = false; base.ResumeLayout(performLayout); } private const int WM_PAINT = 0x000F; protected override void WndProc(ref System.Windows.Forms.Message m) { if (!(m.Msg == WM_PAINT && layoutSuspended)) base.WndProc(ref m); } 

这个技巧,RichTextBox不会抖动anymoe。
这就是我想要的,除了一件事情:
每当我input文本到我的控制滚动条仍然抖动。

现在我的问题:有没有人有我的线索如何防止在挂起/恢复布局过程中重新绘制滚动条?

SuspendLayout()不会产生效果,RTB中没有需要安排的子控件。 RTB缺少大多数控件所具有的Begin / EndUpdate()方法,虽然它支持它。 它暂停绘画,虽然我不确定它暂停滚动条的更新。 添加如下:

 public void BeginUpdate() { SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); } public void EndUpdate() { SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); } // P/invoke declarations private const int WM_SETREDRAW = 0xb; [System.Runtime.InteropServices.DllImport("user32.dll")] private extern static IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 

防止用户编辑文本的更好方法是将ReadOnly属性设置为True。 通过覆盖CreateParams也可以完全移除滚动条。