のRichTextBox
中にパネルがありWinForm
ます。RichTextBox
の垂直スクロール バーを非表示にして、そのスクロールをコンテナー パネルの垂直スクロール バーと同期させたい。パネルのスクロールバーにテキストがオーバーフローするたびtextbox
に表示され、パネルのスクロールバーをスクロールするたびにスクロールするtextbox
必要があります。これを達成する方法は?
2 に答える
コメントで述べたように、win32 メッセージを処理し、いくつかのハックを使用する必要があります。winforms
このデモを作成するために、win32 メッセージとコントロール ハック/カスタマイズに関するすべての知識を使用しました。これは完全ではなく、もちろん の標準的なスクロールバーほど完璧ではありませんRichTextBox
。欠点は、矢印キーを押し続けるとスクロールバーのつまみが右に移動しないことですが、矢印キーを通常どおり押すと、標準のスクロールバーのようにスクロールバーのつまみがキャレットをビューに移動します。コードを自分で試して、動作を確認できます。
public class Form1 : Form {
[DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);
public Form1(){
InitializeComponent();
//initialize some properties for your richTextBox1 (this should be added as a child of your panel1)
richTextBox1.ScrollBars = RichTextBoxScrollBars.Horizontal;
richTextBox1.BorderStyle = BorderStyle.None;
richTextBox1.Dock = DockStyle.Top;
richTextBox1.MinimumSize = new Size(panel1.Width, panel1.Height - 2);
//initialize some properties for your panel1
panel1.AutoScroll = true;
panel1.BorderStyle = BorderStyle.FixedSingle;
//If the size of panel1 is changed, we have to update the MinimumSize of richTextBox1.
panel1.SizeChanged += (s,e) => {
richTextBox1.MinimumSize = new Size(panel1.Width, panel1.Height - 2);
};
new NativeRichTextBox() { Parent = panel1 }.AssignHandle(richTextBox1.Handle);
hidden.Parent = panel1;
}
//hidden control of panel1 is used to scroll the thumb when the KeyUp of richTextBox1 is raised.
Control hidden = new Control();
//this is used to hook into the message loop of the richTextBox1
public class NativeRichTextBox : NativeWindow
{
public Panel Parent;
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x20a)//WM_MOUSEWHEEL = 0x20a
{
if (Parent != null)
{
SendMessage(Parent.Handle, m.Msg, m.WParam, m.LParam);
return;
}
}
base.WndProc(ref m);
}
}
//ContentsResized event handler of your richTextBox1
private void richTextBox1_ContentsResized(object sender, ContentsResizedEventArgs e)
{
richTextBox1.Height = e.NewRectangle.Height + 5;
}
//KeyUp event handler of your richTextBox1
private void richTextBox1_KeyUp(object sender, KeyEventArgs e)
{
Point p = richTextBox1.GetPositionFromCharIndex(richTextBox1.SelectionStart);
hidden.Top = panel1.PointToClient(richTextBox1.PointToScreen(p)).Y;
hidden.Height = (int) richTextBox1.SelectionFont.Height;
panel1.ScrollControlIntoView(hidden);
}
}
注:イベント ハンドラーを登録する必要があり、ContentsResized
コードを使用KeyUp
するrichTextBox1
か、デザイナーで使用する必要があります。
あなたができるスクロールバーを非表示にするために
richTextBox1.ScrollBars = RichTextBoxScrollBars.None;
しかし、それに関する問題は、テキストが歪むことです。だからあなたも必要です
richTextBox1.WordWrap = false;
それができたら、残りはそれほど簡単ではありません。
パネルのスクロールのイベントに登録し、リッチ テキスト ボックスのスクロールを変更します。問題は、 のスクロール オフセットを変更することはできないrichTextBox
ため、メソッドを使用しSelect
て必要な場所にジャンプできることです。線の長さを使用して、scrollBar
必要なサイズを知ることができます。
最後は大変な作業になります。幸運を