close

 

 

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

 

 

 

 

 

 

 

 

 

 

arrow
arrow
    文章標籤
    child setparent winform
    全站熱搜
    創作者介紹
    創作者 Eric 的頭像
    Eric

    一個小小工程師的心情抒發天地

    Eric 發表在 痞客邦 留言(0) 人氣()