這一次我來講解一個非常簡單的倒計時效果(沒太大技術含量,所以最初原文發於我的QQZone中)。它的應用情境是這樣的,它是一個“全域”性質的提醒,以一種醒目的方式告知使用者某個重要事件即將發生,同時不打斷使用者的當前操作。視覺效果是在螢幕的正中間顯示一個正在倒數的數字,如下:
然後我們隨便用VC建立一個win32應用程式項目,倒計時的數字實際上是用一個視窗來呈現的,也就是在程式中的一個對話方塊。因此在資源中插入一個對話方塊,刪除掉對話方塊上的任何控制項,然後設定它的屬性為 toolwindow,邊框為 none。
我們可以使用 GDI 在視窗上繪製出倒計時的數字,如果像我一樣想要追求更漂亮點的顯示效果,我使用了自訂的圖片,包括兩張位元影像,一個是繪製了0~9所有我們需要的數位圖片,另一個是視窗的背景(邊框)。如所示(圖片有所縮小):
背景:
數字:
倒計時視窗需要有以下視窗樣式:
WS_EX_TOOLWINDOW: 這個可以在設定視窗屬性中打鉤設定好。toolwindow的本意通常是指那些可以浮動的工具列視窗,它們的特點是標題列比普通視窗要窄,標題列的標題字型也比普通視窗的標題字型小。最關鍵的特徵是,這種視窗不會在工作列上顯示按鈕,也不會出現在Alt-Tab視窗列表中。這正是我們需要這個樣式的原因。
WS_EX_LAYERED: 圖層視窗。這樣我們就可以指定視窗的透明度和透明色。比如背景位元影像中的圓角處我們使用洋紅填充,這樣視窗上具有透明色的地方就不會顯示出來。同時可以設定視窗使它們具有半透明效果。
WS_EX_TRANSPARENT: “透明”的視窗。這個透明不是說視覺上,而是在於滑鼠事件上透明。也就是說,我們的視窗不希望接收滑鼠事件,不希望擁有焦點,因為倒計時視窗僅僅用於顯示資訊,不希望幹擾使用者的正常操作(比如他們正在聊天或者編輯文檔)。這樣,滑鼠在視窗上移動或者點擊時,訊息都將被發送到下面的視窗。
WS_EX_TOPMOST: 頂層視窗。這個簡單了,就是永遠在最上面的視窗。這個屬性我們本質上通過SetWindowPos API 函數設定上去。
在原文中我還講解了很多很基本的東西,比如函數中的 static 的局部變數, QQMUSIC的歌詞視窗的實現等。由於這些東西很簡單,就不詳細陳列了。
以下是其中一條:
假設有一個大矩形 rcBig,一個小矩形 rcSmall,我們把小矩形置中的放在大矩形中央,那麼小矩形的左上方座標(以大矩形的左上方為原點)是多少?答案是:
left = (rcBig.width - rcSmall.widht) /2;
top = (rcBig.height - rcSmall.height)/2;
這個計算式在介面布局時經常用到。同理,在上面的繪製代碼中我們也是用這種方法定位每個數位左上方座標的。也是用這個方法去設定視窗在螢幕上置中的。
下面我們補充一下原始碼的下載串連:
http://files.cnblogs.com/hoodlum1980/StretchBlt.rar
========================================
補充一則:把一個 int 數字 n 格式化成16進位的字串(前面補零成0位):
例如,輸入n=10,要求輸出 0x0000000A;
C++: sprintf( buffer, "0x%08X", n);
C#: string s = string.Format( "0x{0:X08}", n);