C#中(zhōng)制作啓動窗體(tǐ)的方法和問題

發布時間:2011年03月16日      浏覽次數:851 次
在開(kāi)發windows桌面程序時,經常碰到的一(yī)個問題就是:在主窗體(tǐ)顯示之前,需要加載大(dà)量數據,這樣,當用戶啓動程序後,需要等待一(yī)段時間才可以看到主窗體(tǐ)。好的程序設計人員(yuán)會爲軟件加上一(yī)個啓動窗體(tǐ),并在後台執行加載數據的代碼,典型的應用如VS系列、PhotoShop等軟件。用戶一(yī)旦運行程序,首先看到的是啓動窗體(tǐ)以及窗體(tǐ)上顯示的相關信息,以避免用戶産生(shēng)啓動程序後沒有反應的誤解。
比如我(wǒ)(wǒ)的主窗體(tǐ)名稱是MainForm,啓動窗體(tǐ)名稱是SplachForm,在顯示MainForm之前需要加載大(dà)量數據,那麽可以先顯示SplachForm,并在上面以文字或進度條的形式顯示數據加載的情況,用戶知(zhī)道應用程序在做什麽,也就可以耐心等待了。
簡單的做法是修改Application.Run()方法的參數,把主窗體(tǐ)改爲SplachForm,當數據加載完成時,隐藏SplachForm,顯示MainForm。這裏不可以關閉SplachForm,因爲C#中(zhōng),關閉Application.Run方法中(zhōng)調用的窗體(tǐ)對象,将會退出整個應用程序。
上面這個做法的缺點是不可以在MainForm中(zhōng)使用Close方法來退出程序,因爲SplachForm隻是隐藏,程序是無法退出的,必須使用Application.Exit()方法來退出整個應用程序。
稍好一(yī)點的做法是,Application.Run方法的參數仍然是MainForm對象,在MainForm窗體(tǐ)的構造函數中(zhōng)添加以下(xià)代碼:
SplachForm form=new SplachForm();
form.ShowDialog();
在SplachForm的Load事件中(zhōng)添加代碼:
this.Show();
this.Refresh();
Init(); //加載數據的方法
this.Close();
這樣主窗體(tǐ)仍然是MainForm,并且在加載完數據後自動顯示MainForm。
這個做法雖然簡單,但實際效果并不差。不過隻适用于啓動窗體(tǐ)消失後必然顯示MainForm窗體(tǐ)的情況,如果在啓動窗體(tǐ)消失後,因爲某種原因需要退出程序,效果就不行了,無論怎麽處理,主窗體(tǐ)仍然會被顯示,即使把上面的this.Close()改成Application.Exit(),主窗體(tǐ)也會顯示一(yī)下(xià)才退出程序。這是因爲Application.Run方法的特性造成的,它使調用的窗體(tǐ)可見,并在退出程序時返回到調用的地方。
更好的做法是使用線程技術,把啓動窗體(tǐ)和主窗體(tǐ)分(fēn)爲不同線程,先創建啓動窗體(tǐ)的線程,在完成加載數據的方法後,創建主窗體(tǐ)的線程,同時關閉啓動窗體(tǐ)線程。例如啓動窗體(tǐ)加載數據之後,需要顯示登錄窗體(tǐ),并根據用戶的登錄情況來決定是否顯示主窗體(tǐ),用這種方式實現就非常好。當用戶登錄失敗或放(fàng)棄登錄時,不創建主窗體(tǐ)線程,退出程序,不會出現第二種方法的情況。需要注意的是,在VS2005以上的版本中(zhōng),有一(yī)個線程調用安全的問題。
三種方式都用過,第一(yī)種簡單,效果不太好。第二種也簡單,在隻有啓動窗體(tǐ)并在啓動窗體(tǐ)完成後直接進入主程序的情況下(xià),效果也不錯。第三種稍爲麻煩,但可以處理的情況更多,如在主窗體(tǐ)顯示之前要顯示多個窗體(tǐ),目前我(wǒ)(wǒ)隻能用第三種方法來實現。第三種方法的代碼較多,懶得打字貼代碼了,記上一(yī)筆,以免日後又(yòu)忘了……
免責聲明:本站相關技術文章信息部分(fēn)來自網絡,目的主要是傳播更多信息,如果您認爲本站的某些信息侵犯了您的版權,請與我(wǒ)(wǒ)們聯系,我(wǒ)(wǒ)們會即時妥善的處理,謝謝合作!