C#中製作啓動窗體的方法和問題



       在開發windows桌面程序時,經常碰到的一個問題就是:在主窗體顯示之前,需要加載大量數據,這樣,當用戶啓動程序後,需要等待一段時間纔可以看到主窗體。好的程序設計人員會爲軟件加上一個啓動窗體,並在後臺執行加載數據的代碼,典型的應用如VS系列、PhotoShop等軟件。用戶一旦運行程序,首先看到的是啓動窗體以及窗體上顯示的相關信息,以避免用戶產生啓動程序後沒有反應的誤解。

       比如我的主窗體名稱是MainForm,啓動窗體名稱是SplachForm,在顯示MainForm之前需要加載大量數據,那麼可以先顯示SplachForm,並在上面以文字或進度條的形式顯示數據加載的情況,用戶知道應用程序在做什麼,也就可以耐心等待了。

       簡單的做法是修改Application.Run()方法的參數,把主窗體改爲SplachForm,當數據加載完成時,隱藏SplachForm,顯示MainForm。這裏不可以關閉SplachForm,因爲C#中,關閉Application.Run方法中調用的窗體對象,將會退出整個應用程序。

       上面這個做法的缺點是不可以在MainForm中使用Close方法來退出程序,因爲SplachForm只是隱藏,程序是無法退出的,必須使用Application.Exit()方法來退出整個應用程序。

       稍好一點的做法是,Application.Run方法的參數仍然是MainForm對象,在MainForm窗體的構造函數中添加以下代碼:

       SplachForm form=new SplachForm();

       form.ShowDialog();

       在SplachForm的Load事件中添加代碼:

       this.Show();

       this.Refresh();

       Init();      //加載數據的方法

       this.Close();

       這樣主窗體仍然是MainForm,並且在加載完數據後自動顯示MainForm。

       這個做法雖然簡單,但實際效果並不差。不過只適用於啓動窗體消失後必然顯示MainForm窗體的情況,如果在啓動窗體消失後,因爲某種原因需要退出程序,效果就不行了,無論怎麼處理,主窗體仍然會被顯示,即使把上面的this.Close()改成Application.Exit(),主窗體也會顯示一下才退出程序。這是因爲Application.Run方法的特性造成的,它使調用的窗體可見,並在退出程序時返回到調用的地方。

       更好的做法是使用線程技術,把啓動窗體和主窗體分爲不同線程,先創建啓動窗體的線程,在完成加載數據的方法後,創建主窗體的線程,同時關閉啓動窗體線程。例如啓動窗體加載數據之後,需要顯示登錄窗體,並根據用戶的登錄情況來決定是否顯示主窗體,用這種方式實現就非常好。當用戶登錄失敗或放棄登錄時,不創建主窗體線程,退出程序,不會出現第二種方法的情況。需要注意的是,在VS2005以上的版本中,有一個線程調用安全的問題。

       三種方式都用過,第一種簡單,效果不太好。第二種也簡單,在只有啓動窗體並在啓動窗體完成後直接進入主程序的情況下,效果也不錯。第三種稍爲麻煩,但可以處理的情況更多,如在主窗體顯示之前要顯示多個窗體,目前我只能用第三種方法來實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章