我发现子控件不是在父级界限之外绘制的。因此,如果我有一个从面板右侧伸出的按钮,它会被拉到面板结束部分的一半。
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);
}
修改
它是关于控件内部的控件不是控件内部的形式
不,没有花哨的用户界面。我知道我可以使用区域来创建疯狂的桌面应用程序。那不是我想要的。
谢谢!
答案 0 :(得分:4)
Form
也是一个控件,所以它的行为与其他控件非常相似。
渲染限制来自于控件是操作系统中的窗口,其仅表示显示器的矩形区域。窗口不能在其自己的边界之外绘制任何东西,因此如果子控件放在这些边界之外,它将不会被渲染(或者只是部分渲染,具体取决于它的位置)。
没有简单的方法可以解决这个问题,并且子控件的整个概念围绕着控制绘制内容的父控件。如果要在父项的边界之外绘制子控件,请从父项中删除“子”,因为该关系并不真正适用。
你可以想出一些可以解决这个问题的自定义渲染代码,但是控件不会是其他容器的真正子代,你必须编写相当数量的渲染代码才能使它工作。在某些情况下,这可能是期望的行为,但在大多数情况下,默认的系统行为更好(并且意味着程序员的工作量更少)。
通过自定义渲染表单(即,将其绘制得比实际更小),然后在空白区域中渲染按钮,可以获得窗体“外部”的按钮的视觉效果。然而,这是很多工作,我不确定你是否想采取这种方式。
如果你试图做一个花哨的UI,其中一些控件形状像blob(不像矩形)或它们看起来漂浮(与“主”UI分离),类似于一些媒体播放器等:那些程序完成整个自定义渲染的事情;他们的窗户仍然是矩形窗户,但在渲染过程中,他们使用透明图像和区域来渲染表格。
如果您在问题中添加了更多详细信息,为什么要这样做,这会有所帮助。
答案 1 :(得分: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菜单按钮。
答案 2 :(得分:0)
在WinForms中,无法在控件的边界之外绘制。
将按钮限制在面板内部的最简单方法是适当使用Anchor
属性。通常按钮是右对齐的。如果要在面板调整大小时保持此对齐方式,请将按钮停靠在右侧。如果按钮位于底部,则将其固定在底部,否则将其固定在顶部。
如果您希望按钮使用面板宽度调整大小,则将其同时停靠在左侧和右侧以及顶部或底部。
图片位于此处:Getting Started with Windows Forms: Anchor the Buttons to the Bottom Right。