怎样让一个Form窗体显示在如Panel控件之上?

YangYun 2009-06-11 05:15:40
我在FORM1上旋转了一个TPanel控件,我希望让另外的FORM,如FORM2显示在TPanel之上,用下面的代码好像可以实现。
Form2 test=new Form2();
test.TopLevel=false;
test.FormBorderStyle=None;
panel1.Controls.Add(test);
test.Show();
怎样才能让FORM2才能随着PANEL控件大小变化而自动变化呢?
...全文
594 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
让爱延续 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dancingbit 的回复:]
Form.AutoSize
[/Quote]

这才是最经典的答案嘛!
YangYun 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 qqiuzaihui 的回复:]

可以将Form2上的所有控件都装入一个 panel2 中, 然后在Panel1所在的窗体中, 设置Panel2的Parent为Panel1, 就可以实现你的要求了。
[/Quote]

你的这个处理办法还真有点意思,感觉可行。
wartim 2009-06-12
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication59
{
public partial class Form1 : Form
{
Panel P = new Panel();

public Form1()
{
InitializeComponent();

this.Size = new Size(600, 600);

P.Size = new Size(200, 200);
P.Location = new Point(0, 100);
P.Parent = this;

Form Form2 = new Form();
Form2.TopLevel = false;
Form2.Parent = P;
Form2.BackColor = Color.Black;
Form2.Size = P.Size;
Form2.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
Form2.Show();

Button B1 = new Button();
B1.Parent = this;
B1.Text = "放大panel";
B1.Click += new EventHandler(B1_Click);

Button B2 = new Button();
B2.Parent = this;
B2.Text = "缩小panel";
B2.Click += new EventHandler(B2_Click);
B2.Location = new Point(0, 50);
}

void B1_Click(object sender, EventArgs e)
{
P.Size = Size.Add(P.Size, new Size(100, 100));
}

void B2_Click(object sender, EventArgs e)
{
P.Size = Size.Subtract(P.Size, new Size(100, 100));
}
}
}
qqiuzaihui 2009-06-12
  • 打赏
  • 举报
回复

可以将Form2上的所有控件都装入一个 panel2 中, 然后在Panel1所在的窗体中, 设置Panel2的Parent为Panel1, 就可以实现你的要求了。
YangYun 2009-06-12
  • 打赏
  • 举报
回复
没有更好的办法了吗?
wartim 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 YangYun 的回复:]
总算把这个问题解决了,解决办法是在Panel1的Resize事件里添加了如下的代码:
//frmvar.Size = panel1.Size;
frmvar.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
奇怪的是,上面的两行代码任意一行都可以的。

Form2.FormBorderStyle=FormBorderStyle.None;
[/Quote]

frmvar.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
只要一开始执行一次就够了,不需要每次resize都执行,设置后当resize时会上下左右自动锚定住
YangYun 2009-06-12
  • 打赏
  • 举报
回复
再总结一下,我在FORM1上有一个AddForm的Button控件和一个Panel1的Panel控件。
在AddForm的Click事件里添加了如下代码:
frmvar = new Form2();
frmvar.TopLevel = false;
frmvar.Dock = DockStyle.Fill; //这一句,是必须的。
frmvar.Top = 0;
panel1.Controls.Add(frmvar);
frmvar.Show();
当然,Form2的FormBorderStyle设置为"None"。


真是生气啊,这段代码本来我早就有了的,可就是不出来结果,现在突然一切正确了,郁闷,不过非常感谢大家的参与。
YangYun 2009-06-12
  • 打赏
  • 举报
回复
总算把这个问题解决了,解决办法是在Panel1的Resize事件里添加了如下的代码:
//frmvar.Size = panel1.Size;
frmvar.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
奇怪的是,上面的两行代码任意一行都可以的。

Form2.FormBorderStyle=FormBorderStyle.None;
yxq281426250 2009-06-12
  • 打赏
  • 举报
回复

pannel.Dock=Dock.Left貌似只是高度方向上变化了,宽度方向上没变化。

楼上的也可以,将pannel.Anchor=AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; pannel.A

Dock的优先级大于Achor,需要你将Dock设置为None,上面的代码才正确工作。
wartim 2009-06-12
  • 打赏
  • 举报
回复
晕了,我在20楼不是给你写好了,
Form2.Size = P.Size;
Form2.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
form的Anchor锚点属性在属性编辑器里是隐藏的,但代码里是.得出来的
YangYun 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 yxq281426250 的回复:]
纠正一下,要求pannel的Dock等于非Dock.None值
[/Quote]

我将panel1.Dock=DockStyle.Left;
yxq281426250 2009-06-12
  • 打赏
  • 举报
回复
纠正一下,要求pannel的Dock等于非Dock.None值
yxq281426250 2009-06-12
  • 打赏
  • 举报
回复
要求pannel的Dock=Dock.Fill
yxq281426250 2009-06-12
  • 打赏
  • 举报
回复
Form2 f;

public Form1() {
InitializeComponent();

f = new Form2();
f.TopLevel = false;
f.Parent = panel1;
f.Dock = DockStyle.Fill;

f.Show();
}
试试
修改一下昵称 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wartim 的回复:]
C# codeusing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication59
{
public partial class Form1 : Form
{
Panel P = new Panel();

public Form1()
{
InitializeComponent();

this.Size = new S…
[/Quote]
up
qqiuzaihui 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 YangYun 的回复:]
难道真没办法吗?这种用法应该在很多地方都用得上吧
[/Quote]

为什么说“难道真没有办法?”, 楼主试过我给你提出的方法么? 还有20楼的方法也不错。 

得了, 我把我写代码给你看一下,这是在一个窗体上显示其它两个窗体上控件的实例:

private ChildFrm1 cF1 = null;   //窗体1
private ChildFrm2 cF2 = null;   //窗体2

private void ParentFrm_Load(object sender, EventArgs e)
{
cF1 = new ChildFrm1();
cF1.panel1.Parent = this.panel1;  //将窗体1上的Panel1的Parent设置主窗体上的panel1

cF2 = new ChildFrm2();
cF2.panel2.Parent = this.panel1;  //将窗体1上的Panel1的Parent设置主窗体上的panel1
cF2.panel2.Location = cF1.panel1.Location;

cF1.panel1.BringToFront();     //将cF1窗体上的控件置前

}

    //分别当击button1与button2时,将不同窗体上的控件置前
private void button1_Click(object sender, EventArgs e)
{
switch (((Button)sender).Text)
{
case "button1":
cF2.panel2.BringToFront();
break;
case "button2":
cF1.panel1.BringToFront();
break;
}
}
YangYun 2009-06-12
  • 打赏
  • 举报
回复
难道真没办法吗?这种用法应该在很多地方都用得上吧
Profiteerchen 2009-06-12
  • 打赏
  • 举报
回复
20楼正解!!!我支持。。。
assky124 2009-06-12
  • 打赏
  • 举报
回复
为什么非要用Form、UserControl不是更好用。
YangYun 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dancingbit 的回复:]
倒,干嘛还对Delphi念念不忘的...
[/Quote]

Delphi虽然现在用得少了,但不可否认,Delphi还是在好多方面做得确实很好啊,至少在快速设计方面就比较不错吧
加载更多回复(18)

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧