12 个解决方案
#1
如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.
#2
我试了后面你说的那个简单的方法,没有用,还是没有出现滚动条。
我刚开始也是想要自己添加滚动条,但是我不知道怎么来设定这个滚动条的事件,才能实现滚动同步的效果。
#3
我附上我的代码:
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
HScrollBar
VScrollBar
#6
我试过,可是我不会绑定两者与我控件内容的代码,你写过吗,给我贴上来行吗,谢谢!
#7
我按你的方法改了一下,滚动条果然是出来了,不过又出了一个问题就是:滚动条永远都滚不到头!
我把代码修改的部分贴出来:
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
这个方法怎么最后出来的效果是格子是永远都不动的,只有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);
这个时候,滚动条的设置才算完整。
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
对了,成功了,滚动条出来了,可是有个问题是我的表格是动态生成的,怎么获取他的宽度和高度,赋给minscrollSize?
#12
我目前也遇到同样的问题还没弄出来 等待解答方法!
#1
如果矩形是GDI+自己绘制的 那你必须自己定义一个滚动条来决定大小..
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.
另一个简单的办法..在绘制的最下边添加一个Label控件.设置大小为0,0
然后设置AutoScrool为true就可以了.
#2
我试了后面你说的那个简单的方法,没有用,还是没有出现滚动条。
我刚开始也是想要自己添加滚动条,但是我不知道怎么来设定这个滚动条的事件,才能实现滚动同步的效果。
#3
我附上我的代码:
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
HScrollBar
VScrollBar
#6
我试过,可是我不会绑定两者与我控件内容的代码,你写过吗,给我贴上来行吗,谢谢!
#7
我按你的方法改了一下,滚动条果然是出来了,不过又出了一个问题就是:滚动条永远都滚不到头!
我把代码修改的部分贴出来:
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
这个方法怎么最后出来的效果是格子是永远都不动的,只有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);
这个时候,滚动条的设置才算完整。
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
对了,成功了,滚动条出来了,可是有个问题是我的表格是动态生成的,怎么获取他的宽度和高度,赋给minscrollSize?
#12
我目前也遇到同样的问题还没弄出来 等待解答方法!