我在FORM1上旋转了一个TPanel控件,我希望让另外的FORM,如FORM2显示在TPanel之上,用下面的代码好像可以实现。
      Form2   test=new   Form2();  
      test.TopLevel=false;  
      test.FormBorderStyle=None; 
      panel1.Controls.Add(test);  
      test.Show();
   怎样才能让FORM2才能随着PANEL控件大小变化而自动变化呢?

解决方案 »

  1.   

    看来C#在这方面确实没有Delphi做的好啊
      

  2.   

    如果是将Form放在Panel中,则需要将Form的Dock属性设为DockStyle.Fill。
      

  3.   

       我将Dock属性设为DockStyle.Fill,但我改变大小时,Form的大小还是没有改变。郁闷,不会我在Panel中的Resize事件中再来一次DockStyle.Fill吧。
      

  4.   


      我将AutoSize=true,结果也是一样的啊
      

  5.   

    嘿嘿,可是我那样做是有效果的,只不过,在将Form加入Panel的时候,使用的是Form.Parent=Panel;的形式,这一点与你的不一样。
      

  6.   

       将form.parent=panel,这一点倒象是delphi的用法。这个我先试试看。
      

  7.   

    form.parent=panel,这样还是不行
      

  8.   

    难道只能在resize事件中实现?
      

  9.   

    倒,干嘛还对Delphi念念不忘的...
      

  10.   

    Panel是没有边框的,而你的Form也没有边框,你是如何确定Form没有随着Panel的大小变化而变化呢?
      

  11.   

    Anchor属性  上下左右 都选上
      

  12.   

    哦  Form窗体 没那个属性哟
      

  13.   

                this.panelMain.Controls.Add(form);-- 这句话就可以
                //设置显示的窗体最合适的宽和高*************************
                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();
      

  14.   


    先检查这点吧,估计是你看错了... 比如看到Form中的控件被遮住了,就以为是Form大小没变,其实是变了的如果真是Dock后Form没随外层控件变化,有两种可能:一是你调用了SuspendLayout方法但没Resume;另一个是你设置了Form的MinSize
      

  15.   


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

  16.   

    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));
            }
        }
    }
      

  17.   


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

  18.   

    为什么非要用Form、UserControl不是更好用。
      

  19.   


    为什么说“难道真没有办法?”, 楼主试过我给你提出的方法么? 还有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;
                }
            }
      

  20.   

           Form2 f;        public Form1() {
                InitializeComponent();            f = new Form2();
                f.TopLevel = false;
                f.Parent = panel1;
                f.Dock = DockStyle.Fill;            f.Show();
            }
    试试
      

  21.   

    纠正一下,要求pannel的Dock等于非Dock.None值
      

  22.   


      我将panel1.Dock=DockStyle.Left;
      

  23.   

    晕了,我在20楼不是给你写好了,
    Form2.Size = P.Size;
                Form2.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
    form的Anchor锚点属性在属性编辑器里是隐藏的,但代码里是.得出来的
      

  24.   


    pannel.Dock=Dock.Left貌似只是高度方向上变化了,宽度方向上没变化。楼上的也可以,将pannel.Anchor=AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; pannel.ADock的优先级大于Achor,需要你将Dock设置为None,上面的代码才正确工作。
      

  25.   

    总算把这个问题解决了,解决办法是在Panel1的Resize事件里添加了如下的代码:
              //frmvar.Size = panel1.Size;
                frmvar.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
      奇怪的是,上面的两行代码任意一行都可以的。  Form2.FormBorderStyle=FormBorderStyle.None;
      

  26.   

    再总结一下,我在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"。
       真是生气啊,这段代码本来我早就有了的,可就是不出来结果,现在突然一切正确了,郁闷,不过非常感谢大家的参与。
      

  27.   


    frmvar.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; 
    只要一开始执行一次就够了,不需要每次resize都执行,设置后当resize时会上下左右自动锚定住