《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);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

九、C++11常用新特性—模板的优化

1.模板的右尖括号 在泛型编程种&#xff0c;模板实例化有一个非常繁琐的地方&#xff0c;那就是连续的两个右尖括号&#xff08;>>)会被编译器解析成右移操作&#xff0c;而不是模板参数表的结束&#xff0c;在C11以前需要在>>之间加上一个空格> >。C11之后…

中职网络安全Server2216

任务环境说明&#xff1a;✓ 服务器场景&#xff1a;Server2216&#xff08;开放链接&#xff09;✓ 用户名:root密码&#xff1a;1234561.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程找出启动异常进程的脚本&#xff0c;并将其绝对路径作为Flag值提交…

WindowsMac共享文件夹设置

共享文件夹设置 共享文件夹设置Windows系统设置步骤一&#xff1a;设置共享文件夹步骤二: 访问共享文件夹 Mac系统中设置共享文件夹步骤一&#xff1a;设置共享文件夹步骤二&#xff1a;访问共享文件夹 小贴士结论 共享文件夹设置 有时需要在多台电脑之间共享文件夹&#xff0…

学习嵌入式对于学历有要求吗?

学习嵌入式系统开发通常并不对学历有严格的要求&#xff0c;尤其是在技术行业中&#xff0c;实际的技能和经验往往比学历更为重要。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕…

【C++报错已解决】Multiple Definition of Symbol

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法&#xff1a;方法一&#xff1a;使用extern关键…

设计模式之Facade设计模式

Facade设计模式&#xff0c;也称为外观模式&#xff0c;是一种结构型设计模式&#xff0c;它主要用于为子系统中的一组接口提供一个统一的高层接口&#xff0c;从而使得子系统更加容易使用。以下是关于Facade设计模式的详细介绍&#xff1a; 一、定义 Facade模式为多个复杂的…

【单片机毕业设计选题24054】-基于STM32的水质检测系统

系统功能: 主要功能模块原理图: 电源时钟烧录接口: 单片机和按键输入电路: 传感器采集电路&#xff1a; 资料获取地址 系统主要功能模块代码 初始化代码: /* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration-----------------------------------------------…

Golang | Leetcode Golang题解之第226题翻转二叉树

题目&#xff1a; 题解&#xff1a; func invertTree(root *TreeNode) *TreeNode {if root nil {return nil}left : invertTree(root.Left)right : invertTree(root.Right)root.Left rightroot.Right leftreturn root }

C++ | Leetcode C++题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack { public:queue<int> q;/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {int n q.size();q.push(x);for (int i 0; i < n; i) {q.push(q.front());…

操作系统:信号究竟是什么?如何产生?

OS信号 一、信号的概念二、信号的产生1&#xff09;终端按键产生信号1、 前台进程、后台进程2、验证终端按键是否产生信号 2&#xff09;调用系统函数向进程发信号3&#xff09;硬件异常产生信号1、浮点数溢出&#xff0c;CPU产生信号2 浮点数溢出&#xff0c;产生信号原理3. 空…

字节码编程javassist之修改返回值

写在前面 本文看下如何修改返回值。 代码 需要增强的类&#xff1a; package com.dahuyou.javassist.huohuo.cc;import java.math.BigDecimal;public class MyApiTestNoAnnotation {public double queryUserInfo(String uId){return BigDecimal.ONE.doubleValue();}}插桩类…

JavaWeb—js(3)

Bom dom: document object model(文档对象模型), 是处理html、xml的标准编写接口。 节点和元素 整个页面也就是整个文档我们称之为文档节点; 文档节点使用document来表示; 页面中的所有标签我们称之为元素&#xff0c;使用element来表示; 如此处的文本、属性、注释等&…

腾讯又一平台即将停止运营

随着腾讯公司业务和战略的调整&#xff0c;某些业务逐渐退出历史舞台&#xff0c;如“腾讯直播平台NOW”&#xff0c;以及“QQ签到”&#xff0c;“腾讯待办”&#xff0c;“企鹅FM音频平台”等&#xff0c;最近又有一则重磅消息&#xff0c;那就是“腾讯课堂”也即将停止运营。…

前端构建工具(webpackvite)

这里写目录标题 构建工具webpack介绍配置文件简介entryoutputloaderbabel插件开发服务器&#xff08;webpack-dev-server&#xff09;soureMap vite 构建工具 当我们习惯了在node中编写代码的方式后&#xff0c;在回到前端编写html、css、js这些东西会感觉到各种的不便。比如:…

JS代码动态打印404页面源码

JS代码动态打印404页面源码&#xff0c;适合做网站错误页&#xff0c;具有js动态打印效果&#xff0c;喜欢的朋友可以拿去 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务…

MES系统在装备制造行业核心应用场景介绍

MES软件在企业中有着广泛的应用场景&#xff0c;主要包括生产计划排程、生产过程监控、质量管理、设备管理、库存管理、数据分析等领域。 通过实时监控生产过程、收集数据、进行分析&#xff0c;MES软件可以帮助企业实现生产过程可视化、透明化&#xff0c;提高生产效率&#…

mybatis 延迟加载

MyBatis的延迟加载&#xff08;Lazy Loading&#xff09;是一种优化技术&#xff0c;用于在需要时才加载关联对象或集合&#xff0c;从而提高性能和效率。以下是对MyBatis延迟加载的详细介绍&#xff1a; 延迟加载的基本概念 延迟加载是指在第一次访问对象的属性时才加载该对象…

vue3 antdv Modal通过设置内容里的容器的最小高度,让Modal能够适当的变高一些

1、当收款信息Collapse也折叠的时候&#xff0c;我们会发现Modal的高度也变成了很小。 2、我们希望高度稍微要高一些&#xff0c;这样感觉上面显示的Modal高度太小了&#xff0c;显示下面的效果。 3、初始的时候&#xff0c;想通过class或者style或者wrapClassName来实现&#…

浅谈VPS主机上的数据库性能优化

如何提高网站性能&#xff1f;一个显而易见的解决方案是升级托管账户。您的网站将拥有更多硬件资源&#xff0c;因此可以同时处理更多请求并更快地传递数据。 无论如何&#xff0c;人们都是这么认为的。但事实总是不一样。 现代网站是一个复杂的系统&#xff0c;包含许多必须…

【靶机实战】GeoServer 远程代码执行漏洞复现

# 在线靶场 可以通过访问极核官方靶场开启靶机实验&#xff1a;极核靶场 -> 漏洞复现靶场 -> GeoServer-远程代码执行 原文&#xff1a;【靶机实战】GeoServer 远程代码执行漏洞复现 - 极核GetShell (get-shell.com) # 简介 CVE-2024-36401是一个高危的远程代码执行漏…