2011-01-31 55 views
6

我用下面的代码调整我的自定义控件的自定义控件:如何调整我已经建立了

private void Form1_Resize_1(object sender, EventArgs e) 
{ 

    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.Top - 15); 

    canvas21.Invalidate(); 

} 

我只是想自定义控件的左上角(0,105)留在原地,并且随着形式调整控件的大小,但由于某种原因,这不起作用。当我调整控件的大小时,它会自动调整大小以填写表单的其余部分。

Overview of form layout

有没有什么办法让一个影响用户控件的大小一切的名单。为了搜索我设定的其他地方,我可能忽略了这些地方?

+1

您是否已经调查过`Dock`和`Anchor`属性?使用其中的一个或两个都比手动实现Resize事件中的调整大小逻辑要容易得多,就像我们以前需要做的那样。 – 2011-01-31 10:01:10

+0

@Cody - 我已经尝试了这两个,但我无法得到我想要的结果。看到我对ho1的回答。 – Bildsoe 2011-01-31 10:10:13

+0

很不清楚要问什么。代码片段肯定是错误的,它应该使用ClientSize并减去控件的Left和Top属性值。 – 2011-01-31 11:33:14

回答

6

如果希望控件始终使用表单调整大小,可以使用Anchor属性将其设置为锚定到表单的一个或多个面,以便不必拥有自己的调整大小代码(假设您获得的标准调整大小功能符合您的需求)。

您必须确保Dock属性未被设置,否则它可能会填充整个表单(或根据设置填写表单的一侧)。

2

如果可以设置,使用Anchor属性是最好的方法。要锁定的是

left, top, right, bottom (all!) 

锚使您控制x个单位形成您已锁定的一侧,以便它始终与侧面的距离相同。

如果这不是一个选项,或者只是为了让你的代码去,试试这个

private void Form1_Resize_1(object sender, EventArgs e) 
{ 
    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    int iTop = canvas21.Top; 
    int iLeft = canvas21.Left; 
    // - 200 - iTop keeps it 200 from the bottom, -iLeft keeps i stuck to right 
    canvas21.Size = new System.Drawing.Size(this.Width -iLeft, this.Height-200 -iTop); 
    canvas21.Left = iLeft; // move back 
    canvas21.Top = iTop; // move back 
    canvas21.Invalidate(); 
} 

为了保持15 pixels in the bottom,改变200上面15。或者,在设计时或通过代码将其设置为15,激活bottom锚点。

0

对于除自定义控件以外的其他控件,您是否可以正确调整其大小?例如,如果你把一个richtextbox并相应地设置锚(所有)它会调整适合你吗?如果确实如此,则必须存在财产以后腥您控制的大小,但你也许可以用这样欺骗这...

  1. 创建一个小组,是确切的尺寸和锚定,你会从你的控制喜欢。
  2. 将您的控件添加到面板并将Dock设置为“填充”。实际上,您将使用控件填充面板,并使用面板控制窗体上的大小。

当然,如果您的面板没有正确调整大小,那么这对您不起作用。当然,这可能是一个潜在的代码问题的解决方法,在完美的世界中,这个问题会在控制本身上得到重新解决。

0

我看调整的用户控件,并且我使用许多不同的事件来处理这个(如OnSizeChanged,OnFontChanged,OnTextChanged)

根据您的文本框如何适应你的控制将使有区别,但是如果您的主容器具有AutoScaleMode或AutoSize属性,那么您可能会发现您没有捕获所有相关事件。

因为我是新手,所以如果我是离谱的,我会事先通过appologise。

ps。我最初没有找到你的帖子,因为我一直在看标签Windows窗体设计器和自定义控件。我真的不知道我应该使用哪些标签,并且不能使用所有可能性,因为5的限制接管了!

4

确实没有理由为什么设置高度,然后锚定到每一侧(对接设置为无)不应该工作。

但是,我确实注意到您提供的代码的逻辑错误。您有:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.Top - 15); 

当实际上应该是:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.canvas21.Top - 15); 

你只是采取的形式的顶部,而不是canvas21的顶部,这是你所需要的。

这似乎正是你想要的,至少从我的角度来看。如果它不起作用,它是根本没有为你调整大小还是调整到错误的大小?

0

老兄,你要踢自己。你不需要ClientSize.Height - 顶部 - 15,你想ClientSize.Height - canvas21.Top - 15.就是这样!

private void Form1_Resize_1(object sender, EventArgs e) 
{ 
    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, 
     this.ClientSize.Height - canvas21.Top - 15); 

    canvas21.Invalidate(); 
} 
相关问题