感謝IT之家網友一道殘陽鋪水中的原創投稿

大概很早以前,每天深夜或者週二下午,打開電視都會看到這樣類似下圖的畫面。這種畫面被稱爲測試圖,也叫測試卡,是電視臺在正式節目之前播放的供用戶校驗電視圖像的畫面,而電視臺也通常在這個間隙對設備進行維護。而如今越來越多的電視臺加入了 24 小時播出的行列,因此觀衆看到測試圖的機會就越來越少了。

午夜 12 點的守候:教你打造 “IT之家電視臺”

今天我們就來虛擬一張 “IT之家電視臺”的測試圖。用到的軟件,PowerPoint 就夠了。

1、先從網上找到空白(即不含臺標、報時等信息)的測試圖大圖,並將其設置爲幻燈片的背景,再在合適的位置上加上臺標、電視臺信息、主報時和右上角角標報時,並應用上美觀的格式。做完以後,就像下圖。

午夜 12 點的守候:教你打造 “IT之家電視臺”

這就完成了嗎?當然不是,那就沒必要寫一篇文章了。現在的幻燈片還是靜態的,我們可要讓它動起來,讓報時器變成名副其實的報時器。於是 VBA 就登場了。

2、啓動 VBA 編輯器(該編輯器的入口在 “開發工具”選項卡下。該選項卡默認隱藏,可以在功能區設置中取消隱藏),從 “插入”菜單中新建一個標準模塊。

新建一個過程,名爲 Tick,並填充如下代碼。

Sub Tick()

With ActivePresentation.Slides(1)

.Shapes(3).TextFrame.TextRange = Format(Date, "yyyy-MM-dd")

.Shapes(4).TextFrame.TextRange = Format(Time, "hh:mm:ss")

.Shapes(5).TextFrame.TextRange = Format(Time, "hh:mm:ss")

End With

End Sub

代碼說明:文本框和形狀等本質上是屬於 shape 類型的,在一張幻燈片上添加的 shape 可以通過其下的 shapes 集合來訪問。在本例中,shapes(3)表示主報時的日期部分,shapes(4)表示主報時的時間部分,shapes(5)則表示右上角的角標報時。所以上述代碼的作用是刷新一次報時器。

3、刷新報時器的代碼是寫完了,但是無論你進行什麼操作,這段代碼都不會運行,因爲沒有觸發條件。而我們希望在啓動幻燈片放映後,執行該代碼。於是便引入了一個能夠自動運動的宏 OnSlideShowPageChange。如若把過程命名爲該名稱,則它所包含的代碼會在放映時幻燈片切換時被執行——其實並不是啓動時執行,但是因爲現在只有一張幻燈片,所以可以大致等效。於是就有了這樣的代碼:

Sub OnSlideShowPageChange()

Call Tick()

End Sub

然後啓動幻燈片放映,發現時間確實被刷新了!但是,好像哪裏不對勁。時間刷新了一次後,它就不走了。於是我們應該來個定時器之類的控件,讓 Tick 過程能每秒執行一次。然而,VBA 並不像 VB6.0 一樣提供定時器控件。

午夜 12 點的守候:教你打造 “IT之家電視臺”

4、這並不意味着我們就束手無策了。既然沒有定時器控件,那就不用控件來實現唄。我們仍可以通過 Windows API 來實現定時器的功能,先聲明 API 函數:

Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

代碼說明:SetTimer 和 KillTimer 是相反的,前者是設置計時器(開始計時),後者是取消計時器(停止計時)。它們的參數中,hwnd 是窗口的句柄(類似於 ID),nIDEvent 是計時器的 ID,uElapse 是計時間隔(以毫秒爲單位),lpTimerFunc 是要讓計時器執行的函數或者過程。而因爲參數中還要求句柄,那麼需要再來一個函數來獲取活動窗體的句柄。

Public Declare Function GetActiveWindow Lib "user32" () As Long

5、接着,我們把 OnSlideShowPageChange 過程中的代碼修改如下:

Sub OnSlideShowPageChange()

SetTimer GetActiveWindow, 101, 1000, AddressOf Tick

End Sub

再次啓動幻燈片放映,我們發現時間真的一秒一下地走起來了!(文末會上效果圖)但是注意到角標報時一直懸掛在右上角,而通常電視臺只會在半點和整點時顯示角標報時。有什麼辦法可以做到這點呢?當然有!

6、新建一個判斷是否爲半點或整點的函數 ifHalfHour:

Function ifHalfHour()

Dim TimeValue As Double

TimeValue = CDbl(Time) * 86400

If TimeValue Mod 1800 >= 1770 Or TimeValue Mod 1800 <= 30 Then

ifHalfHour = True

End If

End Function

代碼說明:time 是 date 類型,轉成 double 表示的當前時間佔全天的比值。比如 12:00:00 正好時一天的正中,因此表示 12:00:00 的 date 轉換爲 double 後正好是 0.5。那麼可以再乘上一天的總秒數 86400 秒,來表示是一天中的第幾秒,再根據除以 1800 秒(半個小時是 1800 秒)所得的餘數,即可判斷是否到半點或整點了。餘數 1770 表示 XX:29:30 或 XX:59:30,餘數 30 表示 XX:30:30 或 XX:00:30。

7、接着我們把表示角標報時的 shapes(5)的 visible(是否可見)屬性與該函數的返回值綁定在一起。在 Tick 過程的 With 塊中,新增一行:

.Shapes(5).Visible = ifHalfHour

這樣任務就基本完成了。另外,我們還希望能在退出幻燈片放映後能夠停止計時,能重置報時器等,於是就引入了 OnSlideShowTerminate(在放映結束時自動運行)和 Reset(尚未定義觸發條件)過程:

Sub OnSlideShowTerminate()

KillTimer GetActiveWindow, 101

End Sub

Sub Reset()

With ActivePresentation.Slides(1)

.Shapes(3).TextFrame.TextRange = "0000-00-00"

.Shapes(4).TextFrame.TextRange = "00:00:00"

.Shapes(5).TextFrame.TextRange = "00:00:00"

.Shapes(5).Visible = True

End With

End Sub

現在奉上半點報時時的效果動圖,報時長達 1 分鐘(動圖效果:點此觀看)。

更多設想:爲了豐富測試圖的內容,大家還可以加入背景音樂;當然也可以把 “IT之家電視臺”再辦下去,讓它開播等等。

最後給出做好的 PowerPoint 文檔、效果圖、測試卡底圖等(點此下載),打開的時候別忘了允許宏運行。大家發揮想象,自己玩去吧。

相關文章