制作一个倒计时窗口

简介:   这一次我来讲解一个非常简单的倒计时效果(没太大技术含量,所以最初原文发于我的QQZone中)。它的应用场景是这样的,它是一个“全局”性质的提醒,以一种醒目的方式告知用户某个重要事件即将发生,同时不打断用户的当前操作。

  这一次我来讲解一个非常简单的倒计时效果(没太大技术含量,所以最初原文发于我的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);

 

 

目录
相关文章
|
运维 负载均衡 网络协议
LVS详解(六)——LVS DR模式实战
LVS详解(六)——LVS DR模式实战
347 5
|
存储 自然语言处理 小程序
如何制作产品介绍二维码(一):编辑二维码内容
本篇主要以官方模板「产品详情介绍」为例,教大家如何从0开始制作单个产品介绍二维码。
520 2
|
边缘计算 安全 中间件
软件体系结构 - 嵌入式系统(4)- 嵌入式中间件
软件体系结构 - 嵌入式系统(4)- 嵌入式中间件
679 0
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
【4月更文挑战第6天】Java的`java.util.concurrent.atomic`包提供了一系列原子类,如`AtomicInteger`和`AtomicLong`,利用CPU原子指令保证无锁情况下变量更新的原子性,从而实现线程安全。这些类在高并发场景下能避免线程阻塞,提高性能。`AtomicInteger`和`AtomicLong`支持原子地增加、减少和设置值,而`AtomicReference`则适用于原子更新引用对象。尽管原子类具有非阻塞、线程安全和易用等优点,但它们仅保证单个变量的原子性,复杂操作可能仍需传统同步机制。了解其工作原理和局限性,有助于提升并发应用性能。
286 0
圆形算法识别
圆形算法识别
|
3月前
|
XML Java 测试技术
Springboot使用 @PostConstruct 和 @PreDestroy 了解 Bean 的生命周期
本文深入解析了 Spring 框架中 Bean 的生命周期,重点介绍了 `@PostConstruct` 和 `@PreDestroy` 注解的使用及其在初始化和销毁阶段的作用。内容涵盖 Bean 生命周期的各个阶段、注解的执行顺序、应用场景及限制,并对比了其他生命周期管理方式,如 `InitializingBean`、`DisposableBean` 和 XML 配置,帮助开发者更好地掌握 Spring 容器中 Bean 的管理机制。
272 0
|
编解码 Java Maven
阿里云视觉智能开放平台(VIAPI)人脸属性表情识别Python SDK使用说明
本文为您介绍表情识别RecognizeExpression的语法及示例。
1332 0
|
3月前
|
机器学习/深度学习 数据采集 传感器
【WOA-CNN-LSTM】基于鲸鱼算法优化深度学习预测模型的超参数研究(Matlab代码实现)
【WOA-CNN-LSTM】基于鲸鱼算法优化深度学习预测模型的超参数研究(Matlab代码实现)
236 0
|
5月前
|
监控 安全 调度
如何开发ERP系统中的计划管理板块(附架构图+流程图+代码参考)
本文介绍了ERP系统中计划管理模块的重要性及开发方法,涵盖生产计划、物料需求、调度优化等功能,并提供代码示例与落地建议,帮助企业提升生产效率、优化资源配置。
|
存储 监控 JavaScript
我应该使用 Pinia 还是 Vuex?
我应该使用 Pinia 还是 Vuex?