-6

在我的内部richtextbox有一个checkbox,当向下或向上滚动我的richtextbox 时,复选框不会滚动它。

CheckBox chk = new CheckBox();
chk.Name = "Chk" + i;
chk.Location = new Point(80,10+i);
chk.Text = "Save";
chk.Size = new System.Drawing.Size(20, 100);
richTextBox1.Controls.Add(chk);
i++;

你能告诉我如何解决它。

4

3 回答 3

2

ARichTextBox不能包含CheckBox对象。并且您已经为检查点的位置设置了静态点

chk.Location = new Point(80,10+i)

, 结束RichTextBox

于 2013-09-07T19:53:07.717 回答
1

您可以处理您的MouseWheelScroll事件RichTextBox并使用GetScrollPoswin32 函数获取您的滚动条的新位置RichTextBox,然后相应地更新您的位置CheckBox。请注意,当MouseWheelScrollBar 被提升时,ScrollBar 的位置不会立即更改为新的,它会从当前平滑地更改为新的。这就是为什么我们必须使用 aTimer来周期性地反复调用aGetScrollPos直到返回位置相同。由于滚动条移动的平滑度,我们得到的效果并不完美,但它接近平滑度并且比在事件处理程序中调用GetScrollPos一次权限要好得多。MouseWheel

然而,在这段代码中,我想使用NativeWindow挂钩到消息循环并获取发送到的消息RichTextBox,这是可以正常工作的代码,这段代码只是一个演示和处理Vertical scrolling唯一的。您可以找到有关WM_HSCROLLGetScrollPos处理的更多信息Horizontal scrolling(这很容易,因为它与 非常相似Vertical scrolling):

public partial class Form1 : Form
{
    [DllImport("user32")]
    private static extern int GetScrollPos(IntPtr hwnd, int nBar);
    public Form1()
    {
        InitializeComponent();
        chk.Text = ".NET pro";
        chk.Parent = richTextBox1;
        chk.Top = 100;//Notice the initial Top to update the position properly later.            
        nativeRichText.AssignHandle(richTextBox1.Handle);
        //Scroll event handler for the nativeRichText
        nativeRichText.Scroll += (s, e) =>
        {
            chk.Top = 100-e.Y;
        };
        //TextChanged event handler for the richTextBox1
        richTextBox1.TextChanged += (s, e) =>
        {
            chk.Top = 100-GetScrollPos(richTextBox1.Handle, 1);
        };            
    }
    CheckBox chk = new CheckBox();
    NativeRichTextBox nativeRichText = new NativeRichTextBox();        
    public class NativeRichTextBox : NativeWindow
    {
        Timer t = new Timer();
        int y = -1;
        public NativeRichTextBox()
        {
            t.Interval = 30;
            t.Tick += (s, e) =>
            {                                     
                int y2 = Form1.GetScrollPos(Handle, 1);//nBar =1 => Vertical bar
                if (y2 == y) { t.Stop(); return; }
                y = y2;
                if (Scroll != null) Scroll(this, new ScrollEventArgs(0, y));                    
            };
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x115)//WM_VSCROLL = 0x115
            {
                int wp = m.WParam.ToInt32();
                int low = wp & 0x00ff;
                if (low == 4 || low == 5)//SB_THUMBPOSITION = 4   SB_THUMBTRACK = 5
                {
                    if (Scroll != null) Scroll(this, new ScrollEventArgs(0, wp >> 16));
                }
                else t.Start();
            }
            if (m.Msg == 0x20a)//WM_MOUSEWHEEL = 0x20a
            {
                y = -1;
                t.Start();
            }
            base.WndProc(ref m);                
        }
        public class ScrollEventArgs : EventArgs
        {
            public int X { get; set; }
            public int Y { get; set; }
            public ScrollEventArgs(int x, int y)
            {
                X = x;
                Y = y;
            }
        }
        public delegate void ScrollEventHandler(object sender, ScrollEventArgs e);
        public event ScrollEventHandler Scroll;
    }
}
于 2013-09-08T09:20:50.677 回答
0

您很可能已经在组合框或下拉列表中看到了复选框。这是可能的。您可以尝试使用这样的第三方控件,或者编写自己的代码。这个话题已经在另一个关于 SO 的问题中讨论过,看看这里,所以我们不会在这个问题中重新讨论相同的话题。

相反,您使用代码获得的只是以图形方式将一个控件放在另一个控件上,但它们不会相互交互。它们是两个独立的控件。

于 2013-09-07T22:15:58.420 回答