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