二维绘图VC++编程实战示例:Visual Studio 2019项目教程

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:该压缩包包含一个使用Visual Studio 2019开发的VC++二维图形绘制项目,是学习VC++图形界面编程和Windows API应用的极佳资源。示例涉及VC++编程基础、VS2019 IDE的使用、GDI和GDI+二维绘图技术,以及项目结构和代码实现细节的解释。学习者可以掌握如何在Windows平台上进行图形绘制,理解编程流程,为深入学习游戏开发和GUI应用打下基础。

1. VC++编程基础与环境设置

1.1 VC++编程基本概念

VC++(Visual C++)是微软推出的一款C++编程语言的集成开发环境(IDE)。它集成了代码编辑、编译、调试等多种功能,支持面向对象编程和组件化编程,广泛应用于系统软件开发、应用软件开发、游戏开发等。

1.2 VC++编程基础

VC++编程基础主要包括C++语法、数据类型、控制结构、函数、类和对象等。掌握这些基础,是进行VC++编程的第一步。在学习过程中,要注重理解并实际操作,通过编写小程序来加深理解。

1.3 VC++环境设置

为了进行VC++编程,需要设置适当的环境。首先,需要安装VC++开发工具,如Visual Studio。然后,设置开发环境,包括配置编译器、链接器、调试器等。最后,创建项目和解决方案,开始编写和运行代码。

2. Visual Studio 2019集成开发环境介绍

2.1 开发环境的安装与配置

2.1.1 系统要求和安装步骤

Visual Studio 2019是Microsoft推出的一款功能强大的集成开发环境(IDE),它支持多种编程语言,能够满足从简单到复杂应用的开发需求。在开始使用Visual Studio 2019前,先了解其系统要求,并按照以下步骤进行安装。

系统要求
  • 操作系统 : Windows 10 1709 或更高版本。
  • 硬件 : 最低配置要求Intel 1.8 GHz 或更快的处理器(推荐多核处理器),至少需要2GB内存(推荐4GB或更多),安装需要约6GB的硬盘空间。
  • 显示 : 最小屏幕分辨率1024x768,推荐1280x1024。
安装步骤
  1. 访问 [Visual Studio 官网](*** 下载安装程序。
  2. 点击“下载”选择对应的Visual Studio版本(社区版为免费),并下载安装程序。
  3. 运行安装程序,选择“安装”开始安装向导。
  4. 选择安装工作负载(Workloads),至少选择“.NET桌面开发”或“C++桌面开发”进行安装。
  5. 选择需要安装的组件,例如特定的框架、工具等。
  6. 点击“安装”开始安装过程。
  7. 安装完成之后,启动Visual Studio并登录您的Microsoft账户。

2.1.2 创建项目与解决方案

Visual Studio的项目和解决方案是组织代码和资源的一种方式,创建它们是开始新任务的第一步。

创建项目
  1. 打开Visual Studio 2019。
  2. 选择“创建新项目”(Create a new project)。
  3. 从项目模板中选择一个合适的项目类型,例如控制台应用程序(Console App)。
  4. 点击“下一步”并输入项目的详细信息,如项目名称和位置。
  5. 点击“创建”(Create),Visual Studio会生成项目并打开。
创建解决方案
  1. 在Visual Studio中,选择“文件”(File)>“新建”(New)>“项目”(Project)。
  2. 在打开的“创建新项目”对话框中,选择一个解决方案类型。
  3. 输入解决方案名称,并指定创建位置。
  4. 点击“创建”,Visual Studio将创建一个空的解决方案。

2.2 Visual Studio 2019的主要功能

2.2.1 编辑器和工具栏介绍

Visual Studio 2019编辑器提供了代码的编写、编辑和查看功能,而工具栏则提供了一系列便捷的操作和配置选项。

编辑器
  • 代码编辑 : 提供语法高亮、智能感知、代码片段等功能。
  • 代码导航 : 支持书签、代码折叠和定义查找等。
  • 重构 : 支持重命名、提取接口和方法等重构操作。
  • 调试 : 支持断点、单步执行、变量监视等调试功能。
工具栏
  • 快速启动 : 可以搜索和运行命令、打开文件、显示工具等。
  • 标准工具栏 : 提供新建、打开、保存、撤销等常用操作。
  • 菜单栏 : 包含了几乎所有的功能,如项目、编辑、视图等。

2.2.2 调试工具和性能分析

调试是编程中不可或缺的一部分,性能分析工具可以帮助开发者优化程序性能。

调试工具
  • 断点 : 可以在代码行上设置断点,程序运行到此处会自动停止。
  • 调用堆栈 : 显示函数调用的层级关系,有助于理解程序流程。
  • 变量监视 : 可以监视变量的值,查看其在运行时的变化。
  • 即时窗口 : 可以执行代码片段,直接获取结果。
性能分析
  • 性能分析器 : 提供CPU、内存以及网络性能的分析工具。
  • 诊断工具 : 能够捕获应用程序的运行时信息,便于分析问题所在。
  • 资源监视器 : 可以实时监控系统资源的使用情况,帮助发现资源瓶颈。

Visual Studio 2019为开发者提供了一个全面的开发环境,通过本章节的介绍,我们了解了如何安装和配置该环境,并对编辑器和调试工具进行了基本的探索。掌握这些功能,将有助于提高开发效率和程序质量。

3. 二维绘图与Windows API

3.1 Windows API绘图基础

3.1.1 理解Windows绘图机制

Windows操作系统使用Windows API提供了一套丰富的接口来实现图形用户界面(GUI)的绘制和管理。绘图机制在Windows中是基于消息驱动的,意味着所有的绘图请求都是通过消息来处理的。消息可以来自用户输入,如鼠标点击或键盘输入,也可以来自系统,如窗口大小调整。当应用程序接收到绘图相关的消息时,如WM_PAINT,它通常会调用绘图函数在指定的设备上下文中进行绘制。

3.1.2 Windows API中的绘图函数

绘图操作通常涉及到以下几个核心步骤:获取设备上下文句柄、选择绘图工具到设备上下文中、调用绘制函数,最后释放资源。例如,在Windows API中,使用 GetDC 获取设备上下文句柄,使用 ReleaseDC 释放设备上下文句柄。绘图函数如 MoveToEx LineTo 可以用来绘制线条, Rectangle Ellipse 用来绘制矩形和椭圆等图形。

HDC hdc = GetDC(hWnd); // 获取窗口的设备上下文
// 使用绘图函数进行绘制
Rectangle(hdc, 10, 10, 100, 100); // 绘制一个矩形
ReleaseDC(hWnd, hdc); // 释放设备上下文

在上述代码中, GetDC 函数获取了窗口句柄 hWnd 的设备上下文, Rectangle 函数在该设备上下文中绘制了一个矩形,最后使用 ReleaseDC 释放了设备上下文以避免内存泄漏。

3.2 二维图形的绘制基础

3.2.1 绘制线条和形状

在Windows API中绘制线条和形状是基础中的基础。使用 MoveToEx 函数可以移动画笔到一个新位置,而 LineTo 函数可以在当前位置和指定位置之间绘制一条线。绘制其他形状,如矩形、椭圆等,则可以使用对应的函数如 Rectangle Ellipse 等。

HDC hdc = GetDC(hWnd);
MoveToEx(hdc, 0, 0, NULL); // 移动到(0,0)
LineTo(hdc, 100, 100); // 从(0,0)到(100,100)绘制一条线
Rectangle(hdc, 50, 20, 150, 120); // 绘制一个矩形
ReleaseDC(hWnd, hdc);

3.2.2 颜色和填充样式设置

颜色设置在绘图中也是一个重要的部分。使用 SetTextColor SetBkColor 函数可以分别设置文本颜色和背景颜色。而 SetBkMode 函数用来设置文本或图形的背景填充模式。 SetROP2 函数用于设置图形对象的混合模式。

HDC hdc = GetDC(hWnd);
SetTextColor(hdc, RGB(255, 0, 0)); // 设置文本颜色为红色
SetBkColor(hdc, RGB(0, 255, 0)); // 设置背景颜色为绿色
SetBkMode(hdc, TRANSPARENT); // 设置背景模式为透明
SetROP2(hdc, R2_NOT); // 设置反走样模式
// ... 进行绘图操作 ...
ReleaseDC(hWnd, hdc);

在代码中,我们设置了文本颜色为红色,背景颜色为绿色,并且将背景模式设置为透明,这意味着绘制时背景不会被填充。这些设置让绘图操作更加灵活和丰富。

绘图操作不仅仅局限于简单的线条和形状,还可以利用更多的API函数进行复杂的图像操作。在接下来的章节中,我们将进一步探索GDI技术,深入学习如何使用GDI对象进行高效的图形处理。

4. GDI(图形设备接口)基础

4.1 GDI对象的管理

4.1.1 画刷、画笔和字体对象

在GDI(图形设备接口)编程中,画刷(Brush)、画笔(Pen)和字体(Font)是三种基本的图形对象,用于定义图形的颜色、线条样式以及文本的显示样式。画刷用于填充图形的内部区域,画笔用于绘制图形的边界,而字体则用于渲染文本。

在程序中创建GDI对象时,一般需要使用特定的函数,如 CreateSolidBrush CreatePen CreateFont 。这些函数会分配内存,并返回一个对应的GDI对象句柄,用于后续的图形操作。为了优化资源使用和提高程序性能,开发者应当在不再需要这些对象时,通过相应的 DeleteObject 函数释放这些资源。

4.1.2 GDI对象的创建和销毁

创建和销毁GDI对象是GDI编程中的常规操作。每创建一个GDI对象,系统都会在内存中为其分配资源。如果创建的对象过多而不加管理,就会造成内存泄漏。因此,理解如何创建和销毁GDI对象至关重要。

创建GDI对象后,系统会返回一个句柄,该句柄用于在后续的绘图操作中引用该对象。而销毁GDI对象时,必须确保不再有任何绘图操作正在使用该对象。在Windows API中,通过调用 DeleteObject 函数可以释放与GDI对象关联的资源。例如,删除一个画刷对象的代码如下:

HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 0)); // 创建红色画刷
// 绘图操作...
DeleteObject(hBrush); // 销毁画刷对象

这段代码中,首先使用 CreateSolidBrush 函数创建了一个红色的画刷对象,并返回一个句柄。使用完毕后,调用 DeleteObject 函数来销毁该画刷对象。

表 4.1:常用GDI对象创建函数

| 函数名称 | 描述 | |-------------------|--------------------------------------------------------------| | CreateSolidBrush | 创建实心颜色画刷 | | CreatePen | 创建具有特定样式的画笔 | | CreateFont | 创建字体对象,定义文本显示样式 | | CreateCompatibleDC| 创建与指定设备兼容的内存设备上下文,用于提高绘图性能 |

开发者必须妥善管理这些GDI对象,以防止资源泄露,并确保程序运行效率。

4.2 GDI中的坐标系统和变换

4.2.1 逻辑坐标和设备坐标

在GDI编程中,坐标系统是定义图形元素位置和大小的基础。逻辑坐标和设备坐标是GDI中使用到的两种不同类型的坐标系统。

  • 逻辑坐标 是一种抽象的坐标系统,用于在不考虑具体输出设备的情况下定义图形元素的位置和尺寸。逻辑坐标可以方便地进行图形操作和变换,如缩放和平移。

  • 设备坐标 则直接关联到具体的输出设备(如显示器或打印机),它反映了图形元素在实际物理设备上的位置和尺寸。设备坐标是物理坐标,通常以像素为单位。

开发者在设计图形界面和进行图形绘制时,需要在逻辑坐标和设备坐标之间进行转换,以确保图形能够正确显示在目标输出设备上。

4.2.2 坐标变换和映射模式

坐标变换是将逻辑坐标转换为设备坐标的过程。在GDI中,这种转换是由映射模式决定的。映射模式定义了逻辑单位和设备单位之间的比例关系。

Windows提供了一系列映射模式,如 MM_ANISOTROPIC MM_TEXT MM_ISOTROPIC 等。每种映射模式都有其特点,例如 MM_TEXT 将逻辑坐标原点定位在左上角,每个逻辑单位对应一个像素,适合于精确控制输出设备上的像素位置。而 MM_ISOTROPIC MM_ANISOTROPIC 则提供了更大的灵活性,可以在保持图形比例的同时适应不同的设备分辨率。

下面是一个示例代码,展示了如何设置映射模式:

HDC hdc = GetDC(hWnd); // 获取窗口的设备上下文句柄
SetMapMode(hdc, MM_ANISOTROPIC); // 设置映射模式为MM_ANISOTROPIC
SetWindowExtEx(hdc, 10000, 10000, NULL); // 设置逻辑坐标范围
SetViewportExtEx(hdc, 1000, 1000, NULL); // 设置设备坐标范围
SetViewportOrgEx(hdc, 0, 0, NULL); // 设置视图原点位置
// 绘图操作...
ReleaseDC(hWnd, hdc); // 释放设备上下文

在这个示例中,首先获取窗口的设备上下文句柄,然后设置映射模式为 MM_ANISOTROPIC ,并定义了逻辑坐标和设备坐标的范围,最后执行绘图操作。 ReleaseDC 函数用于释放设备上下文句柄,避免内存泄漏。

在进行GDI图形操作时,开发者需要根据应用场景和输出设备的特性,选择合适的映射模式,以实现预期的图形绘制效果。

表 4.2:常见映射模式及其特点

| 映射模式 | 特点 | |------------------|--------------------------------------------------------------| | MM_TEXT | 原点在左上角,每个逻辑单位对应一个像素 | | MM_LOENGLISH | 原点在左上角,逻辑单位为0.01英寸 | | MM_LOMETRIC | 原点在左上角,逻辑单位为0.1毫米 | | MM_HIMETRIC | 原点在左上角,逻辑单位为0.01毫米 | | MM_TWIPS | 原点在左上角,逻辑单位为1/1440英寸 | | MM_ISOTROPIC | 提供自由缩放功能,保持图形的纵横比不变 | | MM_ANISOTROPIC | 提供自由缩放功能,纵横比可变,可自定义逻辑单位和设备单位关系 |

在实际开发过程中,开发者应根据具体需求灵活选择和设置映射模式,以达到最佳的图形绘制效果。

5. GDI+图形功能应用

5.1 GDI+与GDI的区别与联系

5.1.1 GDI+的新特性

GDI+是Microsoft提供的一个图形设备接口,用于处理图形和图像。它构建在旧版GDI(图形设备接口)之上,引入了新的功能和改进。GDI+提供了一系列扩展,使得开发者能够以更高级别的抽象进行图形编程。

首先,GDI+支持alpha混合,这允许图形元素具有透明度,从而可以实现图像的半透明效果。这对于创建现代图形用户界面以及图像处理应用尤为重要。其次,GDI+引入了自定义图形对象支持,开发者可以创建自定义的绘图表面(Bitmaps)和图形路径(GraphicsPaths),这为绘图提供了更大的灵活性。此外,GDI+的抗锯齿效果得到了加强,提供了平滑的文本和图形渲染,改进了图形的视觉质量。

5.1.2 GDI+与GDI的兼容性

虽然GDI+带来了许多新特性,但它仍保持与GDI的兼容性。这意味着使用GDI+编写的程序仍然可以运行在只支持GDI的系统上,虽然会失去一些GDI+的高级特性。在旧系统上运行时,GDI+会回退到使用GDI的绘图方法。

为了确保兼容性,GDI+提供了对GDI对象的封装,使得开发者可以使用GDI+的接口来访问GDI的功能。但是,需要注意的是,并不是所有的GDI功能都可以在GDI+中找到直接的等价物。因此,开发者在迁移旧的应用程序或者在需要兼容性的场合,可能需要深入了解两者之间的差异,并对代码进行适当的调整。

5.2 GDI+图形操作实战演练

5.2.1 图像处理和旋转

GDI+在图像处理方面的改进是巨大的。它提供了丰富的API来处理图像,包括缩放、旋转、裁剪等。GDI+中的旋转功能可以通过 Graphics 对象的 RotateTransform 方法实现。下面是一个简单的旋转图像的示例代码:

using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        Image image = Image.FromFile("example.jpg");
        Graphics g = Graphics.FromImage(image);
        g.RotateTransform(45); // 旋转45度
        g.DrawImage(image, new Point(0, 0)); // 在原点绘制旋转后的图像

        image.Save("rotated_example.jpg"); // 保存结果图像
    }
}

代码逻辑分析: 1. 首先,使用 Image.FromFile 方法加载原始图像。 2. 接着,通过 Graphics.FromImage 方法创建一个 Graphics 对象,该对象用于在图像上进行绘制。 3. 使用 RotateTransform 方法对图形上下文进行旋转,参数为旋转的角度。 4. 然后,使用 DrawImage 方法将旋转后的图像绘制到画布上。这里传入的是原始图像和一个新的 Point 对象,指定绘制位置。 5. 最后,调用图像的 Save 方法将旋转后的图像保存到文件中。

请注意,实际使用中应当处理异常情况,例如文件不存在或读取权限问题,并且确保图像资源在绘图完成后释放。

5.2.2 绘制复合图形和透明效果

GDI+还可以绘制复杂的图形组合,例如在背景上添加多个图形元素,并应用透明效果以创建层次感。以下是一个如何在GDI+中绘制复合图形并应用透明效果的代码示例:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;

class Program
{
    static void Main()
    {
        Bitmap bitmap = new Bitmap(400, 400);
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            // 设置背景色为白色
            g.Clear(Color.White);

            // 创建一个蓝色的矩形
            Brush blueBrush = new SolidBrush(Color.FromArgb(100, Color.Blue));
            g.FillRectangle(blueBrush, new Rectangle(50, 50, 200, 200));

            // 创建一个红色的圆形
            Brush redBrush = new SolidBrush(Color.FromArgb(100, Color.Red));
            g.FillEllipse(redBrush, new Rectangle(100, 100, 100, 100));

            // 创建一个带渐变的填充
            using (LinearGradientBrush brush = new LinearGradientBrush(
                new Rectangle(150, 150, 100, 100),
                Color.FromArgb(100, Color.Green), Color.FromArgb(100, Color.Yellow), 
                LinearGradientMode.BackwardDiagonal))
            {
                g.FillEllipse(brush, new Rectangle(150, 150, 100, 100));
            }
        }
        bitmap.Save("complex_shape.jpg"); // 保存结果图像
    }
}

代码逻辑分析: 1. 创建一个400x400像素的位图对象。 2. 使用 Graphics 对象对位图进行操作。 3. 设置背景色为白色。 4. 创建一个半透明的蓝色画刷,并绘制一个蓝色矩形。 5. 创建一个半透明的红色画刷,并绘制一个红色圆形。 6. 使用 LinearGradientBrush 创建一个线性渐变填充,并绘制另一个图形。 7. 最后保存绘制完成的复合图形图像。

上述代码演示了如何通过不同的画刷类型创建视觉层次感,以及如何对图形元素应用透明效果。在此过程中,使用了多种GDI+的绘图功能,这些功能能够帮助开发者创建丰富而精细的图形用户界面。

6. 程序运行与使用指南

6.1 程序的编译和运行流程

6.1.1 理解编译过程

在讨论程序编译之前,我们首先要了解编译是什么。编译是一个将源代码转换成机器代码的复杂过程,它通常由编译器来完成。编译过程大致可分为四个阶段:预处理、编译、汇编和链接。

预处理 阶段,预处理器会处理源代码中的预处理指令,例如宏定义和文件包含。预处理器执行后,源代码会变得“清洁”,没有宏定义和包含的头文件。

编译 阶段,编译器将预处理后的代码转换为汇编语言,这是中间代码形式,接近于机器语言但以人类可读的形式展现。

汇编 阶段,汇编器将汇编代码转换为机器代码,生成目标文件。机器代码是特定于处理器架构的,因此需要与特定的处理器相匹配。

链接 阶段,链接器将一个或多个目标文件和库文件结合在一起,生成最终的可执行文件。链接过程处理的是函数和变量的引用,确保它们正确地指向定义它们的代码位置。

在Visual Studio 2019这样的现代IDE中,这些阶段被抽象化并集成在了一个统一的构建过程中,开发者只需要点击“构建”和“运行”按钮即可完成这些任务。

6.1.2 运行环境的搭建

在开发Windows应用程序时,确保运行环境的正确搭建是关键。通常,Windows应用程序运行依赖于一系列的运行时库。在使用Visual Studio时,开发者可以选择“新建项目”向导来创建项目,并且可以选择合适的运行时库版本,以匹配目标Windows平台的版本。

创建项目后,可以在项目属性中配置运行时库选项。例如,在项目的“常规”属性页中,你可以设置“平台目标”来指定运行程序的平台,例如x86或x64。

在程序成功编译后,可以在Visual Studio中直接运行程序,或者在命令行中使用“命令提示符”来运行。命令行运行程序时,需要进入到项目输出目录,并输入可执行文件的名称来启动程序。

6.2 程序使用和图形绘制演示

6.2.1 界面介绍和操作指南

为了演示程序的使用和图形绘制,我们将使用一个简单的示例程序。这个程序将展示一个窗口,并允许用户绘制基本的二维图形,比如线条和矩形。

程序启动后,会显示一个窗口,用户可以通过菜单选择绘图工具,比如“画笔”和“橡皮擦”。在窗口的空白区域,用户可以使用鼠标拖动来绘制图形。该程序还会提供一些基本的图形属性设置,如线条颜色和宽度。

用户界面通常会包括以下几个主要部分:

  • 菜单栏 :包含文件、编辑、视图和其他功能的菜单。
  • 工具栏 :提供常用操作的快速访问按钮,例如保存、打印和编辑工具选择。
  • 绘图区域 :用户在此区域内进行图形绘制。
  • 状态栏 :显示当前程序状态或提示信息。

6.2.2 图形绘制实例操作步骤

  1. 启动程序 :在Visual Studio中,点击“开始调试”按钮或按F5键来编译并运行程序。
  2. 选择绘图工具 :在工具栏中选择想要使用的绘图工具,如“画笔”。
  3. 设置颜色和宽度 :在状态栏或侧边栏中选择颜色和笔刷宽度。
  4. 绘制图形 :将鼠标指针移动到绘图区域,按住鼠标左键不放并拖动来绘制图形。
  5. 保存图形 :使用菜单栏中的“文件”选项来保存绘制的图形到文件。

在编写程序时,会涉及到处理鼠标事件的代码,以及绘制图形的逻辑。例如,绘制线条需要记录起始点和终点坐标,然后使用GDI或GDI+的API函数来进行绘制。

// 示例代码:绘制线条
HPEN hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 255)); // 创建蓝色笔刷
HGDIOBJ hOldPen = SelectObject(hDC, hPen); // 选择笔刷到设备上下文
MoveToEx(hDC, xStart, yStart, NULL); // 移动到起始点
LineTo(hDC, xEnd, yEnd); // 绘制线条到终点
SelectObject(hDC, hOldPen); // 恢复之前的笔刷
DeleteObject(hPen); // 删除创建的笔刷

在上述代码中, hDC 是绘图的设备上下文句柄, xStart , yStart , xEnd , yEnd 是线条起始和结束的坐标。创建并选择笔刷后,通过 MoveToEx LineTo 函数进行实际的线条绘制。最后,恢复之前的笔刷并删除创建的笔刷以释放资源。

上述步骤和代码仅是一个简单的演示,实际程序中会涉及更复杂的逻辑,如事件处理、图形属性管理以及优化用户体验等功能。这些功能需要开发者结合具体的应用场景来详细设计和编码实现。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:该压缩包包含一个使用Visual Studio 2019开发的VC++二维图形绘制项目,是学习VC++图形界面编程和Windows API应用的极佳资源。示例涉及VC++编程基础、VS2019 IDE的使用、GDI和GDI+二维绘图技术,以及项目结构和代码实现细节的解释。学习者可以掌握如何在Windows平台上进行图形绘制,理解编程流程,为深入学习游戏开发和GUI应用打下基础。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值