軟體啟動閃屏的原理與實現

2021-06-09 05:39:05 字數 1527 閱讀 5612

想給公司的軟體加乙個啟動閃屏,看看有現成的源**沒有,結果上網看了一下,沒有合適的,有人做了閃屏,卻是阻塞式的,也就是說什麼都不幹,讓主程式sleep,光閃屏給使用者看,這哪是閃屏嘛,連閃屏的基本作用都沒弄明白,就開始發文章號稱實現了多帥的效果,服了。之後自己寫了乙個,這裡共享一下閃屏的思路。

閃屏的本意,是因為軟體啟動過程比較慢,動態顯示一些資訊給使用者,防止使用者過於傻等而不爽。以前vc6時代可以自動加入這個功能,vs2008反而沒有了,需要自己來實現了。

由於**在公司不能拿出來,這裡共享一下思路。

1  從cwinthread繼承乙個類,比如叫cflashthread,在這個類中,增加以下方法:

1  addmsg(lpctstr szmsg);

2  addmsg(const cstring& strmsg);

3  cstring& getmsg();

4  setexitflag();

實現過程很簡單,用乙個cstringarray,儲存傳入進來的字串。getmsg函式,會自動將第乙個字串返回,並移除cstringarray佇列的第乙個。注意addmsg和getmsg,要增加ccriticalsection,進行保護,防止多執行緒同時操作。

1  申明乙個影象變數: gdiplus::image *m_image

2  實現乙個createflashwnd函式,在這個函式中,載入圖形。然後呼叫create,建立出主視窗,選擇topmost屬性。視窗大小使用m_image的大小,可以getwidth(),getheight(),然後再oncreate裡面,呼叫 centerwindow(),將圖形移動到顯示器的中心。

3  在onpaint中,呼叫gdiplus的 drawimage函式,把影象畫到主介面。

4  在cwinthread的oninstance裡面建立cflashwnd的例項。

3  原來的主程式中**修改於邏輯:

1   在instance中,呼叫afxbeginthread(runtime_class(cflashthread)),建立出閃屏執行緒。

2  保留建立的指標物件,增加乙個函式,addflashmsg(lpctstr strmsg),在這個函式中,呼叫cflashthread中,addmsg,函式,addmsg在將文字加入到array之後,會向cflashwnd傳送乙個訊息,postmessage(wm_***_),這個是乙個自定義訊息。

3  cflashwnd收到該訊息之後,從array中,呼叫getmsg獲得最前面的第乙個字串,然後getdc,將該文字畫到閃屏的最底下去,這裡要做好背景的處理。

4  任何地方都可以呼叫主程式的addflashmsg函式,增加訊息通知文字。

5  主程式覺得差不多了,該退出了,直接呼叫setexitflag函式,這個函式會導致cflashwnd中產生乙個退出訊息,收到這個時間之後,可以做一些漸隱的效果,定時器即可。然後向cflashthread傳送wm_quit訊息。退出閃屏。

以上是主要的實現邏輯,細節部分需要仔細處理,經過試驗,大概400行**,效果非常棒,啟動主介面後,閃屏介面出現,並且閃屏介面下面不停地顯示文字資訊,然後閃屏消失,主介面出現。

android開發 4 閃屏的實現

閃屏呢,就是splashscreen,也可以說是啟動畫面,就是啟動的時候,閃 展示 一下,持續數秒後,自動關閉。android的實現非常簡單,使用handler物件的postdelayed方法就可以實現。在這個方法裡傳遞乙個runnable物件和乙個延遲的時間。該方法實現了乙個延遲執行的效果,延遲的...

android開發 4 閃屏的實現

閃屏呢,就是splashscreen,也可以說是啟動畫面,就是啟動的時候,閃 展示 一下,持續數秒後,自動關閉。android的實現非常簡單,使用handler物件的postdelayed方法就可以實現。在這個方法裡傳遞乙個runnable物件和乙個延遲的時間。該方法實現了乙個延遲執行的效果,延遲的...

安卓專案實現閃屏的功能

方法1 在主檔案中寫入 取消標題 this.requestwindowfeature window.feature no title 取消狀態列 this.getwindow setflags windowmanager.layoutparams.flag fullscreen,windowmana...