计时器机制俗称"心跳",表示以特定的频率持续触发特定事件和执行特定程序的机制。在开发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 计时器

Win10系列:VC++ 定时器的更多相关文章

  1. Win10系列:VC++调用自定义组件3

    (3)C++/CX调用WinRT组件 在解决方案资源管理器中右键点击解决方案图标,选择添加一个Visual C++的Windows应用商店的空白应用程序项目,并命名为FileCPP.接着右键点击Fil ...

  2. Win10系列:VC++调用自定义组件2

    (2)C#调用WinRT组件 在解决方案资源管理器中右键点击解决方案图标,选择添加一个Visual C#的Windows应用商店的空白应用程序项目,并命名为FileCS.接着右键点击FileCS项目的 ...

  3. Win10系列:VC++调用自定义组件1

    通过20.9.1小节中的代码和步骤编写了一个名为"FilePickerComponent"的WinRT组件,接下来将在上一小节所新建的项目基础上,继续介绍如何在不同的语言所编写的应 ...

  4. Win10系列:VC++ Direct3D图形绘制1

    通过前面的介绍,相信读者已经了解了如何新建一个用于开发Direct3D应用程序的项目模版,以及这个项目模版中用于绘制立体图形的主要函数.在本小节中,将通过一个具体的示例来介绍如何使用Visual St ...

  5. Win10系列:VC++ Direct3D模板介绍2

    (3)CreateDeviceResources函数 CreateDeviceResources函数默认添加在CubeRenderer.cpp源文件中,此函数用于创建着色器和立体图形顶点.接下来分别介 ...

  6. Win10系列:VC++ Direct3D模板介绍3

    (4)Render函数 默认定义在CubeRenderer.cpp源文件中的Render函数用于绘制立体图形,此函数的实现代码如下所示: void CubeRenderer::Render() {   ...

  7. Win10系列:VC++ Direct3D模板介绍1

    Visual Studio为开发Direct3D应用程序提供了便捷的模版,读者可以不必手动去新建Direct3D中所使用到的基础资源,而只需专注于图形的绘制.本小节主要为读者介绍这个模版中用于绘制图形 ...

  8. Win10系列:VC++ Direct3D开发基础1

    在介绍如何使用Direct3D项目模版来绘制立体图形之前,首先为读者介绍在Direct3D应用程序开发过程中涉及到的一些常用概念. (1)资源 资源是指可以被Direct3D图形管线所访问的内存空间, ...

  9. Win10系列:VC++绘制文本

    20.7.2小节介绍了如何使用Direct2D在应用窗口中绘制图片,本小节将基于20.7.2小节的项目进一步介绍如何实现文本的绘制.打开D2DBasicAnimation.h头文件,并在D2DBasi ...

随机推荐

  1. SpringBoot简单的REST风格例子

    关于REST和RESTful的说明请移步至:怎样用通俗的语言解释REST,以及RESTful? 其实我自己也不是十分的理解,只是今天学SpringBoot时看到有个标着REST风格的简单例子,就记录一 ...

  2. Java == 和 equals 区别

    先来看一段代码 1. String str1 = new String("hello");//堆中分配一块内存,存放"hello",str1 指向内存地址 2. ...

  3. (转)linux各文件夹的作用

    原文地址:<linux各文件夹的作用> linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc. ...

  4. HeadFIrst Ruby 第二章总结 methods and classes

    HeadFIrst Ruby 第二章总结 methods and classes 前言 这一章讲了如何创建自己的 class,并且讲了在用 class 创建 object 的两个要素: instanc ...

  5. Spring Boot之Swagger2集成

    一.Swagger2简单介绍 Swagger2,它可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大RESTful API文档.它既可以减少我们创建文档的工作量,同时 ...

  6. LeetCode--013--罗马数字转整数(java)

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...

  7. ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析

    理解ActiveRecord::Concern: 参考:include和extend的区别: https://www.cnblogs.com/chentianwei/p/9408963.html 传统 ...

  8. canvas学习之粒子动画

    项目地址:http://pan.baidu.com/s/1ccTptc 粒子动画意思就是把一个图片粒子画,然后使用粒子作出动画效果,主要两个问题:一个图片如何粒子化,这里面我们使用canvas的get ...

  9. elasticsearch查询语句

    1,安装es 安装java环境 # java --versionjava version "1.8.0_65" Java(TM) SE Runtime Environment (b ...

  10. 反射API(二)

    <?php /** * 需求: * 创建一个类来动态调用Module对象, * 即该类可以自由加载第三方插件并集成进已有的系统,而不需要把第三方的代码硬编码进原有的代码. */ class Pe ...