[教学]C# WinForm使用SetParent的方法
今天开始将所学的,制做成一个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#,没人问的感觉好可怜。