今天開始將所學的,制做成一個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#,沒人問的感覺好可憐。
留言列表