我在FORM1上旋转了一个TPanel控件,我希望让另外的FORM,如FORM2显示在TPanel之上,用下面的代码好像可以实现。
Form2 test=new Form2();
test.TopLevel=false;
test.FormBorderStyle=None;
panel1.Controls.Add(test);
test.Show();
怎样才能让FORM2才能随着PANEL控件大小变化而自动变化呢?
Form2 test=new Form2();
test.TopLevel=false;
test.FormBorderStyle=None;
panel1.Controls.Add(test);
test.Show();
怎样才能让FORM2才能随着PANEL控件大小变化而自动变化呢?
我将AutoSize=true,结果也是一样的啊
//设置显示的窗体最合适的宽和高*************************
if (initWidth < panelMain.Width) form.Width = panelMain.Width - 5;
if (initHeight < panelMain.Height) form.Height = panelMain.Height - 4;
//********************************************************
//panelMain.AutoScroll = true;
//设置窗体显示的位置*********************
form.Top = 0;
form.Left = 0;
form.TopMost = true;
//**********************************
form.Show();
先检查这点吧,估计是你看错了... 比如看到Form中的控件被遮住了,就以为是Form大小没变,其实是变了的如果真是Dock后Form没随外层控件变化,有两种可能:一是你调用了SuspendLayout方法但没Resume;另一个是你设置了Form的MinSize
可以将Form2上的所有控件都装入一个 panel2 中, 然后在Panel1所在的窗体中, 设置Panel2的Parent为Panel1, 就可以实现你的要求了。
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));
}
}
}
Delphi虽然现在用得少了,但不可否认,Delphi还是在好多方面做得确实很好啊,至少在快速设计方面就比较不错吧
为什么说“难道真没有办法?”, 楼主试过我给你提出的方法么? 还有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;
}
}
InitializeComponent(); f = new Form2();
f.TopLevel = false;
f.Parent = panel1;
f.Dock = DockStyle.Fill; f.Show();
}
试试
我将panel1.Dock=DockStyle.Left;
Form2.Size = P.Size;
Form2.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
form的Anchor锚点属性在属性编辑器里是隐藏的,但代码里是.得出来的
pannel.Dock=Dock.Left貌似只是高度方向上变化了,宽度方向上没变化。楼上的也可以,将pannel.Anchor=AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; pannel.ADock的优先级大于Achor,需要你将Dock设置为None,上面的代码才正确工作。
//frmvar.Size = panel1.Size;
frmvar.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
奇怪的是,上面的两行代码任意一行都可以的。 Form2.FormBorderStyle=FormBorderStyle.None;
在AddForm的Click事件里添加了如下代码:
frmvar = new Form2();
frmvar.TopLevel = false;
frmvar.Dock = DockStyle.Fill; //这一句,是必须的。
frmvar.Top = 0;
panel1.Controls.Add(frmvar);
frmvar.Show();
当然,Form2的FormBorderStyle设置为"None"。
真是生气啊,这段代码本来我早就有了的,可就是不出来结果,现在突然一切正确了,郁闷,不过非常感谢大家的参与。
frmvar.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
只要一开始执行一次就够了,不需要每次resize都执行,设置后当resize时会上下左右自动锚定住