《Windows API每日一练》9.13资源-鼠标位图和字符串
鼠标指针位图(Mouse Cursor Bitmap)是用于表示鼠标指针外观的图像。在 Windows 窗口编程中,可以使用自定义的鼠标指针位图来改变鼠标的外观,并提供更加个性化的用户体验。
■以下是一些与鼠标指针位图相关的要点:
●鼠标指针位图格式:
1.鼠标指针位图通常使用 .cur 或 .ani 扩展名。
2..cur 文件包含静态鼠标指针位图,而 .ani 文件可以包含动画鼠标指针位图。
●创建自定义鼠标指针位图:
1.可以使用图像编辑器(如 Adobe Photoshop、GIMP 等)创建或编辑鼠标指针位图。
2.鼠标指针位图的尺寸通常为 32x32 像素。
●加载和设置自定义鼠标指针位图:
1.使用 LoadCursorFromFile 函数从 .cur 或 .ani 文件中加载自定义鼠标指针位图。
2.使用 SetCursor 函数将自定义鼠标指针位图设置为当前鼠标指针。
下面是一个示例代码片段,展示了如何加载和设置自定义鼠标指针位图:
//加载自定义鼠标指针位图
HCURSOR hCursor = LoadCursorFromFile(L"custom_cursor.cur");
SetCursor(hCursor); // 设置为当前鼠标指针
在上述示例中,"custom_cursor.cur" 是自定义鼠标指针位图的文件路径。可以将自定义鼠标指针位图文件放置在应用程序的资源文件夹中,并提供正确的文件路径。
需要注意的是,自定义鼠标指针位图需要符合特定的格式要求,并且尺寸应为 32*32 像素。此外,还可以使用系统提供的内置鼠标指针位图,如 IDC_ARROW(箭头指针)、IDC_HAND(手指指针)等,通过使用系统定义的预定义鼠标指针常量来加载和设置。例如我们在实例ICONDEMO.C中的窗口类初始化时,添加的就是系统预定义的箭头指针。
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
■在程序中添加鼠标指针
在程序中使用自定义的鼠标指针类似于使用自定义图标,但大多数程序员发现 Windows提供的鼠标指针好像足够用了。自定义鼠标指针一般是单色的,大小为32X32 像素。在VS中创建鼠标指针和创建图标的方法一样(亦即从Insert菜单中选择 Resource,然后选择Cursor),但是不要忘了定义热点。
你可以使用如下语句在类定义中设置自定义鼠标指针:
wndclass.hCursor = LoadCursor (hlnstance, MAKEINTRESOURCE (IDC_CORSOR));
或者,如果是用文本名字来定义的鼠标指针:
wndclass.hCursor = LoadCursor (hlnstance, szCursor);
每当鼠标定位在基于此类创建的窗口上时,与IDC_CURSOR或szCursor相关联的自定义鼠标指针就会显示出来。
VS中新建或添加鼠标指针位图:


图9-6 添加鼠标指针位图
资源文件和资源视图:

图9-7 添加后的鼠标指针资源
【说明】鼠标指针的资源ID,同样可以使用文件名字符串(带引号的字符串)或者IDC_CURSOR1标识符或者数字来表示,对应的程序中鼠标指针位图加载的定义。
如果你使用了子窗口,则可能会想让鼠标指针随着它下面的子窗口的不同而变换它的 样子。如果你的程序对这些子窗口定义了窗口类,那么通过对每个窗口类设置适当的 hCursor字段,就可以对每个类使用不同的鼠标指针。而如果你使用了预定义的子窗口控件, 那么还可以使用如下语句来更改窗口类的hCursor字段:
SetClassLong (hwndChild, GCL_HCURSOR,
LoadCursor (hInstance, TEXT ("childcursor")) ;
如果你将客户区分割成小的逻辑区域而不是使用子窗口,那就可以使用SetCursor来改变鼠标指针:
SetCursor (hCursor);
你应该在处理WM_MOUSEMOVE消息时调用SetCursor函数。否则,当鼠标移动时, Windows会使用窗口类中指定的鼠标指针来重绘鼠标。官方文档指出,当鼠标指针无需更换时SetCursor会运行得很快。
9.1.4 字符串资源表
字符串资源表(String Table)是在 Windows 程序中用于存储本地化字符串的一种资源类型。它允许开发者将应用程序中使用的字符串集中管理,并便于在不同语言环境下进行本地化和国际化。
■以下是一些关于字符串资源表的要点:
●字符串资源表的结构:
1.字符串资源表是一个以零为基础索引的表格,其中每一行都包含一个字符串资源。
2.每个字符串资源由一个唯一的标识符(ID)和一个对应的字符串值组成。
●创建和编辑字符串资源表:
1.字符串资源表通常包含在应用程序的资源文件(.rc)中。
2.可以使用资源编辑器(如 Visual Studio 的资源视图)来创建和编辑字符串资源表。
3.在字符串资源表中,可以为每个语言定义不同的列,每一列对应一个语言的本地化字符串。
●引用字符串资源:
1.在代码中引用字符串资源时,可以使用资源标识符(ID)来获取对应的字符串。
2.使用 LoadString 函数或 LoadStringW 函数加载指定语言的字符串资源。
■下面是一个示例代码片段,展示了如何加载和使用字符串资源:
#include <Windows.h>
int main()
{
HINSTANCE hInstance = GetModuleHandle(NULL); // 获取当前实例句柄
WCHAR buffer[256];
LoadStringW(hInstance, IDS_HELLO, buffer, sizeof(buffer) / sizeof(buffer[0])); // 加载字符串资源
MessageBoxW(NULL, buffer, L"String Resource", MB_OK); // 显示字符串资源
return 0;
}
在上述示例中,IDS_HELLO 是字符串资源的标识符,在字符串资源表中定义了对应的文本。使用 LoadStringW 函数加载指定语言的字符串资源,并将其存储到缓冲区中。随后,可以使用缓冲区中的字符串进行后续的操作,例如在消息框中显示。
需要注意的是,字符串资源表可以包含多个语言的本地化字符串,在加载字符串资源时,可以根据需要指定语言来获取对应的字符串。同时,也可以使用不同的资源文件来存储不同语言的字符串资源,以便于管理和本地化。
在实际应用中,字符串资源表是一种重要的资源类型,用于管理应用程序中的文本和消息。通过使用字符串资源表,开发者可以轻松实现应用程序的本地化和国际化,以适应不同的语言和地区需求。
■VS中添加字符串资源表

图9-8 添加字符串资源表
要创建字符串资源表,可以选中资源文件>添加>资源,选择添加String Table。字符串资源表将会被显示在屏幕右侧的列表里。双击一个字符串可以选中它。对每个字符串,都需要指定标识符和字符串本身。
在资源脚本里,字符串显示为类似于下面的多行语句:
STRINGTABLE DISCARDABLE
BEGIN
IDS_STRING1, "character string 1"
IDS_STRING2, "character string 2"
[其他字符串定义]
END
也可以使用文本编辑器在资源脚本文件中手工创建字符串表,也可以使用左右大括号来代替BEGIN 和END语句。
资源脚本可以有多个字符串表,但每个ID必须唯一地标识一个字符串。每个字符串只能有一行,最多可以有4097个字符。使用\t和\n来代表制表符和换行。在DrawText和 MessageBox中可以使用这些控制字符。
程序可以调用LoadString来复制字符串资源到程序数据区的缓存中:
LoadString (hlnstance, id, szBuffer, iMaxLength);
id参数代表资源脚本中每个字符串前面的ID号;
szBuffer是一个指向接受字符串的字符数组的指针;
iMaxLength是szBuffer可以接收的最大字符数。
此函数返回字符串中字符的数目。
每个字符串前面的字符串ID号通常是定义在头文件里的宏标识符。许多Windows程序员使用前缀IDS_来表示一个字符串的ID号。有时文件名或其他信息必须在显示字符串时嵌入到字符串里。这种情况下,你可以在字符串中加入C语言的格式设置字符并在 wsprintf中将它作为格式设置字符串。
所有资源文本,包括字符串表中的文本,都以Unicode格式保存在编译过的.RES资源文件以及最终的.EXE文件中。LoadStringW函数直接加载Unicode文本。LoadStringA函数则执行从Unicode到本地代码页的文本转换。
让我们来看一个函数例子,它使用三个字符串在消息框中显示三个错误信息。正如你 在下面看到的,RESOURCE.H头文件包含这些消息的三个标识符。
#define IDS_FILENOTFOUND 1
#define IDS_FILETOOBIG 2
#define IDS_FILEREADONLY 3
资源脚本含有如下字符串表:
STRINGTABLE
BEGIN
IDS_FILENOTFOUND, "File %s not found."
IDS_FILETOOBIG, "File %s too large to edit."
IDS_FILEREADONLY, "File %s is read-only."
END
C源代码文件也包含这个头文件,并且定义了一个函数来显示消息框。(假设szAppName是一个包含程序名字的全局变量。)
OkMessage (HWND hwnd, int iErrorNumber, TCHAR *szFileName)
{
TCHAR szFormat [40] ;
TCHAR szBuffer [60] ;
LoadString (hInst, iErrorNumber, szFormat, 40) ;
wsprintf (szBuffer, szFormat, szFilename) ;
return MessageBox (hwnd, szBuffer, szAppName,
MB_OK | MB_ICONEXCLAMATION) ;
}
为了显示含有”File not found”的消息框,程序可调用:
OkMessage (hwnd, IDS FILENOTFOUND. szFileNamR);
相关文章:
《Windows API每日一练》9.13资源-鼠标位图和字符串
鼠标指针位图(Mouse Cursor Bitmap)是用于表示鼠标指针外观的图像。在 Windows 窗口编程中,可以使用自定义的鼠标指针位图来改变鼠标的外观,并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点: ●…...
【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程
一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …...
thinkphp:数据库复合查询-OR的使用
完整代码 $data[info] db::table(po_headers_all)->alias(ph) //设置wip_jobs_all的别名->join([vendors > ve], ph.vendor_codeve.vendor_code)->field(ph.po_num,ph.status,ph.vendor_code,ve.vendor_name,ph.po_all_amount,ph.note,ph.order_date,ph.need_dat…...
网络安全那些梗
网络安全领域的梗往往以幽默、讽刺或夸张的方式反映了该领域的某些现象、挑战或误解。以下是一些网络安全相关的梗: 关掉服务器是最有效的安全方法:这个梗源自一个笑话,讲述了一位程序员因误解妻子的话而只买了一个包子回家,随后被…...
交通气象站:保障道路安全的智慧之眼
随着社会的快速发展,交通运输日益繁忙,道路安全成为公众关注的焦点。在这个背景下,交通气象站作为保障道路安全的重要设施,正发挥着越来越重要的作用。它们不仅为交通管理部门提供及时、准确的气象信息,也为广大驾驶员…...
【分库】分库的核心原则
目录 分库的核心原则 前言 分区透明性与一致性保证 弹性伸缩性与容错性设计 数据安全与访问控制机制 分库的核心原则 前言 在设计和实施分库策略时,遵循一系列核心原则是至关重要的,以确保系统不仅能够在当前规模下高效运行,还能够随着…...
【Linux】软件管理工具 yum
文章目录 概念搜索:yum list安装:yum install卸载:yum remove 概念 在Linux下安装软件,可以下载到程序的源代码,进行编译得到可执行程序,另外这些软件还有依赖其它工具的问题,还得下载编译这些依…...
LangChain —— Prompt Templates
文章目录 一、什么是 Prompt Templates1、String PromptTemplates2、ChatPromptTemplates3、MessagesPlaceholder 留言占位符 二、如何使用 Prompt Templates1、使用几个简短示例2、在 chat model 中使用几个简短示例3、部分格式化提示模板4、一起编写提示 一、什么是 Prompt T…...
Python库 - Scrapy
Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的,但也可以用于获取 API 提供的数据或作为通用的网络爬虫。 文章目录 主要特性主要组件使用流程1. 安装 Scrapy2. 创建 Scrapy 项目3. 定义 Item(数据ÿ…...
函数(实参以及形参)
实际参数(实参) 实际参数就是在调用函数时传递给函数的具体值。这些值可以是常量、变量、表达式或更复杂的数据结构。实参的值在函数被调用时传递给对应的形参,然后函数内部就可以使用这些值来执行相应的操作。 int main() {int a 0;int b …...
ArcGIS Pro SDK (八)地理数据库 8 拓扑
ArcGIS Pro SDK (八)地理数据库 8 拓扑 文章目录 ArcGIS Pro SDK (八)地理数据库 8 拓扑1 开放拓扑和进程定义2 获取拓扑规则3 验证拓扑4 获取拓扑错误5 标记和不标记为错误6 探索拓扑图7 找到最近的元素 环境:Visual …...
uniapp如何发送websocket请求
方法1: onLoad() {uni.connectSocket({url: ws://127.0.0.1:8000/ws/stat/realTimeStat/,success: (res) > {console.log(connect success, res);}});uni.onSocketOpen(function (res) {console.log(WebSocket连接已打开!);uni.sendSocketMessage({d…...
RabbitMQ的工作模式
RabbitMQ的工作模式 Hello World 模式 #mermaid-svg-sbc2QNYZFRQYbEib {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sbc2QNYZFRQYbEib .error-icon{fill:#552222;}#mermaid-svg-sbc2QNYZFRQYbEib .error-text{fi…...
自建搜索引擎-基于美丽云
Meilisearch 是一个搜索引擎,主程序完全开源,除了使用官方提供的美丽云服务(收费)进行对接之外,还可以通过自建搜索引擎来实现完全独立的搜索服务。 由于成本问题,本博客采用自建的方式,本文就…...
2024辽宁省大学数学建模竞赛试题思路
A题 (1) 建立模型分析低空顺风风切变对起飞和降落的影响 模型假设 飞机被视为质点,忽略其尺寸和形状对风阻的影响。风切变仅考虑顺风方向的变化,忽略其他方向的风切变。飞机的飞行速度、高度和姿态(如迎角、俯仰角)是变化的&am…...
循环结构(一)——for语句【互三互三】
文章目录 🍁 引言 🍁 一、语句格式 🍁 二、语句执行过程 🍁 三、语句格式举例 🍁四、例题 👉【例1】 🚀示例代码: 👉【例2】 【方法1】 🚀示例代码: 【方法2】…...
【深度学习基础】MacOS PyCharm连接远程服务器
目录 一、需求描述二、建立与服务器的远程连接1. 新版Pycharm的界面有什么不同?2. 创建远程连接3. 建立本地项目与远程服务器项目之间的路径映射4.设置保存自动上传文件 三、设置解释器总结 写在前面,本人用的是Macbook Pro, M3 MAX处理器&am…...
微调Qwen2大语言模型加入领域知识
目录 试用Qwen2做推理安装LLaMA-Factory使用自有数据集微调Qwen2验证微调效果 试用Qwen2做推理 参考:https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html from transformers import AutoModelForCausalLM, AutoTokenizer device "cuda…...
【Linux】内核文件系统系统调用流程摸索
内核层可以看到当前调用文件处理的进程ID 这个数据结构是非常大的: 我们打印的pid,tgid就是从这里来的,然后只需要找到pid_t的数据类型就好了。 下图这是运行的日志信息: 从上述日志,其实我也把write的系统调用加了入口的打印信…...
【HZHY-AI300G智能盒试用连载体验】文档资料
感谢电子发烧友和北京合众恒跃科技有限公司提供的的产品试用机会。 HZHY-AI300G工业级国产化智盒,采用RK3588工业级芯片组适应-40℃-85℃工业级宽温网关。 以前测试过其他厂家的RK3568产品,对瑞芯微的工具也比较了解。 在合众恒跃的网站上可以看到基本…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
