計時器機制俗稱"心跳",表示以特定的頻率持續觸發特定事件和執行特定程序的機制。在開發Windows應用商店應用的過程中,可以使用定義在Windows::UI::Xaml命名空間中的DispatcherTimer類來創建計時器。DispatcherTimer類包含了如下的成員:
- Tick事件,周期性觸發的事件。
- Start函數,用于啟動計時器。
- Stop函數,用于停止計時器。
- Interval屬性,設置觸發Tick事件的時間周期,此屬性值的類型為TimeSpan。
簡單介紹了DispatcherTimer類之后,接下來模擬實現一個簡易的計時器。在Visual Staudio 2012中新建一個Visual C++的Windows應用商店的空白應用程序項目,并命名為DispatcherTimerDemo,接著在MainPage.xaml文件的Grid元素中添加如下的代碼,用于布局前臺界面。
<StackPanel HorizontalAlignment="Center" Margin="50,300,0,0">
<TextBlock x:Name="ClockText" FontSize="24"></TextBlock>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button x:Name="Start" Click="StartClick" Content="開始" Grid.Column="0"></Button>
<Button x:Name="Stop" Click="StopClick" Content="停止" Grid.Column="1"></Button>
</Grid>
</StackPanel>
在上面的代碼中,添加了一個TextBlock控件和兩個按鈕。將這個TextBlock控件命名為ClockText,用來顯示計時器的計時。兩個按鈕分別為"開始"按鈕和"停止"按鈕,其中"開始"按鈕用來啟動計時器,"停止"按鈕用來停止計時器。
布局了前臺界面以后,接下來添加計時器的后臺實現代碼。打開MainPage.xaml.h頭文件,添加如下的代碼:
private:
????//聲明DispatcherTimer類型變量timer
????Windows::UI::Xaml::DispatcherTimer^ timer;
????//聲明TimeSpan類型變量timeSpan
????Windows::Foundation::TimeSpan timeSpan;
????//聲明int32類型變量
????int32 highNum;
????//聲明int32類型變量
????int32 lowNum;
在上面的代碼中,使用private關鍵字聲明了四個私有的成員變量,分別為timer、timeSpan、highNum和lowNum,其中timer是一個DispatcherTimer類型的變量,用來表示計時器,timeSpan為TimeSpan類型的變量,用來表示時間。highNum和lowNum都為int32類型的變量,分別代表計時器的十位數和個位數。
聲明了上述的變量之后,接下來打開MainPage.xaml.cpp源文件,并在構造函數中添加如下的代碼:
MainPage::MainPage()
{
????InitializeComponent();
????//創建DispatcherTimer類的對象
????timer=ref new DispatcherTimer();
????//為Tick事件添加事件函數
????timer->Tick +=ref new EventHandler<Object^>(this,&DispatcherTimerDemo::MainPage::DispatcherTimerTick);
????// Duration屬性記錄的時間為1s
????timeSpan.Duration=10000000;
????//設置時間間隔
????timer->Interval=timeSpan;
????//highNum變量賦值0
????highNum=0;
????//lowNum變量賦值0
????lowNum=0;
}
在上面的代碼中,初始化一個DispatcherTimer類的對象timer,并為timer對象的Tick事件添加事件處理函數DispatcherTimerTick,后面將介紹DispatcherTimerTick函數的具體實現代碼。然后把timeSpan變量的Duration屬性賦值為10000000,并將timeSpan變量賦值給timer對象的Interval屬性,使timer對象的Tick事件每1秒觸發一次。最后將highNum變量和lowNum變量分別賦值為0,用于表示計時器的起始時間。
在實現DispatcherTimerTick函數之前,首先需要在MainPage.xaml.h頭文件中進行聲明,代碼如下所示:
public:
????//更新計時器計時
????void DispatcherTimerTick(Object^ sender, Object^ e);
在上述代碼中,使用public關鍵字聲明一個公有的DispatcherTimerTick函數,此函數用來更新計時器的計時,并將更新后的計時顯示到前臺界面中。
聲明了DispatcherTimerTick函數以后,接下來在MainPage.xaml.cpp源文件中添加DispatcherTimerTick函數的實現代碼,具體代碼如下所示:
//更新計時器計時
void DispatcherTimerDemo::MainPage::DispatcherTimerTick(Object^ sender, Object^ e)
{
????//當lowNum小于9時,lowNum增1
????if(lowNum<9)
????{
????????lowNum++;
????}
????else
????{
????????//當lowNum大于9時,將lowNum設為0
????????lowNum=0;
????????//highNum小于9時,highNum增1
????????if(highNum<9)
????????{
????????????highNum++;
????????}
????????else
????????{
????????????//highNum大于9時,將highNum設為0
????????????highNum=0;
????????}
????}
????//將計時顯示到TextBlock控件中
????ClockText->Text="開始計時:"+highNum+lowNum;
}
在上面的代碼中,當lowNum變量的值小于9時,lowNum變量自增1。而當lowNum變量的值大于9時,將lowNum變量賦值為0,并設置highNum變量的值。同樣,當highNum變量的值小于9時,highNum變量自增1。而當highNum變量大于9時,將highNum變量賦值為0。最后將highNum變量和lowNum變量賦值給名為"ClockText"的TextBlock控件的Text屬性,用于將計時顯示到前臺界面中。
添加了DispatcherTimerTick函數的實現代碼后,接下來為"開始"按鈕添加單擊事件處理函數StartClick。在MainPage.xaml.h頭文件中添加如下的代碼,用來聲明StartClick函數。
public:
????//啟動計時器
????void StartClick(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
聲明了StartClick函數之后,接下來在MainPage.xaml.cpp源文件中添加StartClick函數的實現代碼,在此函數中調用timer對象的Start函數來啟動計時器。具體代碼如下所示:
//啟動計時器
void DispatcherTimerDemo::MainPage::StartClick(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
????timer->Start();
}
接著給"停止"按鈕添加單擊事件處理函數StopClick,在MainPage.xaml.h頭文件中添加如下的代碼,用來聲明StopClick函數。
public:
????//停止計時器
????void StopClick(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
聲明了StopClick函數之后,接下來在MainPage.xaml.cpp源文件中添加StopClick函數的實現代碼,在此函數中調用timer對象的Stop函數來停止計時器。具體代碼如下所示:
//停止計時器
void DispatcherTimerDemo::MainPage::StopClick(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
????timer->Stop();
}
運行DispatcherTimerDemo項目后,單擊"開始"按鈕啟動計時器,顯示如圖20-1所示的計時器界面。
圖20-1 計時器