none
C#2008 MDI应用程序子窗体接收事件问题 RRS feed

  • 问题

  • C#2008开发的MDI应用程序,在子窗体中添加了一个PictureBox控件。怎么才能够实现点击MDI主窗体的菜单打开图像同时把图像载入子窗体的PictureBox控件中。谢谢!
    2010年8月6日 3:56

答案

  •         private void FormMain_Load(object sender, EventArgs e)
            {
                Form2 a = new Form2();
                a.MdiParent = this;
                a.Show();
                Form2 b = new Form2();
                b.MdiParent = this;
                b.Show();
            }
            private void loadToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Image image = Image.FromFile(@"c:\1.bmp");
                foreach (Form one in this.MdiChildren)
                {
                    if (one is Form2)
                    {
                        PictureBox pb = (PictureBox)one.Controls["pictureBox1"];
                        pb.Image = image;
                    }
                }
            }
    • 已标记为答案 pucx 2010年8月9日 14:35
    2010年8月9日 12:12

全部回复

  • 在主窗体定义一个事件,子窗体上绑定,打开图片时触发
    http://feiyun0112.cnblogs.com/
    2010年8月6日 4:53
    版主
  • 你好feiyun0112,你的解释“子窗体上绑定,打开图片时触发”这个我不大明白,烦劳详解解释下。谢谢!

    2010年8月6日 7:14
  • 把主窗体叫做 MainForm,包含有 PictureBox 的窗体叫做 ChildForm,在 MainForm 上定义一事件,比如 LoadPictureMenuItemClick,然后用 ChildForm 去订阅这个事件,载入 Picture 到 PictureBox。实例代码如下:

    // 定义事件。
    public event EventHandler<EventArgs> LoadPictureMenuItemClick;

    // 菜单的事件。
    protected void OnLoad(object sender, EventArgs e)
    {
        base.OnLoad(e);
        this.loadPictureMenuItem.Click += (_sender, _e) =>
        {
            if (this.LoadPictureMenuItemClick != null)
            {
                this.LoadPictureMenuItemClick(this, EventArgs.Empty);
            }
        });
    }

    在 ChildForm 中,订阅 LoadPictureMenuItemClick 事件,载入图片。
    protected void OnLoad(object sender, EventArgs e)
    {
        base.OnLoad(e);
        MainForm mainForm = Application.MainForm as MainForm;
        mainForm.LoadPictureMenuItemClick += (_sender, _e) =>
        {
            // 替换一下代码以便读取图片。
            this.pictureBox.Image = Image.FromHandle(...)
        }
    }


    Mark Zhou
    2010年8月6日 7:48
  • 你好,Mark Zhou。你的上述代码中MainForm mainForm = Application.MainForm as MainForm;这句我运行不正确。说是Application下没有那个MainForm的定义。我打开图像的时候还有个图像的加载问题,这个实现应该放在什么地方呢?还有我不确定你给出的这两个 OnLoad(object sender, EventArgs e)事件是算作是子函数还是菜单的load还是其它的什么意思。谢谢!
    2010年8月6日 11:20
  • 弄个全局静态属性来设置效果最好。也最简单,也最高效。public static picturebox m_staticpict
    2010年8月7日 4:59
  •         private void FormMain_Load(object sender, EventArgs e)
            {
                Form2 a = new Form2();
                a.MdiParent = this;
                a.Show();
                Form2 b = new Form2();
                b.MdiParent = this;
                b.Show();
            }
            private void loadToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Image image = Image.FromFile(@"c:\1.bmp");
                foreach (Form one in this.MdiChildren)
                {
                    if (one is Form2)
                    {
                        PictureBox pb = (PictureBox)one.Controls["pictureBox1"];
                        pb.Image = image;
                    }
                }
            }
    • 已标记为答案 pucx 2010年8月9日 14:35
    2010年8月9日 12:12