2014-01-19 139 views
9

我发现孩子的控制不是在他们父母的边界之外绘制的。所以如果我有一个突出于面板右侧的按钮,它会在面板结束部分的一半处画出。C#控件是否超出了父级边界?

2个问题:

  • 有父母的边界外的子控件任何方式(有一些诀窍也许)?
  • 该限制的原因是什么? (我想明白)


,2个按钮:B1是大父母,B2较小的孩子:

public Form1() 
{ 
    Size = new Size(800, 600); 

    Button b1 = new Button(); 
    b1.Text = "hello world"; 
    b1.SetBounds(0,0,256,128); 
    Controls.Add(b1); 

    Button b2 = new Button(); 
    b2.Text = "abcdefghijklmnopqrstuvwxyz"; 
    b2.SetBounds(192,32,128,64); 
    b1.Controls.Add(b2); 
} 

编辑:
这是关于控制内控件 不控制内部形式
不,没有花哨的用户界面。我知道我可以使用地区创建疯狂的桌面应用程序。这不是我想要的。

谢谢!

+1

我很好奇:你为什么想这样做? – xxbbcc

回答

4

A Form也是一个控件,所以它的行为与其他控件非常相似。

渲染限制来自于这样一个事实,即控件是操作系统中的窗口,它仅表示显示的矩形区域。一个窗口不能绘制任何超出其边界的任何东西,所以如果一个子控件放置在这些边界之外,它将不会被渲染(或仅部分取决于其位置)。

有没有简单的方法解决这个问题,子控件的整个概念都是围绕控制绘制内容的父项进行的。如果你想绘制一个子控件在其父项的边界之外,从父项中移除“子项”,因为这种关系并不适用。

你可以想出一些可以解决这个问题的自定义渲染代码,但是控件不会是其他容器的真实子代,你必须编写相当数量的渲染代码才能使它工作。在某些情况下,这可能是期望的行为,但在大多数情况下,默认系统行为更好(对于程序员来说意味着更少的工作)。

通过自定义渲染窗体(即将其绘制得比实际小),然后在空白处渲染按钮,您可以获得窗体“外部”的按钮的视觉效果。然而,这是很多工作,我不确定你想要走这条路。

如果您尝试制作一些花哨的UI,其中一些控件的形状类似于blob(不像矩形),或者它们显示为浮动(与“主”UI分离),类似于某些媒体播放器等。 :那些程序完成整个自定义渲染的事情;他们的窗口仍然是矩形窗口,但在渲染过程中,他们使用透明图像和区域来渲染窗体。

如果您在问题中添加了更多细节,那么为什么要这样做呢?

+0

我只是在一个非常复杂的功能控件上工作,我需要将它分成几个子控件以简化开发。你认为为我的“父母”设立一个大家长会是一件好事吗?这是孩子们导致一个新的大家长和我现在作为兄弟姐妹的所有控制权?并没有到花哨的UI部分^^ – n4pgamer

+0

@ n4pgamer对不起,我不太明白,但让我试着回答。如果您制作的是复杂的自定义控件,那么是的,将较小的块分割为其他自定义控件,然后将其作为子项包含在主自定义控件中。如果您添加更多关于控件结构的详细信息,我会尝试添加更多答案。 – xxbbcc

0

在WinForms中,不可能在控件边界之外绘制。

将按钮限制在面板内部的最简单方法是适当地使用Anchor属性。通常按钮是对齐的。如果要在面板调整大小时保持此对齐方式,请将按钮停靠在右侧。如果按钮在底部,则将其固定到底部,否则将其固定在顶部。

如果您希望按钮使用面板宽度调整大小,那么将它同时停靠在左侧和右侧,另外还要停靠在顶部或底部。

enter image description here
图片在这里找到:Getting Started with Windows Forms: Anchor the Buttons to the Bottom Right

2

你不能在控件/父母边界之外绘制。但是,您可以将控件放置在父母的祖先之一中。

这是一些代码,我用它来创建一个下拉菜单时,该自定义控制切换:

private void Me_ToggledChanged(System.Object sender, System.EventArgs e) 
{ 

    if (this.Parent != null) { 


     Control topParent = this; 
     int x = 0; 
     int y = 0; 

     while (topParent.Parent != null) { 
      x += topParent.Left; 
      y += topParent.Top; 
      topParent = topParent.Parent; 
     } 

     if (this.Toggled) { 
      if (!topParent.Controls.Contains(dropDownMenu)) { 
       topParent.Controls.Add(dropDownMenu); 
      } 

      dropDownMenu.Location = new Point(x, y);   
      dropDownMenu.Visible = true; 
      dropDownMenu.BringToFront(); 
     } else { 
      if (topParent.Controls.Contains(dropDownMenu)) { 
       this.Parent.Controls.Remove(dropDownMenu); 
      } 
      dropDownMenu.Visible = false; 
     } 

    } 
} 

的dropDownMenu是建立在其他地方,控制的构造控制。

我首先得到最顶层的父亲,因为我检查每个父母,我也得到了相对于父母的控件位置的运行x和y值。

如果此控件被切换,那么我将它添加到最顶端的父项并设置其位置,否则将其删除。

我敢肯定,有更复杂的方法,这可能无法在所有情况下工作,但是这种解决方案对于我编写.NET CF菜单按钮来说是完美的。

相关问题