demo描述
这是一款基于C写的小案例,是一个可以唱歌的时钟表盘.
因为表盘上的图标和数字和清除窗口的颜色重合了,出现镂空,毕竟美工太费时间了,我也不是专业的,所以P的有些拉胯,大家可以自己找素材,将我打包的素材替换即可,注意命名要一直,后缀要统一,同时也将它封装成了桌面应用.
源码和素材都打包好了,在下面.
一. 先上图
桌面上的太空人和uninstall分别是应用程序和卸载程序,安装程序放在了下面.
二. 源码
2.1 主函数main.cpp
/*
project:华为太空人手表表盘
author:多木
2023年2月26日14:10:47
Resource:www.duomu.xyz
*/
#include<graphics.h>
#include<stdio.h>
#include<mmsystem.h>
#include "date.h"
#pragma comment(lib,"winmm.lib")
IMAGE imgs[71];
IMAGE szimg[11];
IMAGE szimg2[10];//显示秒
void drawTime() {
//获取时间,建议将其封装起来,这里我只封装了一个获取时分秒的
int hour, minute, second;
getTime(&hour,&minute,&second);
//绘制时间
int h1 = hour / 10;
int h2 = hour % 10;
putimage(-105, -70,&szimg[h1]);
putimage(-70, -70, &szimg[h2]);
//画时间的点
putimage(-30, -60, &szimg[10]);
putimage(-30, -35, &szimg[10]);
//画分
int m1 = minute / 10;
int m2 = minute % 10;
putimage(-10, -70, &szimg[m1]);
putimage(30, -70, &szimg[m2]);
//画秒
putimage(70, -45, &szimg2[second / 10]);
putimage(90, -45, &szimg2[second % 10]);
}
int main() {
//1.创建表盘窗口
//1.1创建一个和桌面一样大小的窗口
//1.2把整个窗口设置为顶层,透明
initgraph(
GetSystemMetrics(SM_CXSCREEN),//动态获取桌面宽度
GetSystemMetrics(SM_CYSCREEN)//桌面高度
);
//去除窗口标题栏
//找到指定窗口标题栏
HWND hwnd = GetHWnd();//获取当前窗口的窗口句柄
SetWindowLong(
hwnd, //设置窗口属性
GWL_STYLE,//设置窗口风格
GetWindowLong(hwnd, GWL_STYLE) - WS_CAPTION
);
//窗口顶层,同时设置位置和大小
SetWindowPos(
hwnd,//设置的目标窗口
HWND_TOPMOST,//顶层窗口
0, 0, //窗口左上角的坐标
GetSystemMetrics(SM_CXSCREEN),//动态获取桌面宽度
GetSystemMetrics(SM_CYSCREEN),//桌面高度
SWP_SHOWWINDOW
);
//窗口透明
//1. 要求窗口设置为"分层窗口"
//2. 再把分层窗口设置为透明
SetWindowLong(hwnd,
GWL_EXSTYLE,//窗口的拓展样式
GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED
);
//设置分层窗口透明度
SetLayeredWindowAttributes(
hwnd,
//RGB(183, 186, 191),//指定需要变成透明的背景色(灰色)
RGB(0, 0, 0),//指定需要变成透明的背景色(灰色)
0,//透明度 0:全透明 255:完全透明
LWA_COLORKEY//透明方式:把窗口所有参数2的颜色变成透明
);
// 清理窗口
//setbkcolor(RGB(183, 186, 191 ));//设置背景填充色
setbkcolor(RGB(0, 0, 0));//设置背景填充色
cleardevice();//使用背景颜色清理窗口
//设置坐标原点
setorigin(GetSystemMetrics(SM_CXSCREEN) - 150, 150);
//绘制表盘
IMAGE bg;
loadimage(&bg,
"ring.png",
300, 300,//表盘尺寸
true//等比缩放
);
//看54行代码知道坐标中心位置
putimage(-150, -150, &bg);//显示表盘
//画一个rgb(183,186,191)圈,去除毛刺
setlinecolor(RGB(0, 0, 0));//画笔颜色
setlinestyle(PS_SOLID, 8);//画笔颜色 实线,数字越大,线条越粗
circle(0, 0, 152);//尽量不要超过(300/2 + 8/2)
//音乐播放
mciSendString("play bg.mp3 repeat", 0, 0, 0);
//画太空人
//预加载太空人图片帧
char imgName[64];
for (int i = 0; i < 71; i++) {
// 文件名 图层 70
sprintf_s(imgName, sizeof(imgName), "图层 %d.png", 71 - i);
loadimage(&imgs[i], imgName, 75, 75, true);
}
//预加载数字图片
for (int i = 0; i < 10; i++)
{
sprintf_s(imgName, sizeof(imgName), "%d.png", i);
loadimage(&szimg[i], imgName, 30, 60, true);
loadimage(&szimg2[i], imgName, 15, 30, true);
}
loadimage(&szimg[10], "rect.jpg", 10, 10,true);
//死循环,使图片一直渲染
int k = 0;
while (1)
{
putimage(-40, -15, &imgs[k]);
k = (k + 1) % 71; //取余数,使图片从0...70 ... 0 .... 70
Sleep(30);
drawTime();
}
system("pause");
return 0;
}
2.2 时间函数date.cpp
#include "date.h"
#include<time.h>
#include<stdio.h>
//获取日期
void getDate(int* year, int* mouth, int* day, char* longliStr)
{
}
//获取周
void getWeek(int y, int m, int d, char* str)
{
}
//获取时间
void getTime(int* hour, int* minute, int* second)
{
time_t t = time(NULL);
struct tm* local = localtime(&t);
*hour = local->tm_hour;
*minute = local->tm_min;
*second = local->tm_sec;
}
2.3 头文件date.h
#pragma once
void getDate(int* year, int* mouth, int* day, char* longliStr);
void getWeek(int y, int m, int d, char* str);
void getTime(int* hour, int* minute, int* second);
三. 源码和素材地址
下载地址
PS:代码有点拉胯,美工也拉了,但是能跑,大家如果有好的素材,可以将里面的素材替换即可