none
C#如何显示两个窗体的相对位置? RRS feed

  • 问题

  • C#如何显示两个窗体的相对位置?


    Form1, AutoScroll = true; 而且,它里面有一个PictureBox,SizeMode=Zoom. 加入图片后,把它变大40倍。



    C# code
    this.PictureBox1.Width=this.PictureBox1.Width*40;
    this.PictureBox1.Height=this.PictureBox1.Height*40;

     

     

    那么,图片就变得很大。Form1的滚动条就出现.
    还有一个Form2. 它的Size不大,是400,300. 而且,设置TopMost = true. 就是总是在最上面。
    Form2里有一个按钮。

     

    C# code
    private void Button2_Click(object sender,EventArgs e)
    {this.Text=this.Location.X.ToString()+@"    "+this.Location.Y.ToString();}

     


    这样,它只能显示自己在屏幕上的位置。但是,我想让它,显示相对Form1的位置。

    就像有一盏灯,照着Form2。那么,Form2的影子就在Form1里面。

    C#有什么办法,可以显示出这个Form2影子在Form1里面的location?

    C#能做到吗?


    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.4, Microsoft.NET Framework 2.0 SP2, C# 2.0, IIS 6.0, Apache 1.3.41, Nginx-0.6.36, SQL Server 2000, MySQL 5.0, FireBird 2.1.2, PHP 5.2.4, Office 2007, OpenOffice 3.0和永中Office2009.
    2009年5月27日 12:39

答案

  • 你好,你只需要在周雪峰的基础上在 From2 中为 From2 注册一个 LocationChanged 的事件就可以了,如下面的代码

    ---------------------------------------------------------------------------------------------------------
    Form 1
    ---------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace X.WinFormsApp.Forms
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.InitFrom();
            }
    
            private void InitFrom()
            {
                Button fButton = new Button();
                fButton.Text = "Show Form2";
                fButton.Location = new Point(10, 10);
                fButton.Size = new Size(80, 26);
                fButton.Click += new EventHandler(fButton_Click);
                this.Controls.Add(fButton);
            }
    
            private void fButton_Click(object sender, EventArgs e)
            {
                Form2 fChild = new Form2(this);
                fChild.Show();
            }
        }
    }
    
    
    ---------------------------------------------------------------------------------------------------------
    Form 2
    ---------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace X.WinFormsApp.Forms
    {
        public partial class Form2 : Form
        {
            private Form1 fParent;
            private Button fButton;
            private TextBox fTextBox;
    
            public Form2()
            {
                InitializeComponent();
                this.InitForm();
            }
    
            public Form2(Form1 fParent):this()
            {
                this.fParent = fParent;
                this.fParent.LocationChanged += new EventHandler(fParent_LocationChanged);
            }
    
            private void InitForm()
            {
                fTextBox = new TextBox();
                fTextBox.Size = new Size(260, 23);
                fTextBox.Location = new Point(10, 10);
    
                fButton = new Button();
                fButton.Text = "Show Form1 Location";
                fButton.Location = new Point(10, 50);
                fButton.Size = new Size(150, 26);
                fButton.Click += new EventHandler(fButton_Click);
    
                this.Controls.Add(fButton);
                this.Controls.Add(fTextBox);
            }
    
            private void fButton_Click(object sender, EventArgs e)
            {
                MessageBox.Show(string.Format("From1.Location.X:{0}\r\nFrom2.Location.Y:{1}",
                    this.fParent.Location.X, this.fParent.Location.Y));
            }
    
            private void fParent_LocationChanged(object sender, EventArgs e)
            {
                this.fTextBox.Text = string.Format("From1.Location.X:{0};Y:{1}",
                    this.fParent.Location.X, this.fParent.Location.Y);
            }
        }
    }
    
    


    知识改变命运,奋斗成就人生!
    • 已标记为答案 dvdvip 2009年5月28日 1:22
    2009年5月28日 1:14
    版主
  • from1
    private void fButton_Click(object sender, EventArgs e)
            {
                Form2 fChild = new Form2(this);
                fChild.Show();
    
            }
     from2
     public Form2(Form1 fParent):this()
            {
                this.fParent = fParent;
                this.fParent.LocationChanged += new EventHandler(fParent_LocationChanged);
            }

    这里传的,你把代码全部拷到你的项目中一步一步的跟

    知识改变命运,奋斗成就人生!
    • 已标记为答案 dvdvip 2009年5月28日 13:41
    2009年5月28日 7:12
    版主
  • 你好!
         在Form1里看这行代码:
         Form2 fChild = new Form2(this);//这一步的this,代表的是Form1的实例,
                                                          //这通过Form2的构造函数的参数传递把Form1的实例传递给了Form2;

         在Form2里,看这两行
         this.fParent = fParent;//参数fParent就是上面传递进来的this,也就是Form1的实例


         this.fParent.LocationChanged += new EventHandler(fParent_LocationChanged);//这里相当于订阅了Form1的实例的LocationChanged事件
    周雪峰
    • 已标记为答案 dvdvip 2009年5月28日 13:41
    2009年5月28日 10:35
    版主

全部回复

  • 你好!
         你可以在Form2里定义一个带参数的构造函数,参数类型是Form1,实例化Form2的时候把Form1的实例通过构造函数传近来,然后保存在Form2的一个成员字段里!
         这样Form2就获得了一个Form1的实例,然后就可以获得Form1的Location属性了,然后计算相对坐标就可以了!
    周雪峰
    2009年5月27日 12:49
    版主
  • 你说得好理论。

    用户通过鼠标移动Form1. Form2又是如何感知的?
    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.4, Microsoft.NET Framework 2.0 SP2, C# 2.0, IIS 6.0, Apache 1.3.41, Nginx-0.6.36, SQL Server 2000, MySQL 5.0, FireBird 2.1.2, PHP 5.2.4, Office 2007, OpenOffice 3.0和永中Office2009.
    2009年5月27日 22:11
  • 你好,你只需要在周雪峰的基础上在 From2 中为 From2 注册一个 LocationChanged 的事件就可以了,如下面的代码

    ---------------------------------------------------------------------------------------------------------
    Form 1
    ---------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace X.WinFormsApp.Forms
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.InitFrom();
            }
    
            private void InitFrom()
            {
                Button fButton = new Button();
                fButton.Text = "Show Form2";
                fButton.Location = new Point(10, 10);
                fButton.Size = new Size(80, 26);
                fButton.Click += new EventHandler(fButton_Click);
                this.Controls.Add(fButton);
            }
    
            private void fButton_Click(object sender, EventArgs e)
            {
                Form2 fChild = new Form2(this);
                fChild.Show();
            }
        }
    }
    
    
    ---------------------------------------------------------------------------------------------------------
    Form 2
    ---------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace X.WinFormsApp.Forms
    {
        public partial class Form2 : Form
        {
            private Form1 fParent;
            private Button fButton;
            private TextBox fTextBox;
    
            public Form2()
            {
                InitializeComponent();
                this.InitForm();
            }
    
            public Form2(Form1 fParent):this()
            {
                this.fParent = fParent;
                this.fParent.LocationChanged += new EventHandler(fParent_LocationChanged);
            }
    
            private void InitForm()
            {
                fTextBox = new TextBox();
                fTextBox.Size = new Size(260, 23);
                fTextBox.Location = new Point(10, 10);
    
                fButton = new Button();
                fButton.Text = "Show Form1 Location";
                fButton.Location = new Point(10, 50);
                fButton.Size = new Size(150, 26);
                fButton.Click += new EventHandler(fButton_Click);
    
                this.Controls.Add(fButton);
                this.Controls.Add(fTextBox);
            }
    
            private void fButton_Click(object sender, EventArgs e)
            {
                MessageBox.Show(string.Format("From1.Location.X:{0}\r\nFrom2.Location.Y:{1}",
                    this.fParent.Location.X, this.fParent.Location.Y));
            }
    
            private void fParent_LocationChanged(object sender, EventArgs e)
            {
                this.fTextBox.Text = string.Format("From1.Location.X:{0};Y:{1}",
                    this.fParent.Location.X, this.fParent.Location.Y);
            }
        }
    }
    
    


    知识改变命运,奋斗成就人生!
    • 已标记为答案 dvdvip 2009年5月28日 1:22
    2009年5月28日 1:14
    版主
  • 未将对象引用设置到对象的实例。



    我回去后试了一下你这个。出现上面这个错误。这是怎么回事?

    fParent_LocationChanged到是Form1还是Form2的?

    你用VS 2008写的吧?看得我很累很糊涂。



    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.4, Microsoft.NET Framework 2.0 SP2, C# 2.0, IIS 6.0, Apache 1.3.41, Nginx-0.6.36, SQL Server 2000, MySQL 5.0, FireBird 2.1.2, PHP 5.2.4, Office 2007, OpenOffice 3.0和永中Office2009.
    2009年5月28日 4:58
  • fParent 是 From1,你还是需要多了解一些基础的知识
    知识改变命运,奋斗成就人生!
    2009年5月28日 4:59
    版主
  • 未将对象引用设置到对象的实例。



    我回去后试了一下你这个。出现上面这个错误。这是怎么回事?

    fParent_LocationChanged到是Form1还是Form2的?

    你用VS 2008写的吧?看得我很累很糊涂。



    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.4, Microsoft.NET Framework 2.0 SP2, C# 2.0, IIS 6.0, Apache 1.3.41, Nginx-0.6.36, SQL Server 2000, MySQL 5.0, FireBird 2.1.2, PHP 5.2.4, Office 2007, OpenOffice 3.0和永中Office2009.
    fParent_LocationChanged方法写在Form2中
    这段代码没有使用VS2008的新特性,在VS2005上可以运行的
    请问你是哪一行出现这个错误的“未将对象引用设置到对象的实例”??

    周雪峰
    2009年5月28日 5:16
    版主
  •   private void fButton_Click(object sender, EventArgs e)
            {
                MessageBox.Show(string.Format("From1.Location.X:{0}\r\nFrom2.Location.Y:{1}",
                    this.fParent.Location.X, this.fParent.Location.Y));
            }


    就是这一句有问题。


    fParent_LocationChanged,就是Form1的位置改变事件。它是如何传递到Form2里的?没看明白。
    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.4, Microsoft.NET Framework 2.0 SP2, C# 2.0, IIS 6.0, Apache 1.3.41, Nginx-0.6.36, SQL Server 2000, MySQL 5.0, FireBird 2.1.2, PHP 5.2.4, Office 2007, OpenOffice 3.0和永中Office2009.
    2009年5月28日 7:10
  • from1
    private void fButton_Click(object sender, EventArgs e)
            {
                Form2 fChild = new Form2(this);
                fChild.Show();
    
            }
     from2
     public Form2(Form1 fParent):this()
            {
                this.fParent = fParent;
                this.fParent.LocationChanged += new EventHandler(fParent_LocationChanged);
            }

    这里传的,你把代码全部拷到你的项目中一步一步的跟

    知识改变命运,奋斗成就人生!
    • 已标记为答案 dvdvip 2009年5月28日 13:41
    2009年5月28日 7:12
    版主
  • 你好!
         在Form1里看这行代码:
         Form2 fChild = new Form2(this);//这一步的this,代表的是Form1的实例,
                                                          //这通过Form2的构造函数的参数传递把Form1的实例传递给了Form2;

         在Form2里,看这两行
         this.fParent = fParent;//参数fParent就是上面传递进来的this,也就是Form1的实例


         this.fParent.LocationChanged += new EventHandler(fParent_LocationChanged);//这里相当于订阅了Form1的实例的LocationChanged事件
    周雪峰
    • 已标记为答案 dvdvip 2009年5月28日 13:41
    2009年5月28日 10:35
    版主