20、Visual Basic .NET 菜单与上下文菜单创建指南

Visual Basic .NET 菜单与上下文菜单创建指南

在 Visual Basic .NET 开发中,菜单和上下文菜单是应用程序与用户交互的重要组成部分。用户通过菜单和上下文菜单向应用程序发出各种命令,如打开、保存或关闭文件,打印文档,剪切、复制或粘贴文本等。本文将详细介绍如何在 Visual Basic .NET 中创建菜单和上下文菜单,以及如何为它们添加功能和增强特性。

菜单概述

在 Windows 应用程序中,菜单是一种常见的图形用户界面(GUI)元素,它为用户提供了向应用程序发出命令的途径。菜单具有以下优点:
- 逻辑层次组织 :程序员可以将相关命令组织在一个逻辑层次结构中。例如,文件操作相关的命令(如打开和保存)放在“文件”菜单下,编辑相关的命令(如剪切、复制和粘贴)放在“编辑”菜单下。
- 节省屏幕空间 :子菜单项在未选择其父菜单项时会折叠起来,避免显示不必要的命令,使应用程序界面保持整洁。

在 Visual Basic .NET 中,菜单是对象。 MainMenu 对象代表 Windows 窗体上的菜单,它包含一个 MenuItem 对象集合,每个 MenuItem 对象代表菜单上的一个项。每个 MenuItem 可以是一个命令,也可以是其他子菜单项的父菜单。

创建菜单

在 Windows 窗体上添加菜单有两种方式:设计时在 Windows 窗体设计器中添加,或在运行时通过编程方式添加。无论哪种方式,创建菜单都需要两个步骤:首先向窗体添加 MainMenu 对象,然后向其添加 MenuItem 对象。

设计时创建菜单

在设计时创建菜单的步骤如下:
1. 在 Windows 窗体设计器中打开要添加菜单的窗体。
2. 在工具箱中双击 MainMenu 组件。此时,窗体左上角下方会出现一个显示“Type Here”的矩形区域,并且 MainMenu 组件会添加到组件托盘中。
3. 点击“Type Here”文本,输入所需菜单项的名称来添加菜单项。如果“Type Here”文本未显示,可以通过点击 Windows 窗体上的 MainMenu 组件来显示它。

大多数顶级菜单项都有访问快捷键,用户可以通过按下 ALT 键和菜单项中的一个字母的组合来访问该菜单项。要添加快捷键,只需在要加下划线的字母前输入一个与号( & )。例如,输入“&File”作为初始菜单项,“File”中的“F”会加下划线,其快捷键为 ALT-F

在添加了“文件”菜单项后,“文件”菜单项下方和右侧会出现“Type Here”选项。可以在“文件”菜单项下方添加“打开”和“保存”等项,在“文件”菜单项右侧添加“编辑”菜单项,以与其他 Windows 应用程序保持一致。

如果忘记添加某个菜单项,可以右键单击要插入新菜单项之前的菜单项,然后从上下文菜单中选择“插入新项”。如果决定不包含某个菜单项,可以右键单击它并从上下文菜单中选择“删除”。

运行时创建菜单

在运行时通过编程方式向 Windows 窗体添加菜单的步骤如下:
1. 创建一个新的公共过程,例如 AddMenuAndItems

Public Sub AddMenuAndItems()
    '代码将放在这里
End Sub
  1. 在该过程中,声明一个 MainMenu 对象的实例。例如,将实例命名为 mnuFile
Dim mnuFile as New MainMenu()
  1. 将窗体的 Menu 属性设置为刚刚创建的 MainMenu 实例,将 mnuFile 关联为窗体的菜单。
Me.Menu = mnuFile
  1. 在过程中,创建 MenuItem 对象并将其添加到 MainMenu 对象的集合中。
Dim mnuItemFile as New MenuItem("&File")
Dim mnuItemNew as New MenuItem("&New ")
mnuFile.MenuItems.Add(mnuItemFile)
mnuItemFile.MenuItems.Add(mnuItemNew)
  1. 完成菜单结构的编程创建后,需要调用创建的过程。一个合理的调用位置是窗体的 Load 事件,这样在窗体加载时就会创建菜单。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    AddMenuAndItems()
End Sub

除了添加“文件”菜单项,还可以以相同的方式添加其他顶级菜单项,如“编辑”菜单项。也可以通过向 MenuItem 对象的 MenuItems 属性添加 MenuItem 对象来创建子菜单。

为菜单项添加功能

菜单项的目的是在被点击时执行某些操作,因此可以使用菜单项的 Click 事件过程为菜单项提供功能。 Click 事件不仅在用户点击菜单项时发生,当用户使用键盘选择菜单项并按下 ENTER 键,或者按下与菜单项关联的访问键或快捷键时, Click 事件也会发生。

如果菜单项的 MenuItems 属性包含任何项,则不会引发该事件,即父菜单项不会触发 Click 事件。

以下代码在名为 mnuItemNew 的菜单项被点击时,将“New”输出到调试窗口:

Private Sub mnuItemNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Debug.Write("New")
End Sub

如果在设计时添加菜单项,可以通过从“类名”下拉列表中选择菜单项名称,从“方法名”下拉列表中选择“Click”来添加事件过程。如果是通过编程方式添加菜单项,则需要手动输入事件过程。

如果在设计时添加菜单项,Visual Basic .NET 会在 Windows 窗体设计器生成的代码区域自动添加以下代码,以使菜单项能够处理事件(在这种情况下是 Click 事件):

Friend WithEvents mnuEditCopy As System.Windows.Forms.MenuItem

如果是通过编程方式添加菜单项,则需要添加 MenuItem Click 事件的事件处理程序。可以通过在已编写的 AddMenuAndItems 过程中添加以下代码来实现:

AddHandler mnuItemNew.Click, AddressOf Me.mnuItemNew_Click
增强菜单

可以为菜单添加以下四种增强特性,以向用户传达信息:
- 复选标记 :用于指示某个功能是开启还是关闭。例如,在 Microsoft Word 中,“视图”菜单下的“标尺”菜单项会根据文档窗口边缘是否显示标尺而被选中或取消选中。
- 快捷键 :是在应用程序中访问菜单项的键盘命令。例如,在 Microsoft Word 中,“文件”菜单下的“新建”菜单项可以使用快捷键 CTRL-N 访问。
- 访问键 :允许用户通过按下 ALT 键和加下划线的访问键的组合来导航菜单。例如,在 Microsoft Word 中,“文件”菜单可以通过组合键 ALT-F 访问,“文件”菜单下的“新建”菜单项可以通过组合键 ALT-F-N 访问。
- 分隔条 :用于在菜单中分组相关命令,使菜单更易于阅读。例如,在 Microsoft Word 中,“文件”菜单下,分隔条将“新建”、“打开”和“关闭”菜单项与后续菜单项分隔开。

添加复选标记

可以在设计时和运行时添加复选标记。在设计时,有两种方法可以为菜单项添加复选标记:
- 在菜单设计器中选择菜单项后,在属性窗口中将 Checked 属性设置为 True
- 点击菜单项左侧的区域。点击后会出现一个复选标记,表示 Checked 属性已设置为 True 。再次点击该区域可以消除复选标记。

菜单项的 RadioCheck 属性可以自定义所选项目的外观。如果 RadioCheck 属性为 True ,则项目旁边会出现一个单选按钮;如果 RadioCheck 属性为 False ,则项目旁边会出现一个复选标记。

在运行时添加复选标记,只需将菜单项的 Checked 属性设置为 True

mnuItemNew.Checked = True
添加快捷键

可以在设计时和运行时添加快捷键。在设计时,通过在菜单设计器中选择菜单项,从属性窗口中选择 Shortcut 属性,并从下拉列表中选择一个值来添加快捷键。

在运行时添加快捷键,只需将菜单项的 Shortcut 属性设置为可用值之一。以下代码将菜单项的快捷键设置为 F6

mnuItemNew.Shortcut = System.Windows.Forms.Shortcut.F6
添加访问键

可以在设计时和运行时添加访问键。在设置 Text 属性时,在要加下划线作为访问键的字母前输入一个与号( & )即可。

添加分隔条

添加分隔条的方法与添加快捷键、访问键或复选标记不同。可以在设计时或运行时将分隔条作为一个菜单项添加。在属性窗口、菜单设计器或代码中设置 Text 属性时,输入一个连字符( - )即可将该菜单项设置为分隔条。也可以在菜单设计器中右键单击要添加分隔条的位置,然后选择“New Separator”。

禁用 Windows 窗体菜单上的项

在某些情况下,菜单项代表的命令可能不可用,此时应该禁用该菜单项。例如,在 Microsoft Word 中,“编辑”菜单下的“剪切”和“复制”菜单项在没有选择文本时会变灰(禁用),因为此时没有内容可供剪切或复制。当选择文本后,这些菜单项会变为可用。

禁用不可用的菜单项有以下优点:
- 用户体验 :避免用户点击不可用的菜单项而没有任何反应,从而避免用户误解应用程序出现问题。
- 错误预防 :剪切文本的代码可能假设存在已选择的文本,如果没有选择文本就执行剪切代码可能会导致错误。通过在没有选择文本时禁用菜单项,可以避免执行可能导致错误的代码。

菜单项在创建时默认是启用的。可以通过将菜单项的 Enabled 属性设置为 False 来禁用它。可以在设计时,当在菜单设计器中选择菜单项时,通过属性窗口来设置,也可以通过编程方式设置:

mnuItemNew.Enabled = False

禁用菜单中的第一个或顶级菜单项(如传统“文件”菜单中的“文件”菜单项)会禁用该菜单中包含的所有菜单项。同样,禁用具有子菜单项的菜单项会禁用其子菜单项。

如果给定菜单上的所有命令对用户都不可用,应该同时隐藏和禁用整个菜单。可以通过将最顶级菜单项的 Visible 属性设置为 False 来隐藏菜单。这样可以避免菜单结构中出现禁用项,从而提供更简洁的用户界面。

需要注意的是,仅隐藏菜单是不够的,还必须禁用菜单,因为仅隐藏菜单并不能防止用户通过快捷键访问菜单命令。

上下文菜单

许多 Windows 应用程序都有快捷菜单,当用户在窗体区域或窗体上的控件上右键单击时会显示这些快捷菜单。快捷菜单也称为上下文菜单,因为显示的特定菜单项取决于上下文,如应用程序状态或右键单击的窗体或控件位置。在 Visual Basic .NET 中, ContextMenu 类代表快捷菜单。

上下文菜单通常用于组合窗体主菜单中对用户有用的不同菜单项,具体取决于应用程序的上下文。例如,可以将一个快捷菜单分配给 TextBox 控件,以便用户可以立即访问主菜单中也有的菜单项,如剪切、复制和粘贴文本,查找文本,更改文本字体等。此外,上下文菜单还可以包含主菜单中没有的菜单项,以提供特定情况下的命令。

创建上下文菜单

与创建主菜单一样,可以在设计时在 Windows 窗体设计器中添加上下文菜单,也可以在运行时通过编程方式添加。无论哪种方式,创建上下文菜单都需要两个步骤:首先向窗体添加 ContextMenu 对象,然后向其添加 MenuItem 对象。

设计时创建上下文菜单

在设计时创建上下文菜单的步骤如下:
1. 在 Windows 窗体设计器中打开要添加上下文菜单的窗体。
2. 在工具箱中双击 ContextMenu 组件。此时,窗体上会添加一个上下文菜单,显示“Type Here”文本,并且 ContextMenu 组件会添加到组件托盘中。
3. 通过在窗体或控件的 ContextMenu 属性的下拉列表中选择 ContextMenu 对象,将上下文菜单与窗体或控件关联起来。

需要注意的是,多个控件可以使用同一个 ContextMenu 。可以使用 SourceControl 属性来确定最后显示快捷菜单的控件,以便执行特定于该控件的任务或修改为该控件显示的快捷菜单。

运行时创建上下文菜单

在运行时通过编程方式添加上下文菜单的步骤如下:
1. 创建一个新的公共过程,例如 AddContextMenu

Public Sub AddContextMenu()
    '代码将放在这里
End Sub
  1. 在该过程中,声明一个 ContextMenu 对象的实例。例如,将实例命名为 mnuContextMenu
Dim mnuContextMenu as New ContextMenu()
  1. 将窗体的 ContextMenu 属性设置为刚刚创建的 ContextMenu 实例:
Me.ContextMenu = mnuContextMenu
向上下文菜单添加项

在向 Windows 窗体添加 ContextMenu 组件后,下一步是向其添加菜单项。可以在设计时、运行时添加菜单项,也可以从主菜单复制菜单项。

设计时添加菜单项

在设计时向上下文菜单添加菜单项与向主菜单添加菜单项基本相同。点击“Type Here”文本,输入所需菜单项的名称来添加菜单项。如果“Type Here”文本未显示,可以通过点击 Windows 窗体上的 ContextMenu 组件来显示它。要添加另一个菜单项,可以点击菜单设计器中的另一个“Type Here”区域。点击当前菜单项下方的区域可以添加另一个菜单项,点击当前菜单项右侧的区域可以添加子菜单项。

上下文菜单与主菜单的一个区别是,上下文菜单通常没有顶级项,如主菜单中的“文件”项。

运行时添加菜单项

在运行时向上下文菜单添加菜单项与向主菜单添加菜单项基本相同。以下是一个在运行时向上下文菜单添加菜单项的示例:

Public Sub AddContextMenu()
    Dim mnuContextMenu as New ContextMenu()
    Me.ContextMenu = mnuContextMenu

    Dim mnuItemNew as New MenuItem()
    Dim mnuItemOpen as New MenuItem()

    mnuItemNew.Text = "&New"
    mnuItemOpen.Text = "&Open"

    mnuContextMenu.MenuItems.Add(mnuItemNew)
    mnuContextMenu.MenuItems.Add(mnuItemOpen)
End Sub

上下文菜单也可以包含子菜单。可以通过向父 MenuItem MenuItems 集合添加 MenuItem 对象来创建子菜单。

从菜单复制菜单项到上下文菜单

有时可能希望上下文菜单复制主菜单中的命令。例如,在 Microsoft Word 中,“编辑”菜单下的“剪切”、“复制”和“粘贴”菜单命令在点击文档时经常会在快捷菜单中重复出现。

可以在设计时使用菜单设计器复制菜单,也可以在运行时使用 CloneMenu 方法复制菜单。

在设计时复制菜单项的步骤如下:
1. 在菜单设计器中选择 MainMenu 组件,选择要复制的菜单项,右键单击它们,然后选择“复制”。
2. 选择 ContextMenu 组件,选择第一个菜单项要出现的“Type Here”区域,然后右键单击并选择“粘贴”。

在运行时使用 CloneMenu 方法复制菜单项的示例代码如下:

Private mmMainMenu As MainMenu
Private miEditMenu As MenuItem
Private cmEdit As ContextMenu

Private Sub CopyMenuItems()
    '创建全局 MainMenu 和顶级 MenuItem 对象的实例
    mmMainMenu = New MainMenu
    miEditMenu = New MenuItem("&Edit")

    '创建三个菜单项作为 MainMenu 菜单结构的一部分
    miEditMenu.MenuItems.Add("&Cut")
    miEditMenu.MenuItems.Add("&Copy")
    miEditMenu.MenuItems.Add("&Paste")

    '将顶级菜单项添加到 MainMenu 组件
    mmMainMenu.MenuItems.Add(miEditMenu)

    '将 MainMenu 组件设置为窗体的菜单
    Form1.Menu = mmMainMenu

    '创建全局上下文菜单对象的实例
    cmEdit = New ContextMenu

    '克隆 MainMenu 组件的顶级 MenuItem
    '然后将复制的 MenuItem 添加到 ContextMenu 组件
    cmEdit.MenuItems.Add(miEditMenu.CloneMenu())

    '设置窗体的 ContextMenu 组件
    Form1.ContextMenu = cmEdit
End Sub
为上下文菜单项添加功能

为上下文菜单添加功能的方式与为 MainMenu 添加功能的方式相同,即使用菜单项的 Click 事件过程。如果从 MainMenu 复制项到 ContextMenu ,则希望上下文菜单中的菜单项使用主菜单中相应菜单项的事件处理程序。

根据 MSDN 的说法,复制菜单项会保留与原始菜单项建立的属性设置和事件处理程序,因此新创建的菜单项会使用相同的事件处理程序,因为整个 MenuItem 对象被克隆。然而,根据实际实验,这可能仅在通过编程方式复制菜单项时成立,而在设计时使用菜单设计器的复制和粘贴功能时可能不成立。

有三种方法可以让主菜单菜单项的 Click 事件过程也处理相应上下文菜单菜单项的 Click 事件:
1. 使用 AddHandler :以下代码假设上下文菜单菜单项是 cmnSelectAll ,相应的主菜单菜单项是 mnuEditSelectAll

AddHandler cmnSelectAll.Click, AddressOf Me.mnuEditSelectAll_Click

这行代码可以逻辑地放在窗体的加载事件中。

  1. 扩展主菜单菜单项的 Click 事件过程的 Handles 子句 :主菜单菜单项的 Click 事件过程已经有 Handles mnuEditSelectAll.Click 子句。可以将 cmnSelectAll.Click 添加到 Handles 子句中,用逗号将其与 mnuEditSelectAll.Click 分隔开:
Private Sub mnuEditSelectAll_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuEditSelectAll.Click, cmnSelectAll.Click
    txtEdit.SelectAll()
End Sub
  1. 从上下文菜单菜单项的 Click 事件过程调用主菜单菜单项的 Click 事件过程
Private Sub cmnSelectAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    mnuEditSelectAll_Click(sender, e)
End Sub

通过以上步骤,你可以在 Visual Basic .NET 中创建功能丰富的菜单和上下文菜单,并为它们添加各种增强特性和功能,从而提升应用程序的用户体验。

Visual Basic .NET 菜单与上下文菜单创建指南(续)

常见问题解答与注意事项

在创建和使用菜单与上下文菜单的过程中,可能会遇到一些常见问题,以下是相关解答和注意事项。

设计时与编程方式的选择

有开发者会问,应该使用菜单设计器创建菜单还是通过编程方式创建呢?一般来说,推荐在可以使用菜单设计器的时候优先使用它,因为它比通过代码创建菜单更快,并且更不容易出错。但当你在 Visual Basic .NET 开发中处理更复杂的应用程序时,可能需要在应用程序运行时动态修改菜单,这时就只能通过编程方式实现了。而且,通过代码创建菜单能让你更深入地了解菜单的工作原理,而菜单设计器会隐藏一些细节。

菜单项复制后的事件处理

在复制菜单项时,虽然 MSDN 提到复制会保留属性设置和事件处理程序,但实际情况可能有所不同。如果是通过编程方式复制菜单项,可能会保留事件处理程序;但如果在设计时使用菜单设计器的复制和粘贴功能,可能就无法保留。所以在处理复制菜单项的事件时,需要根据实际情况选择合适的方法来确保事件处理的正确性。

总结与最佳实践

在 Visual Basic .NET 中创建菜单和上下文菜单是提升应用程序用户交互性的重要手段。以下是一些总结和最佳实践建议。

菜单创建总结
  • 设计时创建 :适合快速搭建简单的菜单结构,操作直观,易于上手。在设计时可以方便地设置菜单项的基本属性,如文本、快捷键等。
  • 编程方式创建 :适用于需要动态修改菜单的场景,能实现更复杂的菜单逻辑。在编程时,要注意对象的声明和属性的设置,确保菜单结构正确。
功能添加与增强
  • 菜单项功能 :使用 Click 事件过程为菜单项添加功能,要注意父菜单项不会触发 Click 事件。在处理复制菜单项的事件时,可根据情况选择合适的方法。
  • 菜单增强特性 :合理使用复选标记、快捷键、访问键和分隔条,能提升菜单的易用性和可读性。例如,使用复选标记可以直观地显示功能的开启或关闭状态;快捷键和访问键能提高用户操作效率;分隔条能让菜单结构更清晰。
上下文菜单使用
  • 创建与添加项 :上下文菜单的创建和添加菜单项的方法与主菜单类似,但通常没有顶级项。可以根据应用程序的上下文,灵活组合主菜单中的菜单项,并添加特定情况下的命令。
  • 功能关联 :为上下文菜单添加功能时,要确保与主菜单菜单项的事件处理程序正确关联,以保证操作的一致性。
流程图总结

下面是创建菜单和上下文菜单的流程图,帮助你更清晰地理解整个过程。

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B{选择创建方式}:::decision
    B -->|设计时| C(打开 Windows 窗体设计器):::process
    B -->|运行时| D(创建公共过程):::process
    C --> E(添加 MainMenu 或 ContextMenu 组件):::process
    D --> F(声明 MainMenu 或 ContextMenu 实例):::process
    E --> G(添加 MenuItem 对象):::process
    F --> H(设置窗体菜单属性):::process
    H --> I(创建 MenuItem 对象并添加):::process
    G --> J(为菜单项添加功能):::process
    I --> J
    J --> K(添加菜单增强特性):::process
    K --> L(处理菜单项复制和事件关联):::process
    L --> M([结束]):::startend
表格总结
操作类型 设计时操作 运行时操作
创建菜单 1. 打开 Windows 窗体设计器
2. 双击 MainMenu 组件
3. 点击“Type Here”添加菜单项
1. 创建公共过程
2. 声明 MainMenu 实例
3. 设置窗体 Menu 属性
4. 创建 MenuItem 对象并添加
创建上下文菜单 1. 打开 Windows 窗体设计器
2. 双击 ContextMenu 组件
3. 关联上下文菜单到窗体或控件
1. 创建公共过程
2. 声明 ContextMenu 实例
3. 设置窗体 ContextMenu 属性
添加菜单项 点击“Type Here”输入菜单项名称 创建 MenuItem 对象,设置 Text 属性并添加到相应菜单集合
菜单项复制 菜单设计器中复制粘贴 使用 CloneMenu 方法
菜单项功能添加 从下拉列表选择菜单项和 Click 事件 手动输入事件过程,使用 AddHandler 关联事件

通过遵循这些最佳实践,你可以在 Visual Basic .NET 中创建出功能完善、用户体验良好的菜单和上下文菜单,为应用程序的用户提供更加便捷和高效的操作方式。希望本文能帮助你在开发过程中更好地运用菜单和上下文菜单,提升应用程序的质量和交互性。

本研究基于扩展卡尔曼滤波(EKF)方法,构建了一套用于航天器姿态轨道协同控制的仿真系统。该系统采用参数化编程设计,具备清晰的逻辑结构和详细的代码注释,便于用户根据具体需求调整参数。所提供的案例数据可直接在MATLAB环境中运行,无需额外预处理步骤,适用于计算机科学、电子信息工程及数学等相关专业学生的课程设计、综合实践或毕业课题。 在航天工程实践中,精确的姿态轨道控制是保障深空探测、卫星组网及空间设施建设等任务成功实施的基础。扩展卡尔曼滤波作为一种适用于非线性动态系统的状态估计算法,能够有效处理系统模型中的不确定性测量噪声,因此在航天器耦合控制领域具有重要应用价值。本研究实现的系统通过模块化设计,支持用户针对不同航天器平台或任务场景进行灵活配置,例如卫星轨道维持、飞行器交会对接或地外天体定点着陆等控制问题。 为提升系统的易用性教学适用性,代码中关键算法步骤均附有说明性注释,有助于用户理解滤波器的初始化、状态预测、观测更新等核心流程。同时,系统兼容多个MATLAB版本(包括2014a、2019b及2024b),可适应不同的软件环境。通过实际操作该仿真系统,学生不仅能够深化对航天动力学控制理论的认识,还可培养工程编程能力实际问题分析技能,为后续从事相关技术研究或工程开发奠定基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值