三种自定义消息数值范围

ROS地图可视化:除了黑、灰、白,OccupancyGrid的-128到127到底藏着多少种颜色? 本文深入解析了ROS中OccupancyGrid地图的色彩编码机制,揭示了-128到127数值范围对应的丰富颜色表现。通过实验数据和技术分析,展示了如何利用这些颜色信息进行地图可视化优化和语义编码,为ROS开发者提供了实用的自定义颜色方案和高级应用技巧。 阅读详情

在优快云上看到一贴关于自定义消息的讨论:
  【http://topic.youkuaiyun.com/u/20080417/11/9e091cfe-3978-4b73-a1bd-ff5e7d508917.html】 

第一种楼主的方法是通过WM_USER自定义消息,这个方法,比较常用,也是容易知道的。楼主的5个步骤:
    1.#define wm_user_message wm_user+int (shift)语句后不能加";"号;
    2.上述shift 为1~1000以内的 整数值;
    3.该值的选择与系统消息,窗口消息,控件消息等无关;
    4.消息映射必须在BEGIN_MESSAGE_MAPS()和END_MESSAGE_MAPS()之内;
    5.消息处理的声明以及代码添加必须在指定的类中.
是正确的,不过这也说明楼主没有系统学过MFC,对MFC了解的不是很熟悉,如果在还没有熟悉MFC的情况下,就在MFC中定义自己的消息,不能称之为一个好办法。

第二种方法是WM_APP,这个消息我没有用过,查MSDN: 

WM_APP

The WM_APP constant is used by applications to help define private messages, usually of the form WM_APP+X, where X is an integer value.  (WM_APP常量在应用程序中帮助定义私有消息,常用WM_APP+X方式定义,其中X为整数值)
#define WM_APP       0x8000

在此文后面还有消息的范围,一并摘录,便于了解:
There are five ranges of message numbers: 五种消息范围数值

RangeMeaning
0 through WM_USER – 1Messages reserved for use by the system.系统保留消息
WM_USER through 0x7FFFInteger messages for use by private window classes.私有定义窗口类整数消息
WM_APP through 0xBFFFMessages available for use by applications.应用程序可获取消息
0xC000 through 0xFFFFString messages for use by applications.应用程序字符串消息
Greater than 0xFFFFReserved by the system for future use.保留消息

从这儿可以看到,楼主的整数说明不是很确切了,而WM_USER与WM_APP的使用范围也是有差别的,其应用范围也是不一样的。WM_USER用在窗口消息中,而WM_APP用在程序消息中,当然由于是自己定义的消息,自己爱怎么用就怎么用,不过,如果想管理好自己的代码,建议按MSDN推荐方式做。

第三种方法:RegisterWindowMessage
RegisterWindowMessage

The RegisterWindowMessage function defines a new window message that is guaranteed to be unique throughout the system. The returned message value can be used when calling the SendMessage or PostMessage function.  (RegisterWindowMessage函数定义了新的在系统内唯一的窗口消息,这个消息可以在SendMessage和PostMessage函数中使用)

UINT RegisterWindowMessage(
  LPCTSTR lpString   // address of message string
);
Parameters
lpString

Pointer to a null-terminated string that specifies the message to be registered. (指向NULL结尾的指定消息注册的字符串)
Return Values

If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF.(如果消息成功注册,返回值将在0xC000和0xFFFF之间。
If the function fails, the return value is zero. To get extended error information, call GetLastError.
如果函数失败,返回值为0,获取下扩展消息信息,调用GetLastError,

在上面的消息数值范围表格中我们可以知道,这个消息是处于string消息范围之中的。

综上所述,这三个自定义消息都是可以使用的,而且是三个不同数值范围要求的三个消息。

 

Java判定一个数值是否在指定的开闭区间范围内 Java判定一个数值是否在指定的开闭区间范围内 在Java中,可以使用条件判断语句和逻辑运算符来判断一个数值是否在指定的开闭区间范围内。下面是一个示例代码,展示如何实现这个功能: 阅读详情

相关推荐

避坑指南:Abaqus网格划分中90%用户会遇到的5个质量陷阱(附解决方案)

本文深入剖析Abaqus网格划分中90%用户会遇到的5个典型质量陷阱,包括单元扭曲、扫掠网格失败、尺寸梯度控制等,并提供工程级解决方案。通过Python脚本和虚拟拓扑等技巧,帮助用户提升网格质量,确保有限元分析结果的可靠性,适用于CAE工程师和仿真分析师。

weixin_29243279的博客 99

Windows编程--常用消息

一、消息分类 Windows消息类型可以分为:1.系统定义消息 2.用户自定义消息 消息的总个数为UINT mMessage,范围为0x0000 - 0xFFFF(0 - 65535) 系统定义消息:范围:从0x0000 - 0x03FF(0x03FF相当于WM_USER-1范围),应用程序不能用这些值作为自己的自定义消息 用户自定义消息:范围从0x0400(数值WM_USER)到0x7FFF的值是为用户保留的,应用程序能用这些值作为自己的自定义消息。 队列消息:基本是用户输入的结果,如按键(WM_KEY

procurar的博客 651

液冷方式介绍

如果将直径在1~100nm的颗粒悬置在传热流体(例如:水、乙烯、乙二醇等)中时,其传热能力会得到提升,因为大多数固体材料的热导率要大于液体,因此由颗粒、流体组成的混合物热导率也高于液体本身的热导率,由此制成的流体,我们称之为纳米流体。金属冷管的液体工质蒸散量几乎为0,而柔软材质的管道则会产生液体的蒸散,在封闭式循环系统中,为了弥补液体工质的蒸散,必须定期在系统中补充液体工质。——我们之前说过,材料的导电和导热的机制大致是类似的,所以导电能力更强的金属往往具有更好的导热能力。

制冷技术咨询与服务的博客 2045

MFC 自定义消息

Windows是一种消息机制,操作系统与程序之间是通过消息进行交流的,在MFC中定义了一些WM_消息,但是这些消息并不是可以响应任意的消息,所以就需要进行自定义消息。 自定义消息的时候应该处理三个地方: 第一:在头文件中的消息响应函数的声明 第二:在实现文件中的消息映射表 第三:在实现文件中队响应函数进行实现。 下面就对一个用户自定义消息进行定义: 具体步骤如下: 1、 在头文件st

yyw610879290的专栏 716

Auto.js实战:从解锁手机到自动阅读的全流程避坑指南(MIUI系统适配版)

本文详细介绍了Auto.js在MIUI系统下的自动化操作全流程优化指南,包括设备唤醒、应用启动、界面交互等关键环节的实战技巧。特别针对MIUI系统的变速检测机制和电源管理策略,提供了有效的避坑方案和性能优化建议,帮助开发者实现从解锁手机到自动阅读的稳定运行。

醉三国 246

PID、模糊PID、SkyHook、LQR、H2/H∞、ADRC等悬架控制合集

PID、模糊PID、SkyHook、LQR、H2/H∞等悬架控制合集

Mr.邹的博客 2013

线程的三种通信方法与三种同步方式

一、线程之间的通信     通常情况下,一个次级线程要为主线程完成某种特定类型的任务,这就隐含着表示在主线程和次级线程之间需要建立一个通信的通道。一般情况下,有下面的几种方法实现这种通信任务:使用全局变量(上一节的例子其实使用的就是这种方法)、使用事件对象、使用消息。这里我们主要介绍后两种方法。     (一) 利用用户定义的消息通信     在Windows程序设计中,应用程序的每一

zhjr1220的专栏 2万+

【功能安全】软件安全架构

目录01 软件安全架构介绍02 软件架构设计模板03 软件架构设计示例 软件架构设计的目的 软件架构设计的原则 软件架构设计输入与输出 软件架构设计的要求 注:软件架构设计和软件安全要求之间的双向可追溯性。软件架构设计原则: 软件架构静态/动态设计(参考秒尼科技术) 软件架构静态设计 软件架构动态设计 软件分层架构设计 软件架构设计安全机制错误探测的安全机制 其中:数据的范围检查指输入输出数据的范围进行检查,例如:在程序中我们可以通过数据范围来排除数据的正确性;合理性检查 例如:使用参

weixin_36460584的博客 511

【转】MFC WM_USER和WM_APP

WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF。 #define WM_USER       0x0400   WM_APP常量是Windows帮助应用程序定义私有消息,通常使用WM_APP+一个整数值,但总值不能超过0xBFFF。 #define WM...

weixin_34315189的博客 251

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 813

5大绝招破解.NET Core本地IP访问难题——为什么你的调试总卡在localhost?

摘要: 本文详解5种本地IP访问.NET Core应用的方法,涵盖基础IP绑定(0.0.0.0)、防火墙配置、IIS Express优化、远程调试及ngrok内网穿透。关键步骤包括修改launchSettings.json、PowerShell授权端口、SSH远程调试和ngrok外网映射,并提示常见陷阱(如未绑定IP、防火墙拦截)。通过“魔法法则”组合,可实现局域网/外网高效访问,适用于开发测试场景。 (字数:148)

java专栏 956

MFC一一添加WM_USER自定义消息

有些时候,我们希望自定义一些消息响应函数来控制何时进行消息触发,或针对两个不同类或线程之间进行消息互动,这个时候自定义消息响应函数就起到很大作用了。那么如何添加自定义消息呢?具体分为以下几步: 如下是一个SDI应用程序关于用户测试界面刷新的代码片段,可以参考其实现过程: (1).定义WM_USER宏 #define WM_USER_REFURBISH_TEST_RESULT (WM_USE

xuanyin235的专栏 9322

如何在多 GPU 配置上运行 Unsloth:数据并行或模型并行

当工作负载受限于内存(模型或批次无法放入单张显卡)、或受限于计算且计算与通信比率较高时(即每块 GPU 的额外计算量超过同步参数的开销,如在 DDP 中,或超过传递激活值的开销,如在模型并行中),多 GPU 配置才开始显现优势。在松散连接的显卡上(尤其是 PCIe 版本的 H100 或 A100),额外的设备间数据传输会导致性能显著低于单 GPU 运行。让我们厘清概念,明确说明如何通过模型并行(将模型拆分到多个 GPU)或数据并行(在每个 GPU 上复制模型)来跨多 GPU 运行 Unsloth。

人工智能领域专家 647

数值范围_涉及数值范围的答复及撰写建议

加关注▲微信号:华进知识产权作者:王裕波 国内专利事业部机械部《专利审查指南》第二部分第四章第4.3 节给出了选择发明创造性判断的所要考虑的主要因素,此处将其作为选择发明创造性的审查标准,其内容如下:1.如果发明仅是从一些已知的可能性中进行选择,或者发明仅仅是从一些具有相同可能性的技术方案中选出一种,而选出的方案未能取得预料不到的技术效果,则该发明不具备创造性。2.如果发明是在可能、有限...

weixin_39806288的博客 849

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win32 用户自定义消息范围

WINDOWS自定义消息WM_USER和WM_APP WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF。 #define WM_USER       0x0400                  -->1024 WM_APP常量是Windows帮助应用程序定义私有消息,通常使用WM_APP+

编程拾掇 1951

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINDOWS自定义消息范围

WINDOWS自定义消息WM_USER和WM_APP WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF。 #define WM_USER       0x0400                  -->1024 WM_APP常量是Windows帮助应用程序定义私有消息,通常使用WM_APP+

chlyzone 1356

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

如何在基于MFC的环境中使用自定义消息函数?

祝大家平安夜快乐!Merry Christmas!   引入正题,前几天解决了一个关于自定义消息的问题。对于Windows的自定义消息,我最喜欢其中的两种:  一种是存在于窗口类内部的自定义消息,它的作用范围仅是定义它的窗口类的内部,也就是说不同的窗口类即使定义了相同的内部消息,这些消息之间也不会产生什么关联。(比如一个文本框,它的内部就存在着许多已经定义好的内部消息,这些消息帮助它实

SchRHT Blog 2471

自定义消息的使用实例

1、Windows系统中,系统消息的范围是0到WM_USER - 1 ,WM_USER是一个常量,其值为0x400,    WM_USER以上的值用于自定义消息; 2、可以简单地用WM_USER加上一个数值定义一个消息ID{说明:消息其实就是一个常量值} 3、使用API函数RegisterWindowMessage可以注册一个系统内唯一的消息ID; 、、、、、、、、、、、、、、、、、、、、

假装狠牛逼 2592

自定义消息处理

自定义消息步骤如下: 1.定义消息 ID 值 Windows 将所有的消息值分为 4 段:0x0000~0x03FF 消息值范围段用于 Windows 系统消息,0x0400~0x7FFF段用于用户自定义消息窗口消息,0x8000~0xBFFF段为 Windows 保留值,0xC000~0xFFFF 段用于应用程序的字符串消息。 常量 WM_USER(为0x0400)与第一个自定义消息值相对应...

一丁的博客 669

MFC自定义消息

MFC自定义消息 用户可以为了特定的目的而定义自己的消息,这些消息也称为自定义消息。进行自定义消息的方法很简单,一般有两种:一种是利用ON_MESSAGE宏,另外一种就是创建自己的消息映射宏,这一种方法可以定制消息的参数类型,而不像前者只能使用固定的消息参数类型。但是一般情况下不需要定制消息的参数类型,因此这里对此不予介绍。本节主要介绍第一种比较常用的方法。预定义常量值WM_USER(

liufei_learning--脚踏实地,戒骄戒躁! 1489

VC++ WINDOWS自定义消息范围

WINDOWS自定义消息WM_USER和WM_APP WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF(十进制:32767)。 #define WM_USER       0x0400                  --&gt;1024 WM_APP常量是Windows帮助应用程序定义私有消息,通常使用...

weixin_34133829的博客 144
上一篇: Bridge模式
下一篇: 一次按操作规程操作失败引起的思考
newrain021011
博客等级 码龄22年 17粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值