C语言百行代码绘制圣诞水晶球

目录
  • 项目代码
  • 总结

我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉。

嗨!这里是狐狸~~

今天就是圣诞节了,再过一个星期就是2022年了,最近总是感觉伤感,有些事情就是比想象中来的快一些,希望大家都可以把握2021年最后的时间,不留遗憾吧,后天圣诞节,今天再教大家一个圣诞项目吧,圣诞水晶球,今天这个呢代码不多,但难度会有点,因为这个涉及桌面,就是可以在桌面实现,希望大家可以认真看,认真学吧。

同样,先给大家看效果吧

效果还是很不错的,再加上一个音乐,女朋友看完就马上同意你了,嘿嘿,这里就不再是简单的窗口了,难度有一些,但也不大,毕竟代码也不多,好了,认真学,认真的尝试哦!

项目代码

这是我第一次只用一个代码段,因为代码确实不多,我觉得分段就没必要了,而且其中必要的地方,我也加了详细的注释,应该还好,难就难在之前没有用Windows库,这次用了,效果看起来就会舒服很多,怎么样,学会了赶快拿给心中的那个人看吧!

#include <stdio.h>
#include <windows.h>
#include <graphics.h>
#include <commctrl.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

int main()
{
	keybd_event(VK_LWIN, 0, 0, 0);
	keybd_event('D', 0, 0, 0);
	keybd_event('D', 0, 2, 0);
	keybd_event(VK_LWIN, 0, 2, 0);

	Sleep(3000);
	int CX = GetSystemMetrics(SM_CXSCREEN);
	int CY = GetSystemMetrics(SM_CYSCREEN);

	HWND hwnd = initgraph(500,500); //创建一个窗口hwnd
	HRGN Ellip = CreateEllipticRgn(10, 32, 100+10, 100+32);//设置一个逻辑的图形rect
	SetWindowRgn(hwnd, Ellip, true);  //设置窗口的区域
	SetForegroundWindow(hwnd);
	MoveWindow(hwnd, CX / 2 - 120, CY / 2, 500, 500, true);

	mciSendString("open res/music.mp3", 0, 0, 0);    //打开
	mciSendString("play res/music.mp3 repeat", 0, 0, 0);    //播放
	bool isplay = true;  //音乐是否正在播放

	int sence = 3;  //场景
	int frame = 0;  //帧数
	IMAGE img[30];
	int maxframe[] = { 20, 7, 4, 15, 10}; //每一种场景的图片的张数
	char picpath[30] = { 0 };  //字符串 图片的路径
	for (int i = 0; i < maxframe[sence]; i++)
	{
		sprintf(picpath, "res/%02d-%02d.bmp", sence, i);
		loadimage(&img[i], picpath, 100, 100);
	}

	/*---------------------------------------------------------*/
	//获取到桌面图标的窗口
	HWND zmWnd = FindWindow("Progman","Program Manager");  //桌面窗口
	HWND bzWnd = FindWindowEx(zmWnd, 0, "SHELLDLL_DefView", NULL);  //壁纸窗口
	HWND tbWnd = FindWindowEx(bzWnd, 0, "SysListView32", "FolderView");  //图标窗口

	HWND workHwnd = NULL;
	while (tbWnd == NULL)//必须存在桌面窗口层次
	{
		workHwnd = FindWindowExA(0, workHwnd, "WorkerW", NULL);//获得WorkerW类的窗口
		if (workHwnd == NULL)
			break;//未知错误
		bzWnd = FindWindowExA(workHwnd, NULL, "SHELLDLL_DefView", NULL);
		if (bzWnd == NULL)
			continue;
		tbWnd = FindWindowExA(bzWnd, NULL, "SysListView32", NULL);
	}

	DWORD dwStyle = (DWORD)GetWindowLong(tbWnd, GWL_STYLE);
	if (dwStyle & LVS_AUTOARRANGE)
		SetWindowLong(tbWnd, GWL_STYLE, dwStyle & ~LVS_AUTOARRANGE);

	DWORD dwExStyle = (DWORD)ListView_GetExtendedListViewStyle(tbWnd, GWL_EXSTYLE);
	if (dwExStyle & LVS_EX_SNAPTOGRID)
		ListView_SetExtendedListViewStyle(tbWnd, dwExStyle & ~LVS_EX_SNAPTOGRID);

	//指挥它 威胁它 图标的窗口
	int count = SendMessage(tbWnd, LVM_GETITEMCOUNT, 0, 0);
	for (int i = 0; i < count; i++)
		SendMessage(tbWnd, LVM_SETITEMPOSITION, i, (3000 << 16) + 100);
	POINT dir[14] = { { 868 * CX / 1920, 316 * CY / 1080 }, { 730 * CX / 1920, 207 * CY / 1080 },
	{ 591 * CX / 1920, 221 * CY / 1080 }, { 515 * CX / 1920, 327 * CY / 1080 }, { 542 * CX / 1920, 469 * CY / 1080 },
	{ 610 * CX / 1920, 624 * CY / 1080 }, { 723 * CX / 1920, 746 * CY / 1080 }, { 870 * CX / 1920, 814 * CY / 1080 },
	{ 1012 * CX / 1920, 744 * CY / 1080 }, { 1130 * CX / 1920, 626 * CY / 1080 },
	{ 1219 * CX / 1920, 485 * CY / 1080 }, { 1225 * CX / 1920, 328 * CY / 1080 }, { 1156 * CX / 1920, 225 * CY / 1080 },
	{ 1012 * CX / 1920, 217 * CY / 1080 } };

	ExMessage m;                         //定义消息
	int oldsence;
	while (1){

		if (peekmessage(&m, EM_MOUSE))   //如果获取到一条鼠标消息
		{
			switch (m.message)
			{
			case WM_LBUTTONDOWN:  //点下左键  换一个场景
				oldsence = sence;
				do
				{
					sence = rand() % (sizeof(maxframe) / sizeof(maxframe[0])); //0-5
				} while (sence == oldsence);

				for (int i = 0; i < maxframe[sence]; i++)
				{
					sprintf(picpath, "res/%02d-%02d.bmp", sence, i);
					loadimage(&img[i], picpath, 100, 100);
				}
				SendMessage(hwnd, WM_SYSCOMMAND, 0xf012, 0);

				break;
			case WM_RBUTTONDOWN:
				if (isplay)  //正在播放
					mciSendString("pause res/music.mp3", 0, 0, 0);
				else
					mciSendString("play res/music.mp3 repeat", 0, 0, 0);

				isplay = !isplay; //取反
				break;
			}
		}
		else  //绘制界面
		{
			putimage(0, 0, &img[frame++]);
			if (frame > maxframe[sence] - 1)frame = 0;

			for (int i = 0; i < 14; i++)
			{
				SendMessage(tbWnd, LVM_SETITEMPOSITION, i, (dir[i].y << 16) + dir[i].x);
			}

			int x = dir[0].x;
			int y = dir[0].y;
			for (int i = 0; i < 13; i++)
			{
				dir[i].x = dir[i + 1].x;
				dir[i].y = dir[i + 1].y;
			}
			dir[13].x = x;
			dir[13].y = y;
		}
	}
	return 0;
}
 

总结

代码真的非常的少,认真理解每一行的作用,相信你们很快就可以理解了。圣诞节快到了,程序员的快乐无非就是可以代码写出一些特别的东西了,主要是确实好用,哈哈哈,不管男女,好啦,希望大家可以在圣诞节的那天都会有好运气,提前祝大家圣诞节快乐啦!

视频讲解

这次也有视频讲解,代码不多,看视频会理解的更快! 

到此这篇关于C语言百行代码绘制圣诞水晶球的文章就介绍到这了,更多相关C语言绘制圣诞水晶球内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言圣诞树的实现示例

    你们要的圣诞树它来啦! 快去送给心爱的人吧! 效果如下: #define _CRT_SECURE_NO_WARNINGS 1 #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define PI 3.14159265359f float sx, sy; typedef float Mat[4][4]; typedef float Vec[4]; void

  • C语言基于graphics.h实现圣诞树

    头文件 icon.h: #pragma once #ifndef _ICON_H_ #define _ICON_H_ #include<graphics.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<string> #include<Windows.h> #include<Mmsystem.h> #pragma comment(li

  • 如何用C语言画一个“圣诞树”

    如何用C语言画一个"圣诞树",我使用了左右镜像的Sierpinski triangle,每层减去上方一小块,再用符号点缀.可生成不同层数的「圣诞树」,如下图是5层的结果 #include <stdlib.h> int main(int argc, char* argv[]) { int n = argc > 1 ? atoi(argv[1]) : 4; for (int j = 1; j <= n; j++) { int s = 1 << j, k

  • 用C语言实现圣诞树(简易版+进阶版)

    目录 前言 初学者版: 初学者版2 以下是进阶版,更炫: 总结 前言 圣诞节快到了,这是我到CSDN度过的第一个圣诞节,也是我学习计算机的第一个圣诞节,为了让它更有意义,我呕心沥血,自己打了两版初学者版,再在网上找了一版进阶版,都十分精美,废话少说,代码奉上: 初学者版: #include<stdio.h> #include<windows.h> #include<string.h> void color(int x) { if(x>=0 && x

  • 使用C语言编写圣诞表白程序

    快到圣诞节啦,男票女票都有了嘛?没有的话,有没有喜欢的女孩子或者男孩子啊?今天就给你们分享一个圣诞节的表白程序,希望你们喜欢咯,效果是这样的: 圣诞节快到了,让我们用C语言制作一个圣诞表白程序 具体代码如下咯: // GreetingCardDemoDlg.cpp : 实现文件 // #include "stdafx.h" #include "GreetingCardDemo.h" #include "GreetingCardDemoDlg.h"

  • C语言设计一个闪闪的圣诞树

    控制台打印一个圣诞树:简简单单的C语言知识,真的很基础,小白也能看得懂哦 /******************************* 圣诞树 byC语言小白入门 *******************************/ #include<stdio.h> #include <stdlib.h> #include <time.h> #include<Windows.h> #define X 25 //画面长度 int background[20]

  • C语言百行代码绘制圣诞水晶球

    目录 序 项目代码 总结 序 我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉. 嗨!这里是狐狸~~ 今天就是圣诞节了,再过一个星期就是2022年了,最近总是感觉伤感,有些事情就是比想象中来的快一些,希望大家都可以把握2021年最后的时间,不留遗憾吧,后天圣诞节,今天再教大家一个圣诞项目吧,圣诞水晶球,今天这个呢代码不多,但难度会有点,因为这个涉及桌面,就是可以在桌面实现,希望大家可以认真看,认真学吧. 同样,先给大家看效果吧 效果还是很不错的,再加上一个音乐,女朋友看完就马上

  • C/C++百行代码实现热门游戏消消乐功能的示例代码

    游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 Texture t1; t1.loadFromFile("images/bg2.png"); 当鼠标第一次单击时,记录下位置,第二次单击又记录一下位置,如果两个小方块相邻就交换位置,如果不相邻如图c的位置则,不发生变化 判断行或列如果三张一样的图片相邻,清除一下图片,进行刷新 实列 #i

  • Python三百行代码实现飞机大战

    目录 一. 动态效果图如下 二. 思路框架 三. Python代码实现 四. 小结 一. 动态效果图如下 先来看下飞机大战游戏最终实现的动态效果图. 二. 思路框架 plane_sprite.py文件内容 1.导入需要使用的模块 import random import pygame 在导入pygame之前,需要先使用命令: pip install pygame 进行包模块的安装 2.设置屏幕大小和刷新帧率等常量 3.创建继承于pygame.sprite.Sprite的基类GameSprite

  • python百行代码自制电脑端网速悬浮窗的实现

    前言 看到某60的网速悬浮球有点心动,但是又不想装这个流氓软件,就自己用python加PyQt5自制了一个,实测还行,关键不占用电脑一点资源,已将软件打包,可自行下载使用. 预览 观看直播时实时网速. 文件结构 运行管理 开始运行时内存消耗18.3m,cpu,磁盘,网络不占用. 运行一天后内存稳定于6.4m,cpu,磁盘,网络不占用. 整体思路 使用psuti.net_io_counters 监控电脑网卡IO 将流量数据格式化,统计每次数据总和保存在本地<流量使用情况.txt>(这个是个缺陷,

  • python百行代码实现汉服圈图片爬取

    目录 分析网站 子链接获取 获取标题和图片地址 保存图片 主函数 平时旅游的时候,在旅游景区我们经常可以看到穿各种服饰去拍照的游客,也不会刻意多关注.前两天浏览网页无意看到一个网站,看到穿汉服的女孩是真的很好看.无论是工作需要还是创作文案,把这么漂亮的图片来当作素材都是一个很好的idea.有需要,我们就爬它,爬它,爬它! 话不多说,我们下面详细介绍图片爬取. 分析网站 网址如下: https://www.aihanfu.com/zixun/tushang-1/ 这是第一页的网址,根据观察,第二页

  • Python如何使用27行代码绘制星星图

    前言 每一个孩子都像星空中的一颗星星,散发着自己所特有的光芒照亮着整个夜空.今天就带大家用27行Python代码绘制一幅满天星吧. 全局设置 在绘制满天星的过程中要运用到turtle工具,它是Python的标准库,也可以形象的称它为海龟库,它可以描绘绘图的轨迹,操作简单.快捷.首先,我们要做一些有关全局的设置 这一步主要是对turtle的画笔大小.绘画延迟以及画布大小进行设置. 绘制一个五角星 绘制满天星的关键就在于如何绘制出一个五角星,接下来通过创建一个有关绘画五角星的函数 上述代码中主要涉及

  • 极致之美——百行代码实现全新智能语言第1/6页

    首先要解释一下: "极致之美"不是说月儿的这篇文章,因为本人还没有自大到这种程度:P,它形容的是Lisp和javascript结合的优美形态. 本来以下内容是要在无优首发的,但是不巧完成文章的当天忽然发现无优"弹"了,直到上周末才恢复=.=,由于不能等那么久,所以就先放到月儿在CSDN上的博客里去了. 正如标题所描述的,下文是关于用javascript实现类Lisp语言的技巧,然而重点不在于如何实现一门编程语言,而是在于通过思考和实现过程展示javascript的简

  • 百行代码实现基于Redis的可靠延迟队列

    目录 原理详解 pending2ReadyScript ready2UnackScript unack2RetryScript ack consume 在之前探讨延时队列的文章中我们提到了 redisson delayqueue 使用 redis 的有序集合结构实现延时队列,遗憾的是 go 语言社区中并无类似的库.不过问题不大,没有轮子我们自己造

  • 神级程序员JavaScript300行代码搞定汉字转拼音

    一.汉字转拼音的现状 首先应该说,汉字转拼音是个强需求,比如联系人按拼音字母排序/筛选:比如目的地(典型如机票购买) 按拼音首字母分类等等.但是这个需求的解决方案,但好像没听过什么巧妙的实现(特别是浏览器端),大概都需要一个庞大的字典. 具体到JavaScript,查查github和npm,比较优秀的处理汉字转拼音的库有pinyin 和pinyinjs,可以看到,两者都自带了庞大的字典. 这些字典动辄几十上百KB(有的甚至几MB),想在浏览器端使用还是需要一些勇气的.所以当我们碰到汉字转拼音的需

  • Go语言开发区块链只需180行代码(推荐)

    区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块.通过浏览器来查看整个链.了解所有其他关于区块链的基础知识. 但是,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法,同时为了让你更清楚得查看区块链以及块的添加,我们将网络交互的过程简化了,关于 P2P 网络比如"全网广播"这个过程等内容将在后续文章中补上.

随机推荐