《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产品,对瑞芯微的工具也比较了解。 在合众恒跃的网站上可以看到基本…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
