今天开始将所学的,制做成一个AP来练习,

说真的,在练习的时候写的Code,和真正开始制作写的东西,完全不一样,

在架构上面,WinForm(C#)和Dialog(MFC)的方式,也差了好多,

今天,就来教学一下,如何创建两个Form,并且让其中一个Form变成另外一个Form的Parent吧 !

 

 

首先,我们先来看一下是意图 : 

 

 

这个功能其实还蛮常用到的,有时候在做切割的时候,常常会用到这样,好处就是我们可以规类,在Debug上面,也显得更容易,因为,如果你这只程式,在发生不可预期的错误的时候,你就可以先将B隐藏掉,然后,看这样RUN是否有问题,假如没有,那肯定是B错了,用这种方式Debug,各人认为是真的颇快的。

 

在MFC的做法是先将B Dialog的属性设为 Child,并且在A里面用new的方式做的时候,将parent设为this,这样即可,但是在C#( WinForm )却并不是这样。

 

 

首先,我先讲讲我想要做的

 

 

A : MAIN Form

B : 按钮→产生新的Form (PAGE)

C : AForm上面的Panel ( 用来规范产生出来的PAGE的大小和位置 )

D : Form(PAGE)

 

接下来,我们就来写点Code吧 

 

Step1. DllImport (user32.dll) + 写一个enum 

       [DllImport("user32.dll", EntryPoint = "SetParent")]
        public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        enum Page
        {
            Home_Page,
            FaceDetect_Page,
            ImageFactory_Page,
            Application_Page
        };

上面的DllImport是要告诉Compile,我们要使用user32.dll里面的SetParent这个Function,

下面的Enum page,是我自己的习惯,为什么 ? 等等看下去就知道了。

 

Step2. 在global里面将B的Instance new出来,并且在Main_Load里面,我们先将一些页面初始化



        Form_Home instance_home = new Form_Home();
        private void Main_Load(object sender, EventArgs e)
        {
            // 1. Page : Home 
            SetParent(instance_home.Handle, panel_pageWall.Handle);
            instance_home.Location = new Point(0, 0);
            instance_home.Size = panel_pageWall.Size;

            // 2. Page : FaceDetection
            // 3. Page : Image Factory
            // 4. Page : Application

            Invoke_Page(Page.Home_Page);
        }

这里我先做一个就好,基本上,其他的方式跟这个一样,

有看到那个Invoke_Page吗? 



        private void Invoke_Page (Page selPage)
        {
            switch(selPage)
            {
                case Page.Home_Page:
                    instance_home.Show();
                    break;
                case Page.FaceDetect_Page:
                    instance_home.Hide();
                    break;
                case Page.ImageFactory_Page:
                    instance_home.Hide();
                    break;
                case Page.Application_Page:
                    instance_home.Hide();
                    break;
            }
        }


这个就是我刚刚写的enum的用意,方便管理,也可以将呼叫和隐藏的东西写在同一个区域

 

 

Step3.  接下来就是按下去的那个按钮啰 ,一行搞定



Invoke_Page(Page.Home_Page);

 

 

 

搞定 

 

 

 

我用的方式或许不是最好的,可能在C#里面有更好的方式来实做我这个功能 ( 其实我一直觉得有,只是我还不知道 ),

所以我是用MFC的概念去想这个功能,并且实做的,

如果有更好的方式,欢迎留言给我,谢谢。

 

 

 

 

 

 

 

 

 

签名档 : 公司没一个RD写C#,没人问的感觉好可怜。

 

 

 

 

 

 

 

 

 

 

相关文章