赞
踩
这是一款基于C写的小案例,是一个可以唱歌的时钟表盘.
因为表盘上的图标和数字和清除窗口的颜色重合了,出现镂空,毕竟美工太费时间了,我也不是专业的,所以P的有些拉胯,大家可以自己找素材,将我打包的素材替换即可,注意命名要一直,后缀要统一,同时也将它封装成了桌面应用.
源码和素材都打包好了,在下面.
桌面上的太空人和uninstall分别是应用程序和卸载程序,安装程序放在了下面.
/* 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; }
#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; }
#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:代码有点拉胯,美工也拉了,但是能跑,大家如果有好的素材,可以将里面的素材替换即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。