游戏内鼠标光标样式切换

 参考自

通过程序设置鼠标的样式 - CodeBus

代码生成 .cur 文件附带详细注释-CSDN博客

读取当前目录里的鼠标文件 .cur


// 程序名称:设置鼠标样式的范例
// 编译环境:Visual C++ 6.0~2022,EasyX_20220116
//
#include <graphics.h>
#include <conio.h>int main()
{initgraph(640, 480);								// 创建绘图窗口HCURSOR hcur = LoadCursorFromFileA("testv2233_半透明.cur");			// 加载系统预置的鼠标样式HWND hwnd = GetHWnd();								// 获取绘图窗口句柄SetClassLongPtr(hwnd, GCLP_HCURSOR, (long long)hcur);	// 设置窗口类的鼠标样式
//	 SetClassLong(hwnd, GCL_HCURSOR, (long long)hcur);		// 设置窗口类的鼠标样式(老版本编译器请使用这行)// 按任意键退出_getch();closegraph();return 0;
}

 

生成一个鼠标光标文件 .cur

// 鼠标文件解析
//https://mp.weixin.qq.com/s?__biz=MzkwNzMzMjIyNg==&mid=2247486257&idx=1&sn=1656090e498c22f391c00d0857f4b856&chksm=c0db94dcf7ac1dcacd4618240e05595b984a05b55d5f9f44d277aae41f4353b06bfa5e4294c4&cur_album_id=2474385342163419137&scene=189#wechat_redirect
// 代码来源
//https://blog.csdn.net/jinzhuojun/article/details/8007586
// 注释添加自 @ bilibili 民用级脑的研发记录
// 结构注释来自 https://learn.microsoft.com/en-us/previous-versions/ms997538(v=msdn.10)// 注意这个格式和下文中的 WrietByte 的对应关系//typedef struct
//{
//    WORD           idReserved;   // Reserved (must be 0)
//    WORD           idType;       // Resource Type (1 for icons)									// 2 指的是 cur 鼠标静态光标文件
//    WORD           idCount;      // How many images?
//    ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
//} ICONDIR, *LPICONDIR;//typedef struct
//{
//    BYTE        bWidth;          // Width, in pixels, of the image
//    BYTE        bHeight;         // Height, in pixels, of the image
//    BYTE        bColorCount;     // Number of colors in image (0 if >=8bpp)
//    BYTE        bReserved;       // Reserved ( must be 0)
//    WORD        wPlanes;         // Color Planes
//    WORD        wBitCount;       // Bits per pixel
//    DWORD       dwBytesInRes;    // How many bytes in this resource?
//    DWORD       dwImageOffset;   // Where in the file is this image?
//} ICONDIRENTRY, *LPICONDIRENTRY;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>void Fwrite(FILE* f, char* data, int byte)				// 一次写入 byte 个字节,且只写一次
{if(1!=fwrite(data,byte,1,f)){perror("fwrite error");exit(1);}
}void WriteByte(FILE* f, unsigned int val,int byte)		// 指定写入几个字节
{char data[4];assert(byte<=4);									// 如果它的条件返回错误,则终止程序执行——菜鸟教程可查memcpy((void*)data,(void*)&val,byte);Fwrite(f,data,byte);
}void generate_ico_file(const char* filename,char * body,int width, int height, int has_alpha)
{int x,y;int index=0;int Size=0;int offset = 6+ 1*16;								// 6 = 2 +2 +2,这6个byte 是ico,cur通用的文件头。 16= 1+1+1+1 +2 +2,是一个图片的索引占 16 个字节, n个图片的索引占6*16个字节,,n个图片的因为在不同设备上使用不同型号分辨率的图片,这一堆图片都在一个 icon 或cur里int bpp=32;											// 32位的位图= 8位 alpha + 8 位 R, 8 位 G, 8 位 BFILE* outfile=fopen(filename,"wb");if(outfile==NULL){perror("fopen error");exit(1);}// icon文件头,类型与图片个数WriteByte(outfile,0,2);								// idReserved 保留位,一种格式,可用区分其他文件。WriteByte(outfile,2,2);								// idType 文件类型,如果是1 ,就是icon文件,如果是2 则是cur鼠标光标文件,这类文件格式一样。WriteByte(outfile,1,2);								// idCount 拥有的图片个数,icon为在不同屏幕上正常显示,会存储多个格式的图片以备选择// 具体一个图片的索引信息WriteByte(outfile,width,1);							// bWidthWriteByte(outfile,height,1);						// bHeightWriteByte(outfile,0,1);								// bColorCountWriteByte(outfile,0,1);								// bReserveredWriteByte(outfile,10,2);								// wPlanes					// 这里是.cur热点位置 XWriteByte(outfile,16,2);							// wBitCount					// 这里是.cur热点位置 YSize = 40 + height * ((width + 31) / 32 * 32 / 8 + width * 3);	//Note 4 bytes alignment		// 这里计算文件索引头与图像数据的总数 ,40=4+4+4+2+2+4*6 个字节。 (width+31)/32是计算int 型AND 位图个数,width / 32,但是不能确定%32 的部分,所以+31 然后再除以 32 。1个int 有4个字节,共32bit,每个bit表示一个像素是否被光栅操作 AND 覆盖,行数 * 32计算一共需要多少bit ,/8是确定有多少字节。if (bpp == 32)Size += height * width;WriteByte(outfile,Size, 4);			//dwBytesInResWriteByte(outfile,offset, 4);			//dwImageOffsetWriteByte(outfile,40, 4);				//biSizeWriteByte(outfile,width, 4);			//biWidthWriteByte(outfile,2 * height, 4);		//biHeightWriteByte(outfile,1, 2);				//biPlanesWriteByte(outfile,bpp, 2);				//biBitCountWriteByte(outfile,0, 4);				//biCompressionWriteByte(outfile,0, 4);				//biSizeImageWriteByte(outfile,0, 4);				//biXPelsPerMeterWriteByte(outfile,0, 4);				//biYPelsPerMeterWriteByte(outfile,0, 4);				//biClrUsedWriteByte(outfile,0, 4);				//biClrImportant// XOR maskfor (y=height - 1 ; y >= 0; --y)   					// 调换打印高度就不会读取了 ,确定为倒置打印,windows倒着读取数据.从左往右,从下往上,所以为了图片倒着读取之后是正的,需要把原图第一行像素数据打印到倒数最后一行{for (x = 0; x < width; ++x){index = (y * width + x) * 4;WriteByte(outfile, body[index], 1);        //BlueWriteByte(outfile, body[index + 1], 1);    //GreenWriteByte(outfile, body[index + 2], 1);    //RedWriteByte(outfile, has_alpha ? body[index + 3] : 255, 1); //Alpha}}// AND maskfor (y = 0; y < (height * ((width + 31) / 32 * 32 / 8)); ++y){WriteByte(outfile, 1, 1);						// 1 在屏幕上显示图片,0则不显示图片,表示为整个图片没有。 三元光栅操作参考}fclose(outfile);
}#define WIDTH   272										// 这里改参数只会改写分辨率,一个像素对应屏幕一个或多个像素,但不会改变图标大小。 数值过大会生成失败,原因是int数值上限比较小,不够存储数据了 
#define HEIGHT  272										// 这里改参数只会改写分辨率,一个像素对应屏幕一个或多个像素,但不会改变图标大小。数值过大会生成失败,原因是int数值上限比较小,不够存储数据了 int main()
{int image[WIDTH * HEIGHT];int i, j;for (i = 0; i < HEIGHT; ++i){for (j = 0; j < WIDTH; ++j){if(i>=10&&i<=40) 									// 0x00000000是完全透明 0x5F000000 可以看出来不完全透明,可知透明度可调节{image[i*WIDTH+j]=0x8F000088;					// Alpha 透明 0x00, red: 00, green: 00, blue: 00  各 bit 位对应 ARGB}else{image[i * WIDTH + j]  = 0xFF00ccff;  	// pure red icon, for test}}}generate_ico_file("testv2233_半透明.cur", (char *)image, WIDTH, HEIGHT, 1);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派驱动开发--搭建环境篇(保姆级)

前言&#xff1a;树莓派的环境搭建关系到之后的驱动开发&#xff0c;故一个好的环境能让你顺手完成驱动开发&#xff01;我使用的是64位树莓派4b&#xff01;有显示屏的前提&#xff01;&#xff01;&#xff01;&#xff08;因为wifi连接太刁钻了&#xff09; 一、ubantu相关 …

java算法:反转数字

看算法描述&#xff1a; 1、给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 2、如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 3、假设环境不允许存储 64 位整数&#xff08;有符号或无符号&…

Linux如何安装kernel-debuginfo包以支持获取未压缩内核映像vmlinux?(yum | wget、rpm -ivh)

基础信息 本文以AnolisOS为例子&#xff0c;Centos和Ubuntu类似&#xff0c;核心都是安装kernel-debuginfo和kernel-debuginfo-common的rpm包 并且需要和内核版本子版本完全一致&#xff08;本质是使用同一份代码编译的&#xff09;假设系统安装的是8.6版本&#xff1a;比如ht…

【软件设计师】计算机软考下午题试题六,Java设计模式之简单工厂模式。

【软件设计师】计算机软考下午题试题六&#xff0c;Java设计模式之简单工厂模式。 代码如下&#xff1a; //简单工厂模式 public class SimpleFactory {public static void main(String[] args) {Product ProductAFactory.createProduct("A");ProductA.info();Produc…

C++11 数据结构2 线性表的链式存储,实现,测试

线性表的链式存储 --单链表 前面我们写的线性表的顺序存储(动态数组)的案例&#xff0c;最大的缺点是插入和删除时需要移动大量元素&#xff0c;这显然需要耗费时间&#xff0c;能不能想办法解决呢&#xff1f;链表。 链表为了表示每个数据元素与其直接后继元素之间的逻辑关系…

-bash:./app:没有那个文件或目录(已解决)

目录下有文件&#xff0c;并且权限也是够的&#xff0c;都是就是是没有。 解决方法&#xff1a; 进入/bin&#xff0c;执行命令 file bash 如上图&#xff0c;可以发现&#xff0c;bash是32-bit&#xff0c; 进入app所在目录&#xff0c;执行 file app 如上图&#xff0…

Java 基于微信小程序的校园失物招领小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

设计模式学习笔记 - 设计模式与范式 -行为型:16.解释器模式:如何设计实现一个自定义接口告警规则功能?

概述 上篇文章&#xff0c;我们学习了命令模式。本章&#xff0c;我们来学习解释器模式&#xff0c;它用来描述如何构建一个简单的 “语言” 解释器。比如命令模式&#xff0c;解释器模式更加小众&#xff0c;只在一些特定的领域内会被用到&#xff0c;比如编译器、规则引擎、…

数字经济专家高泽龙担任工信部元宇宙标准化委员会委员

数字经济专家高泽龙受聘担任工信部元宇宙标准化委员会委员&#xff0c;出席工作组成立大会暨第一次全体委员会议。 第一届元宇宙国标、团标以及标委会工作组会议顺利召开&#xff01; 同时&#xff0c;正式成为工信部中国人工智能产业发展联盟科技伦理工作组成员&#xff01;

jmeter使用之生成html测试报告

测试的最终结果是需要给出一份报告&#xff0c;那么在用jmeter测试时怎么生成一份报告呢&#xff0c;以下针对jmeter如何生成html报告进行简单介绍 一、首先把测试脚本写好二、利用命令生成html报告 命令&#xff1a;jmeter -n -t 【Jmx脚本位置】-l 【结果文件result.jtl存放…

区块链、web3.0、元宇宙的基本概念

目录 区块链 起源 发展现状 相关技术 智能合约 加密算法 共识算法 对等网络 web3.0 应用 DeFi 去中心化金融 NFT 非同质化代币 DAO 去中心化自治组织 底层技术 元宇宙 文章部分内容来自网络及AIGC,仅供学习 区块链 起源 区块链的起源可以追溯到21世纪初,当…

C#, 查找同一个进程显示在任务栏上的多个窗口

有的程序可以打开多个窗口并显示在任务栏上。某些情况下&#xff0c;我们需要找到窗口做些事情时&#xff0c;可以参考下面的代码。 public static class Win32Api{[DllImport("user32.dll", SetLastError true)]public static extern bool EnumWindows(EnumWindows…

HTML5媒体元素

video元素 视频元素&#xff0c;可以用来插入电影片段或其他视频流。 支持的视频格式是MP4&#xff0c;WebM&#xff0c;Ogg source元素 定义媒体的资源 src属性 规定媒体资源的URL type属性 规定媒体资源的MIME类型 <video controls><source src"../v…

桥接模式:解耦抽象与实现的设计艺术

在软件设计中&#xff0c;桥接模式是一种结构型设计模式&#xff0c;旨在将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过提供更加灵活的代码结构帮助软件开发人员处理不断变化的需求&#xff0c;特别是在涉及多平台应用开发时。本文将详细介绍桥接…

kubeadm部署kubernetes1.29

一、kubernetes集群节点准备 1.1、服务器要求 两台或多台安装linux服务器&#xff0c;此处使用vmware安装虚拟服务器 硬件配置&#xff1a;2GB或更多RAM&#xff0c;2个CPU或更多CPU 需要拉取镜像&#xff0c;如果服务器不能上网&#xff0c;需要提前下载镜像并导入节点 1.2…

爬虫开发教程

一、爬虫概述 爬虫&#xff08;也称为网络爬虫或蜘蛛&#xff09;是一种自动化程序&#xff0c;能够模拟人类在互联网上浏览和抓取数据的行为。它通过发送HTTP请求&#xff0c;获取网页的HTML代码&#xff0c;然后解析这些代码以提取有用的数据。爬虫在数据分析、价格监测、竞…

sql注入之宽字节注入

1.1 宽字节注入原理 宽字节注入&#xff0c;在 SQL 进行防注入的时候&#xff0c;一般会开启 gpc&#xff0c;过滤特殊字符。 一般情况下开启 gpc 是可以防御很多字符串型的注入&#xff0c;但是如果数据库编码不 对&#xff0c;也可以导致 SQL 防注入绕过&#xff0c;达到注入…

【网站项目】农产品自主供销小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

英特尔、联想等服务器曝出难以修复的漏洞

文章目录 前言一、漏洞潜伏六年,服务器供应链安全堪忧二、漏洞广泛存在但难以修复前言 近日,英特尔、联想等多个厂商销售的服务器硬件曝出一个难以修复的远程可利用漏洞。该漏洞属于供应链漏洞,源自一个被多家服务器厂商整合到产品中的开源软件包——Lighttpd。 Lighttpd是…

SpringMVC之响应

1.SpringMVC响应常用注解 注解名称注解类型位置作用RestController类注解SpringMVC控制器类上定义设置当前类为SpringMVC控制器类&#xff0c;且设置当前控制器类中所有方法的返回值为响应内容&#xff08;该注解包含ResponseBody注解&#xff09;ResponseBody方法注解SpringM…