如何设置自定义控件的内容与滚动条同步拖动?

时间:2022-01-24 23:26:11
我自己写的一个自定义控件,我在上面画了好多矩形,已经超出了控件能显示的范围,我设置了控件的autoScroll属性为TRUE,但是超出范围后它并没有显示滚动条,只能显示一部分内容,有谁碰见我这个情况吗?怎么解决的?
如何设置自定义控件的内容与滚动条同步拖动?
如何设置自定义控件的内容与滚动条同步拖动?

12 个解决方案

#1


如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.

#2


引用 1 楼 zgke 的回复:
如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.

我试了后面你说的那个简单的方法,没有用,还是没有出现滚动条。
我刚开始也是想要自己添加滚动条,但是我不知道怎么来设定这个滚动条的事件,才能实现滚动同步的效果。

#3


引用 1 楼 zgke 的回复:
如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.

我附上我的代码:
 public partial class MyTable : UserControl
    {
public MyTable()
        {
             InitializeComponent();
        } 
public void DrawMyFrame(Point p)//画一个普通的矩形
        {
            
            Rectangle rect=new Rectangle(p.X,p.Y,MyFrame_Width,MyFrame_Hight);
            Pen pen = new Pen(My_FramColor);
            Brush brush = new SolidBrush(My_FillFrameColor);
            Graphics g=this.CreateGraphics();
            g.FillRectangle(brush, rect);
            g.DrawRectangle(pen, rect);
            //g.DrawString(theName, font, brush, rect, alignVertically);

            g.Dispose();
            
        }
        public void DrawHeadFrame(Point p )//画一个表头
        {
            Rectangle rect = new Rectangle(p.X, p.Y, MyFrame_Width, MyFrame_Hight);
            Graphics g = this.CreateGraphics();
            ControlPaint.DrawButton(g,rect,ButtonState.Normal);
            g.Dispose();
        }
        
        public void MyRows(int m, int n)//画初始化的格子,很容易超出显示范围
        {
            int i = 0;
            int k = 0;
            for (i = 0; i < m; i++)
            {
                if (i == 0)
                {
                    Point p = new Point();
                    p.Y = MyFrame_Hight * i;
                    for (k = 0; k < n; k++)
                    {
                        p.X = MyFrame_Width * k;
                        DrawHeadFrame(p);
                    }
                }
                else
                {
                    Point p = new Point();
                    p.Y = MyFrame_Hight * i;
                    for (k = 0; k < n; k++)
                    {
                        p.X = MyFrame_Width * k;
                        DrawMyFrame(p);
                    }
                }

            }
        }
 protected override void OnPaint(PaintEventArgs e)
        {
            MyRows(rowsNum, colsNum);
             Label label1 = new Label();//这是用你说的那种方法,可是无效……
            label1.Width = 0;
            label1.Height = 0;
  
          base.OnPaint(e);

        }
}

#4


label1.Location没指定,指定了应该可以的,你上面的代码实例出来label1.Location的位置应该是0,0,当然没有效果啦~

#5


要自己加的。
HScrollBar
VScrollBar

#6


引用 5 楼 mjp1234airen4385 的回复:
要自己加的。
HScrollBar
VScrollBar

我试过,可是我不会绑定两者与我控件内容的代码,你写过吗,给我贴上来行吗,谢谢!

#7


引用 4 楼 beargo 的回复:
label1.Location没指定,指定了应该可以的,你上面的代码实例出来label1.Location的位置应该是0,0,当然没有效果啦~

我按你的方法改了一下,滚动条果然是出来了,不过又出了一个问题就是:滚动条永远都滚不到头!
我把代码修改的部分贴出来:
  protected override void OnPaint(PaintEventArgs e)
        {
            MyRows(rowsNum, colsNum);
            Label label1 = new Label();
            int lblx = colsNum * MyFrame_Width;//label的横坐标位置
            int lbly = rowsNum * MyFrame_Hight;//label的纵坐标位置

            label1.Location = new Point(lblx, lbly);
            label1.Name = "lbl1";
            label1.Size = new Size(10,10);
            label1.Text = "end";
            this.Controls.Add(label1);
            base.OnPaint(e);

        }
效果图如下:滚动条永远都滚不都头,我觉得是行列数在不断地增加: 如何设置自定义控件的内容与滚动条同步拖动?

#8


我觉得加Label的方法不是很合理,为什么不事先根据行列数计算出总的宽和高?重写一下窗体的DisplayRectangle?我记得只要DispalyRectangle足够大就可以出现滚动条呀?

#9


引用 1 楼 zgke 的回复:
如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.

这个方法怎么最后出来的效果是格子是永远都不动的,只有label在随着拖动不断地增加……

#10


超出范围还是没有滚动条的原因是,windows不知道它需要滚动条,首先要确定文档区域的大小:
            this.AutoScrollMinSize = new System.Drawing.Size(1000, 2000);
现在还不算完,还要转换一下坐标:
Graphics g=this.CreateGraphics();
            Size scrolloffset = new Size(this.AutoScrollPosition);

            Size rectSize = new Size(MyFrame_Width, MyFrame_Hight);
            Pen pen = new Pen(My_FramColor);
            Brush brush = new SolidBrush(My_FillFrameColor);
            Rectangle rect = new Rectangle(p + scrolloffset, rectSize);
            g.FillRectangle(brush,rect);
            g.DrawRectangle(pen, rect);
这个时候,滚动条的设置才算完整。

#11


引用 10 楼 srm123 的回复:

对了,成功了,滚动条出来了,可是有个问题是我的表格是动态生成的,怎么获取他的宽度和高度,赋给minscrollSize?

#12


我目前也遇到同样的问题还没弄出来 等待解答方法!

#1


如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.

#2


引用 1 楼 zgke 的回复:
如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.

我试了后面你说的那个简单的方法,没有用,还是没有出现滚动条。
我刚开始也是想要自己添加滚动条,但是我不知道怎么来设定这个滚动条的事件,才能实现滚动同步的效果。

#3


引用 1 楼 zgke 的回复:
如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.

我附上我的代码:
 public partial class MyTable : UserControl
    {
public MyTable()
        {
             InitializeComponent();
        } 
public void DrawMyFrame(Point p)//画一个普通的矩形
        {
            
            Rectangle rect=new Rectangle(p.X,p.Y,MyFrame_Width,MyFrame_Hight);
            Pen pen = new Pen(My_FramColor);
            Brush brush = new SolidBrush(My_FillFrameColor);
            Graphics g=this.CreateGraphics();
            g.FillRectangle(brush, rect);
            g.DrawRectangle(pen, rect);
            //g.DrawString(theName, font, brush, rect, alignVertically);

            g.Dispose();
            
        }
        public void DrawHeadFrame(Point p )//画一个表头
        {
            Rectangle rect = new Rectangle(p.X, p.Y, MyFrame_Width, MyFrame_Hight);
            Graphics g = this.CreateGraphics();
            ControlPaint.DrawButton(g,rect,ButtonState.Normal);
            g.Dispose();
        }
        
        public void MyRows(int m, int n)//画初始化的格子,很容易超出显示范围
        {
            int i = 0;
            int k = 0;
            for (i = 0; i < m; i++)
            {
                if (i == 0)
                {
                    Point p = new Point();
                    p.Y = MyFrame_Hight * i;
                    for (k = 0; k < n; k++)
                    {
                        p.X = MyFrame_Width * k;
                        DrawHeadFrame(p);
                    }
                }
                else
                {
                    Point p = new Point();
                    p.Y = MyFrame_Hight * i;
                    for (k = 0; k < n; k++)
                    {
                        p.X = MyFrame_Width * k;
                        DrawMyFrame(p);
                    }
                }

            }
        }
 protected override void OnPaint(PaintEventArgs e)
        {
            MyRows(rowsNum, colsNum);
             Label label1 = new Label();//这是用你说的那种方法,可是无效……
            label1.Width = 0;
            label1.Height = 0;
  
          base.OnPaint(e);

        }
}

#4


label1.Location没指定,指定了应该可以的,你上面的代码实例出来label1.Location的位置应该是0,0,当然没有效果啦~

#5


要自己加的。
HScrollBar
VScrollBar

#6


引用 5 楼 mjp1234airen4385 的回复:
要自己加的。
HScrollBar
VScrollBar

我试过,可是我不会绑定两者与我控件内容的代码,你写过吗,给我贴上来行吗,谢谢!

#7


引用 4 楼 beargo 的回复:
label1.Location没指定,指定了应该可以的,你上面的代码实例出来label1.Location的位置应该是0,0,当然没有效果啦~

我按你的方法改了一下,滚动条果然是出来了,不过又出了一个问题就是:滚动条永远都滚不到头!
我把代码修改的部分贴出来:
  protected override void OnPaint(PaintEventArgs e)
        {
            MyRows(rowsNum, colsNum);
            Label label1 = new Label();
            int lblx = colsNum * MyFrame_Width;//label的横坐标位置
            int lbly = rowsNum * MyFrame_Hight;//label的纵坐标位置

            label1.Location = new Point(lblx, lbly);
            label1.Name = "lbl1";
            label1.Size = new Size(10,10);
            label1.Text = "end";
            this.Controls.Add(label1);
            base.OnPaint(e);

        }
效果图如下:滚动条永远都滚不都头,我觉得是行列数在不断地增加: 如何设置自定义控件的内容与滚动条同步拖动?

#8


我觉得加Label的方法不是很合理,为什么不事先根据行列数计算出总的宽和高?重写一下窗体的DisplayRectangle?我记得只要DispalyRectangle足够大就可以出现滚动条呀?

#9


引用 1 楼 zgke 的回复:
如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.

这个方法怎么最后出来的效果是格子是永远都不动的,只有label在随着拖动不断地增加……

#10


超出范围还是没有滚动条的原因是,windows不知道它需要滚动条,首先要确定文档区域的大小:
            this.AutoScrollMinSize = new System.Drawing.Size(1000, 2000);
现在还不算完,还要转换一下坐标:
Graphics g=this.CreateGraphics();
            Size scrolloffset = new Size(this.AutoScrollPosition);

            Size rectSize = new Size(MyFrame_Width, MyFrame_Hight);
            Pen pen = new Pen(My_FramColor);
            Brush brush = new SolidBrush(My_FillFrameColor);
            Rectangle rect = new Rectangle(p + scrolloffset, rectSize);
            g.FillRectangle(brush,rect);
            g.DrawRectangle(pen, rect);
这个时候,滚动条的设置才算完整。

#11


引用 10 楼 srm123 的回复:

对了,成功了,滚动条出来了,可是有个问题是我的表格是动态生成的,怎么获取他的宽度和高度,赋给minscrollSize?

#12


我目前也遇到同样的问题还没弄出来 等待解答方法!