C#で、RichTextBoxのスクロール連携class

RichTextBoxなら縦スクロールの連携ができる方法がSendMessageを使わなくてはいけないにせよ、可能です。
連携させると、他のペアも、となっていきます。
そのとき、クラスにしておくとパパッとできるので便利です。
使い方は以下のようになります。


// RichTextBoxの縦スクロールを連動させる処理
private RowScroll_Renkei RSR_chA;
private RowScroll_Renkei RSR_chB;

関数の中で、以下の様にセットしてください。

RSR_chA = new RowScroll_Renkei(textBox2, textBox3);
RSR_chB = new RowScroll_Renkei(textBox1, textBox1_R);




以下が今回使用しているclassです。


/// <summary>
/// RichTextBoxの縦スクロールを連動させる処理
/// </summary>
class RowScroll_Renkei
{
// RichTextBoxの縦スクロールを連動させる処理
[DllImport("USER32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wp, out Point lp);
private const int EM_GETSCROLLPOS = 0x04DD;
private const int EM_SETSCROLLPOS = 0x04DE;

// スクロール量を同じにする処理
private bool is_InSameScrollEventing = false;
private List<string> RichTextBox_NAME_list = new List<string>();
private List<RichTextBox> RichTextBox_OBJ_list = new List<RichTextBox>();

public RowScroll_Renkei()
{
}
public RowScroll_Renkei(params RichTextBox[] in_RichTBs)
{
for (int i = 0; i < in_RichTBs.Length; i++)
{
RichTextBox tmp_RichTB = (RichTextBox)in_RichTBs[i];
Add_RichTextBox(tmp_RichTB);
}
}
public void Add_RichTextBox(RichTextBox in_RichTBs)
{
RichTextBox_OBJ_list.Add(in_RichTBs);
RichTextBox_NAME_list.Add(in_RichTBs.Name);
in_RichTBs.VScroll += Plus_Event_VScroll;
}

/// <summary>デコンストラク
/// とりあえず、イベントを1つずつ削除してみる。</summary>
~RowScroll_Renkei()
{
foreach(RichTextBox tmp_RichTB in RichTextBox_OBJ_list)
{
tmp_RichTB.VScroll -= Plus_Event_VScroll;
}
}

void Plus_Event_VScroll(object sender, EventArgs e)
{
if (is_InSameScrollEventing)
return;
is_InSameScrollEventing = true;


Func<string, int> get_obj_number = (in_t1) =>
{
for (int i = 0; i < RichTextBox_NAME_list.Count; i++)
{
if (RichTextBox_NAME_list[i] == in_t1)
{
return i;
}
}
return -1;
};

Point pt_new;
string tmp_sender_name = *1
continue;
if (i == tmp_sender_obj_number) // スクロールされた元のRichTextBoxのときは(多重処理で無限ループになってしまうので)何もしない
continue;
Point pt_moto;
SendMessage(((RichTextBox)RichTextBox_OBJ_list[i]).Handle, EM_GETSCROLLPOS, 0, out pt_moto);
pt_new = new Point(pt_moto.X, pt_new.Y);
SendMessage(((RichTextBox)RichTextBox_OBJ_list[i]).Handle, EM_SETSCROLLPOS, 0, out pt_new);
}

is_InSameScrollEventing = false;
}

}

*1:RichTextBox)sender).Name;
int tmp_sender_obj_number = get_obj_number(tmp_sender_name);

SendMessage(((RichTextBox)sender).Handle, EM_GETSCROLLPOS, 0, out pt_new);

for (int i = 0; i < RichTextBox_NAME_list.Count; i++)
{
if(sender.Equals(RichTextBox_OBJ_list[i]