仿Office的程式載入窗體

2021-09-06 13:24:10 字數 3901 閱讀 8280

初次接觸啟動介面記不清是在哪一年了,估計是小學四年級第一次開啟office word的時候吧,更記不清楚當時的啟動介面是長啥樣了。後來隨著使用的軟體越來越多,也見到各式各樣的啟動介面。下面就列舉了兩個平常本人平常最常見的窗體,其實windows系統在啟動的過程中,有window字樣並且有動畫效果的那個節面也算是乙個啟動介面。

其目的很明顯,就是程式啟動之後,由於載入主介面的時間過長而導致使用者體驗不佳,於是往往在顯示主介面之前多顯示乙個不帶windows窗體元素的窗體,來顯示應用程式載入的進度或者直接是乙個靜態的檢視,作用在於就是跟使用者反映程式是有響應的並且正在執行當中,從而提高使用者體驗。下面是我的載入窗

主要是仿照了office 2013的風格

簡約明了。其中窗體的底色,字型,文字顏色可以更改,左上角的製造商,中間的軟體名稱,左下角的進度資訊都可以更改。不過暫時還沒有把圖示附加到左上角而已。

窗體的設計如下所示

載入窗的製造商,軟體名稱這些資訊通過建構函式傳參進行設定,此外預設的建構函式被遮蔽了

1

private

loadingform()25

6()719 }

對窗體的開啟並非用單純的show或者showdialog,因為在主線程上show的話,本身主線程要載入時就會阻塞,這樣再阻塞的執行緒上show的話,窗體難以顯示。如果用showdialog的也不行,雖然它可以讓窗體顯示出來,但是呼叫了showdialog之後直到窗體關閉了才返回。就是說載入窗關閉了之後才執行載入載入之類的操作,這樣顯得毫無意義。

這裡只是用來了乙個非同步去showdialog。**如下

1

public

void

showloading()2);

8 callback.begininvoke(null, null

);9 }

這裡在showdialog之前還多作了乙個判斷,在於關閉窗體的方法時釋放了資源,因此在幾個地方都要注意,關閉窗體的處理如下

1

public

void

closeloading()2);

11}12 }

由於呼叫了invoke,這個需要判斷當前窗體是否已經是顯示了出來,否則就會因為窗體的控制代碼不存在而丟擲異常。

在窗體上顯示的進度資訊,只是通過了乙個外放的屬性實現,其判斷的用意跟關閉窗體時的一樣。

1

public

string

message

3set4);

11}12}

13 }

為了窗體能具備可拖拽的效果,還額外加了一下的**

1         [dllimport("

user32.dll")]

2private

static

extern

bool

releasecapture();

3 [dllimport("

user32.dll")]

4private

static

extern

bool sendmessage(intptr hwnd, int wmsg, int wparam, int

lparam);

5private

const

int wm_syscommand = 0x0112;6

private

const

int sc_move = 0xf010;7

private

const

int htcaption = 0x0002;8

9protected

void loadingform_mousedown(object

sender, mouseeventargs e)

10

呼叫的形式如下

loadingform frm = new loadingform("

hopegi

", "

猴健工具集

", "

啟動中...");

frm.showloading();

//一系列操作

frm.message = "

載入介面...";

//一系列操作

frm.closeloading();

1

public

partial

class

loadingform : form216

17()

1830}31

32public

string

message

34set

35);42}

43}44}

4546

public

void

showloading()

47);

53 callback.begininvoke(null, null

);54}55

56public

void

closeloading()

57);66}

67}6869

70private

string

71get 76}

7778

private

void btnclose_click(object

sender, eventargs e)

7983

84protected

void loadingform_mousedown(object

sender, mouseeventargs e)

8590

91#region windows form designer generated code

9293

///94

///required method for designer support - do not modify

95///

the contents of this method with the code editor.

96///

97private

void

initializecomponent()

98187

188#endregion

189190

private

system.windows.forms.label lblogo;

191private

192private

system.windows.forms.picturebox picloading;

193private

system.windows.forms.label lbmsg;

194private

system.windows.forms.picturebox btnclose;

195196 }

loadingform

仿MSN的冒泡窗體

1 新建一工程 在form1上放乙個button按鈕 2 新增引用popprogram.dll 3 程式頂部寫入 private withevents taskbarnotifier2 as popprogram.popprogram 4 初始化資料form1 load事件 private sub ...

C WPF有趣的登入載入窗體

時間如流水,只能流去不流回!點讚再看,養成習慣,這是您給我創作的動力!本文 dotnet9 已收錄,站長樂於分享dotnet相關技術,比如winform wpf asp.net core等,亦有c 桌面相關的qt quick和qt widgets等,只分享自己熟悉的 自己會的。站長使用.net co...

程式的載入

當乙個程式使用fork 建立了乙個子程序時候,這個子程序共享父程序的 和資料,所以通常再用exec 載入執行另乙個新程式,此時子程序的 資料 包括堆 棧 將完全被新程式替換掉,並在子程序中開始執行新程式,這個過程就是新程序的載入,下面就以0.11核的exec 函式為基礎說一下linux新程序的載入過...