richtextbox的多步撤消(Undo、Redo)

2 篇文章 0 订阅
<p>
本人参考textbox的多重撤销和重做</p><p>完成了richtextbox的多步撤消</p>
 
using System;
  using System.Collections.Generic;
  using System.Windows.Forms;
  
  namespace System.Windows.Forms
   {
       /// <summary>
      /// 可以执行多步撤消操作的RichTextBox
      /// </summary>
      public partial class Richitextbox2 : Richitextbox
      {
          //Undo/Redo members
          private List<UndoRedoInfo> mUndoList = new List<UndoRedoInfo>();
          private Stack<UndoRedoInfo> mRedoStack = new Stack<UndoRedoInfo>();
          private bool mIsUndo = false;
          private UndoRedoInfo mLastInfo = new UndoRedoInfo("", 0);
          private int mMaxUndoRedoSteps = 50;
  
           /// <summary>
          /// The on text changed overrided.
          /// </summary>
          /// <param name="e"></param>
          protected override void OnTextChanged(EventArgs e)
           {
              base.OnTextChanged(e);
  
              if (!mIsUndo)
               {
                  mRedoStack.Clear();
                  mUndoList.Insert(0, mLastInfo);
                  this.LimitUndo();
                  mLastInfo = new UndoRedoInfo(Text, SelectionStart);
              }
              //Invalidate();
          }
  
           /// <summary>
          /// 设置和获取撤消操作允许的最大步数
         /// </summary>
          public int MaxUndoRedoSteps
           {
               set { mMaxUndoRedoSteps = value; }
               get { return mMaxUndoRedoSteps; }
          }
           /// <summary>
          /// 清空Undo、Redo操作信息
         /// </summary>
          public void ClearUndoAndRedo()
           {
              mUndoList.Clear();
              mRedoStack.Clear();
          }
           /// <summary>
          /// 判断是否可以进行Undo操作
         /// </summary>
          public new bool CanUndo
           {
               get { return mUndoList.Count > 0; }
          }
           /// <summary>
          /// 判断是否可以进行Redo操作
         /// </summary>
          public bool CanRedo
           {
               get { return mRedoStack.Count > 0; }
          }
           /// <summary>
          /// 撤消操作
         /// </summary>
          public new void Undo()
           {
              if (!CanUndo)
                  return;
              mIsUndo = true;
              mRedoStack.Push(new UndoRedoInfo(Text, SelectionStart));
              UndoRedoInfo info = (UndoRedoInfo)mUndoList[0];
              mUndoList.RemoveAt(0);
              Text = info.Text;
              SelectionStart = info.CursorLocation;
              ScrollToCaret();
              mLastInfo = info;
              mIsUndo = false;
          }
           /// <summary>
          /// 重复操作
         /// </summary>
          public void Redo()
           {
              if (!CanRedo)
                  return;
              mIsUndo = true;
              mUndoList.Insert(0, new UndoRedoInfo(Text, SelectionStart));
              LimitUndo();
              UndoRedoInfo info = (UndoRedoInfo)mRedoStack.Pop();
              Text = info.Text;
              SelectionStart = info.CursorLocation;
              ScrollToCaret();
              mIsUndo = false;
          }
          private void LimitUndo()
           {
              while (mUndoList.Count > mMaxUndoRedoSteps)
               {
                  mUndoList.RemoveAt(mMaxUndoRedoSteps);
              }
          }
  
          private class UndoRedoInfo
           {
              public UndoRedoInfo(string text, int cursorLoc)
               {
                  Text = text;
                  CursorLocation = cursorLoc;
              }
              public readonly int CursorLocation;
              public readonly string Text;
          }
      }
  }

 

在VB.NET中,可以使用RichTextBox控件的Undo方法来执行撤销操作。该方法会撤销最近的文本更改。以下是一个示例代码: ```vb.net RichTextBox1.Undo() ``` 另外,你还可以使用SendMessage函数来发送EM_UNDO消息给RichTextBox控件,以执行撤销操作。EM_UNDO消息的值为199。以下是一个示例代码: ```vb.net SendMessage(RichTextBox1.Handle, 199, 0, 0) ``` 请注意,以上代码中的RichTextBox1是指你的RichTextBox控件的名称。你需要将其替换为你实际使用的控件名称。引用\[1\]提供了获取当前被选中文本位置的方法,但在撤销操作中并不需要使用该方法。引用\[2\]提供了一个ReadP函数的示例,但在撤销操作中也不需要使用该函数。引用\[3\]提供了一个SendMessage函数的声明,用于发送消息给窗口。 #### 引用[.reference_title] - *1* *3* [VB取得TextBox、RichTextBox光标所在的行和列(支持汉字)](https://blog.csdn.net/miaozk2006/article/details/82422138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [VB实现TextBox撤销功能[后退-前进]](https://blog.csdn.net/ty5858/article/details/124365370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值