4个计时器实现窗体移动的编程思想

窗体(控件)移动的编程思想

一、方盒移动案例

1、工具

​ 要想实现移动最主要的工具计时器(=秒表)

2、为什么要使用计时器?它有什么功能?

​ 要想让窗体移动 (右下左上四个方向) 并且向看到移动的过程,所以就要用计时器控制窗体根据间隔的时间移动的距离,实现窗体走向容器(显示器)的四个方向。

3、如何找到计时器,并开启关闭它?它有什么属性呢?

位置:视图==》工具箱==》timer,将它拉到Form1中就添加成功

​ 开启:timer.Start();//因为Start是方法所以必须带括号;

​ 关闭:timer.stop();

​ 属性:Interval 事件的频率,以毫秒为单位

4、如何在代码中创建计时器事件?它有什么含义?

​ 创建: 在Form1.cs设计窗口中双击timer1就会自动添加事件到代码中。

​ 含义:根据间隔的事件重复执行这个事件中的代码(其实就是每当经过指定的时间间隔就会发生)

5、编程思想

​ (1)在c#中控件的移动都是由左上角开始的,左上角可以看作是一个坐标轴x和y,是0,0点(原点),当向右移动,x是加,向左移动x是减,当向上移动,y是减,向下移动y是加。

​ (2) 在窗体中没有Right右,Bottom下方向,只有Left左和Top上,所以,窗体向右和左移动的公为;

①this.left=this.left+20;           等于            this.left+=20;
②this.left=this.left-20;                           this.left-=20;

​ 意思为 :

​ ①控件左边缘与容器工作区左边缘之间的距离=控件左边缘与容器工作区左边缘之间的距离+20像素,就是让窗体(方盒)向右移动20像素的距离.

​ ② 向左则为: 控件左边缘与容器工作区左边缘之间的距离=控件左边缘与容器工作区左边缘之间的距离-20像素,就是让窗体(方盒)向左移动20像素的距离.

​ (3)所以,窗体向下和上移动的公为:

①this.top=this.top+20;               等于              this.top+=20;

②this.top=this.top-20;                                this.top-=20;

​ 意思为 :

​ ①控件上边缘与容器工作区上边缘之间的距离=控件上边缘与容器工作区上边缘之间的距离+20像素,就是让窗体(方盒)向下移动20像素的距离.

​ ② 向左则为: 控件上边缘与容器工作区上边缘之间的距离=控件上边缘与容器工作区上边缘之间的距离-20像素,就是让窗体(方盒)向上移动20像素的距离.

​ (4)当方盒移动到右或下或左或上边时会跑出显示器外,所以我们在它到跑到显示器工作区的时候就要让他停下来,然后再继续往规定的方向走。所以我们应作出相应的判断来让他停止再开始。

① if (this.Left+this.Width>=Screen.PrimaryScreen.WorkingArea.Width)
② if (this.Top+this.Height>= Screen.PrimaryScreen.WorkingArea.Height)
③ if (this.Left==0 )
④ if (this.Top==0)

①它是判断控件左边缘与容器工作区左边缘之间的距离+控件的宽度是否大于等于显示器工作区域的宽度。

②它是判断控件上边缘与容器工作区上边缘之间的距离+控件的宽度是否大于等于显示器工作区域的高度。

③判断控件上边缘与容器工作区上边缘之间的距离是否等于0

④判断控件上边缘与容器工作区上边缘之间的距离是否等于0

​ (3)我们该何时开启计时器呢?

​ 这个案例我们要用到四个计时器timer1,timer2,timer3和timer4,所以当我们要让方盒从原点出发,就必须在Form1_Load中开启timer1,然后到显示器右边工作区的时候要让它停下来,这时候判断就派上用场了,当①判断结果为真(成立时)关闭计时器timer1,然后等它刚停下来我们我让他往下走,所以这个时候我们要让他停下来,当①判断结果为真时我们就开启计时器timer2,这样依次到第四个计时器timer又回到(0,0)点即原点,我们再让他在重新开始移动,所以就要开启计时器timer1.

6、实际操作

如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _20200406Study02
{
    public partial class Form1 : Form
    {
        private readonly RectangleF path;

        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            this.FormBorderStyle = FormBorderStyle.None;//设置窗体(控件)的边框样式为无边框
            this.Location = new Point(0, 0);//设置窗体的位置为显示器左上角的原点
            this.Size = new Size(100, 100);//设置窗体的宽为100.高位100
            this.BackColor = Color.Red;//设置窗体的颜色位红色
            this.Opacity = 0.7;//设置窗体的不透级别为0.7,则透明度为0.3
            timer1.Start();//开启计时器timer1
           
        }
    
        private void timer1_Tick(object sender, EventArgs e)
        {
            this.Left += 20;//控件向右移动20像素
            //this.left表示设置控件左边缘与容器工作区左边缘之间的距离
            if (this.Left+this.Width>=Screen.PrimaryScreen.WorkingArea.Width)
                //判断控件左边缘与容器工作区左边缘之间的距离+控件的宽度是否大于等于显示器工作区域的宽度
                //this.width表示设置控件的高度
               // Screen.PrimaryScreen.WorkingArea.Width表示获取显示器工作区域的宽度
            {
                timer1.Stop();//关闭计时器timer1
                timer2.Start();//开启计时器timer1
            }
        }
    
        private void timer2_Tick(object sender, EventArgs e)
        {
            this.Top += 20;//控件向下移动20像素
            if (this.Top+this.Height>= Screen.PrimaryScreen.WorkingArea.Height)
                 //判断控件上边缘与容器工作区上边缘之间的距离+控件的高度是否大于等于显示器工作区域的高度
                //this.top表示设置控件上边缘与容器工作区上边缘之间的距离
                //Screen.PrimaryScreen.WorkingArea.Height表示获取显示器工作区的高度
            {
                timer2.Stop();//关闭计时器timer2
                timer3.Start();//开启计时器timer3
            }
        }
    
        private void timer3_Tick(object sender, EventArgs e)
        {
            this.Left -= 20;//控件向左移动20像素
            if (this.Left==0 )//判断控件上边缘与容器工作区上边缘之间的距离是否等于0
            {
                timer3.Stop();//关闭计时器timer3
                timer4.Start();//开启计时器timer4
                
            }
        }
    
        private void timer4_Tick(object sender, EventArgs e)
        {
            this.Top-=20;//控件向上移动20像素
            if (this.Top==0)//判断控件上边缘与容器工作区上边缘之间的距离是否等于0
            {
                timer4.Stop();//关闭计时器timer4
                timer1.Start();//开启计时器timer1
            }
    
        }
    }

}

二、气泡碰撞案例

1、编程思想

(1)学会画圆(3个步骤)

GraphicsPath path = new GraphicsPath();//定义一个GraphicPath类型的对象,实则就是创建了一个类

方法后要加括号

这个对象定义好后不能使用,因为缺少工具,此时我们可以将鼠标指向GraphicsPath就会出现一个💡图标,点击三角会出现三行代码,这时我们选择第二个,并将右边也进行此次操作。

​ 如下,是设置好后的代码:

System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();

然后,将 System.Drawing.Drawing2D 放到最上边的工具箱代码中,注意要加上using。

​ 如下,是添加好后的代码:

using System.Drawing.Drawing2D;

path.AddEllipse(0, 0, 200, 200);//向当前路径中添加一个椭圆

this.Region = new Region(path);//设置与控件相关联的窗口区域

要想使用 System.Drawing.Drawing2D必须先定义一个GraphicsPath类型的对象

将定义的GraphicsPath 类型的对象path入方法中

(2)规律

当气泡从左上角原点移动时,它有两种情况:

①碰撞到下边==》然后往右或者往上碰撞==》然后延申。。。。

②碰撞到右边==》然后往下或者往左碰撞==》然后延申。。。。

注:

​ 这种方法写完以后它不会继续循环,只会停留到哪个方向,所以我们可以根据气泡碰撞的方向来打开其他的计时器,做到循环碰撞。

2、实际操作

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace _20200408Study3
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void Form3_Load(object sender, EventArgs e)
        {

 //设置窗体的初始属性
            this.FormBorderStyle = FormBorderStyle.None;//设置窗体的边框样式为无边框
            this.Location = new Point(0,0);//设置窗体的坐标为原点
            this.Size = new Size(200, 200);//设置窗体的宽高为200px
            this.BackColor = Color.Blue;//设置窗体的背景颜色为蓝色
           // this.Opacity = 0.8;//设置窗体的不透明级别为0.8
            this.BackgroundImage = Image.FromFile("E:/C#/C#文件/20200408Study3/20200408Study3/img/timg.jpg");//插入图片
 //画圆(三步骤)
            GraphicsPath path = new GraphicsPath();//定义一个GraphicPath类型的对象②
            path.AddEllipse(0, 0, 200, 200);//向当前路径中添加一个椭圆
            this.Region = new Region(path);//设置与控件相关联的窗口区域①
            timer1.Start();//开启timer1

        }

//添加第      一      个计时器
          //向     右   和   下     端碰撞
        private void timer1_Tick(object sender, EventArgs e)
        {
            this.Left += 15;
            this.Top += 15;
                     //          右
            if (this.Left+this.Width>=Screen.PrimaryScreen.WorkingArea.Width)//判断控件左边缘与容器工作区左边缘之间的距离+控件的宽度是否大于等于显示器的宽度
            {
                timer1.Stop();//关闭计时器1
                timer4.Start();
            }
            //                  下
            if (this.Top+this.Height>=Screen.PrimaryScreen.WorkingArea.Height)//判断控件上边缘与容器工作区上边缘之间的距离+控件的高度是否大于等于显示器的高度
            {
                timer1.Stop();
                timer2.Start();//打开计时器2
            }
        }
//添加第        二       个计时器
       //向      右         上     端碰撞
        private void timer2_Tick(object sender, EventArgs e)
        {
            this.Left += 15;
            this.Top -= 5;
        //                   右
            if (this.Left+this.Width>=Screen.PrimaryScreen.WorkingArea.Width)//判断控件左边缘与容器工作区左边缘之间的距离+控件的宽度是否大于等于显示器的宽度
            {
                timer2.Stop();//关闭计时器2
                timer3.Start();
            }
        //                  上
            if (this.Top<=0)//判断控件上边缘与容器工作区上边缘之间的距离是否小于等于0
            {
                timer2.Stop();
                timer1.Start();//打开计时器1
            }
        }
//添加第   三     个计时器
     //向        左     上       端碰撞
        private void timer3_Tick(object sender, EventArgs e)
        {
            this.Left -= 10;
            this.Top -= 15;
        //             左
            if (this.Left<=0)//判断控件左边缘与容器工作区左边与之间的距离是否小于等于0
            {
                timer3.Stop();//关闭计时器3
                timer2.Start();//打开计时器2
            }
        //           上
            if (this.Top<=0)//判断控件上边缘与容器工作区上边缘之间的距离是否大于等于显示器的高度
            {
                timer3.Stop();
                timer4.Start();
            }
        }
//添加第     四      个计时器
     //向         左          下             端碰撞
        private void timer4_Tick(object sender, EventArgs e)
        {
            this.Left -= 10;
            this.Top += 15;
    //             左
            if (this.Left<=0)//判断控件左边缘与容器工作区左边与之间的距离是否小于等于0
            {
                timer4.Stop();//关闭计时器4
                timer1.Start();
            }
    //              下
            if (this.Top+this.Height>=Screen.PrimaryScreen.WorkingArea.Height)//判断控件上边缘与容器工作区上边缘之间的距离+控件的高度是否大于等于显示器的高度
            {
                timer4.Stop();
                timer3.Start();
            }
        }
    }
}

3、总结

这两种案例都是利用4个计时器的方法并不断关闭打开的方法来实现循环移动碰撞,所以程序比较繁琐。

WPF 秒表 计时器 定时关机 到计时关机 public const uint WM_SYSCOMMAND = 0x0112; public const uint SC_MONITORPOWER = 0xF170; [DllImport("user32")] public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, uint wParam, int lParam); /// /// 关闭显示器 /// public void CloseScreen() { IntPtr windowHandle = Process.GetCurrentProcess().MainWindowHandle; SendMessage(windowHandle, WM_SYSCOMMAND, SC_MONITORPOWER, 2); // 2 为关闭显示器, -1则打开显示器 } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using IniFiles; namespace StopWatch { /// /// shutdonwCtrl.xaml 的交互逻辑 /// public partial class shutdonwCtrl : UserControl { DispatcherTimer timer1; DispatcherTimer timer2; public shutdonwCtrl() { InitializeComponent(); timer1 = new DispatcherTimer(); timer1.Tick += new EventHandler(OnTimer1); timer1.Interval = new TimeSpan(0, 0, 1); timer2 = new DispatcherTimer(); timer2.Tick += new EventHandler(OnTimer2); timer2.Interval = new TimeSpan(0, 0, 1); btn_cancel.IsEnabled = false; cancel1.IsEnabled = false; } IniFile INI = new IniFile(IniFile.AppIniName); public void LoadIni() { cbo_hour.Text = INI.ReadString("定时关机", "时", "0"); cbo_Minute.Text = INI.ReadString("定时关机", "分", "0"); cbo_Second.Text = INI.ReadString("定时关机", "秒", "0"); cbo1.Text = INI.ReadString("到计时关机", "分", "0"); //combobox1.Text = INI.ReadString("到计时", "时", "0"); //combobox2.Text = INI.ReadString("到计时", "分", "0"); //combobox3.Text = INI.ReadString("到计时", "秒", "0"); } public void SaveIni() { INI.WriteString("定时关机", "时", cbo_hour.Text); INI.WriteString("定时关机", "分", cbo_Minute.Text); INI.WriteString("定时关机", "秒", cbo_Second.Text); INI.WriteString("到计时关机", "分", cbo1.Text); } private void ShutDown() { System.Diagnostics.Process.Start("shutdown.exe", "-s -t 1"); } private void OnTimer1(object sender,EventArgs e) { if (second > 0) second--; label1.Content = string.Format("Windows将在 {0} 关机", TimerClass.GetTimeString1(second)); if (second <= 0 && !cbo1.IsEnabled) { ShutDown(); } } int second = 0; private void Button_Click(object sender, RoutedEventArgs e) { second = Convert.ToInt32(cbo1.Text) * 60; if (second <= 0) { MessageBox.Show("数值必须大于0!"); return; } timer1.Start(); cbo1.IsEnabled = false; cancel1.IsEnabled = true; start1.IsEnabled = false; } private void Button_Click_1(object sender, RoutedEventArgs e) { label1.Content = " "; timer1.Stop(); second = 0; cbo1.IsEnabled = true; cancel1.IsEnabled = false; start1.IsEnabled = true; } private void OnTimer2(object sender, EventArgs e) { if ( DateTime.Now.Hour == Convert.ToInt32(cbo_hour.Text) && DateTime.Now.Minute == Convert.ToInt32(cbo_Minute.Text) && DateTime.Now.Second == Convert.ToInt32(cbo_Second.Text) ) { ShutDown(); } } private void Button_Click_2(object sender, RoutedEventArgs e) { int s = Convert.ToInt32(cbo_hour.Text) * 3600 + Convert.ToInt32(cbo_Minute.Text) * 60 + Convert.ToInt32(cbo_Second.Text); timer2.Start(); label2.Content = string.Format("Windows将在 {0} 关机", TimerClass.GetTimeString1(s)); btn_start.IsEnabled = false; btn_cancel.IsEnabled = true; cbo_hour.IsEnabled = false; cbo_Minute.IsEnabled = false; cbo_Second.IsEnabled = false; } private void btn_cancel_Click(object sender, RoutedEventArgs e) { label2.Content = ""; timer2.Stop(); btn_start.IsEnabled = true; btn_cancel.IsEnabled = false; cbo_hour.IsEnabled = true; cbo_Minute.IsEnabled = true; cbo_Second.IsEnabled = true; } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Threading.Tasks; using System.Runtime.InteropServices; using System.Windows.Threading; using IniFiles; namespace StopWatch { /// /// TimerCtrl.xaml 的交互逻辑 /// public partial class TimerCtrl : UserControl { private DispatcherTimer timer1 = null; private DispatcherTimer timer2 = null; int SND_SYNC = 0x0000; /* play asynchronously */ //异步 int SND_ASYNC = 0x0001; int SND_LOOP = 8; [DllImport("winmm")] public static extern bool PlaySound(string szSound, IntPtr hMod, int flags); private void playSound3() { Task tsk = new Task(new Action(proc)); tsk.Start(); } private void proc() { PlaySound(@"Sound\2.wav", IntPtr.Zero, SND_SYNC); PlaySound(@"Sound\2.wav", IntPtr.Zero, SND_SYNC); PlaySound(@"Sound\2.wav", IntPtr.Zero, SND_SYNC); } public TimerCtrl() { InitializeComponent(); timer1 = new DispatcherTimer(); timer1.Tick += new EventHandler(OnTimer1); timer1.Interval = new TimeSpan(0, 0, 1); timer2 = new DispatcherTimer(); timer2.Tick += new EventHandler(OnTimer2); timer2.Interval = new TimeSpan(0, 0, 1); btn_reset1.IsEnabled = false; btn_pause1.IsEnabled = false; } int h = 0; int m = 0; int s = 0; int seconds = 0; private void OnTimer1(object sender, EventArgs e) { if (seconds < 1) { PlaySound(@"Sound\2.wav", IntPtr.Zero, SND_ASYNC); btn_start.IsEnabled = false; btn_reset1.IsEnabled = true; btn_pause1.IsEnabled = false; combobox1.IsEnabled = true; combobox2.IsEnabled = true; combobox3.IsEnabled = true; return; } seconds--; label1.Content = TimerClass.GetTimeString1(seconds); } private void btn_start_Click(object sender, RoutedEventArgs e) { h = Convert.ToInt32(combobox1.Text); m = Convert.ToInt32(combobox2.Text); s = Convert.ToInt32(combobox3.Text); seconds = h * 3600 + m * 60 + s; label1.Content = TimerClass.GetTimeString1(seconds); timer1.Start(); btn_start.IsEnabled = false; btn_reset1.IsEnabled = true; btn_pause1.IsEnabled = true; combobox1.IsEnabled = false; combobox2.IsEnabled = false; combobox3.IsEnabled = false; } private void btn_reset_Click(object sender, RoutedEventArgs e) { seconds = 0; label1.Content = TimerClass.GetTimeString1(seconds); timer1.Stop(); btn_start.IsEnabled = true; btn_reset1.IsEnabled = false; btn_pause1.IsEnabled = false; combobox1.IsEnabled = true; combobox2.IsEnabled = true; combobox3.IsEnabled = true; } private void pause1_Click(object sender, RoutedEventArgs e) { if (btn_pause1.Content.ToString() == "暂停") { timer1.Stop(); btn_pause1.Content = "继续"; } else { timer1.Start(); btn_pause1.Content = "暂停"; } } int SEC = 0; private void OnTimer2(object sender, EventArgs e) { if (SEC < 1) { timer2.Stop(); playSound3(); btn_quick.IsEnabled = true; btn_cancel2.IsEnabled = false; combobox4.IsEnabled = true; return; } SEC--; label4.Content = TimerClass.GetTimeString1(SEC); } private void Button_Click(object sender, RoutedEventArgs e) { SEC = Convert.ToInt32(combobox4.Text) * 60; timer2.Start(); combobox4.IsEnabled = false; btn_quick.IsEnabled = false; btn_cancel2.IsEnabled = true; } private void Button_Click_1(object sender, RoutedEventArgs e) { SEC = 2; label4.Content = "00:00:00"; timer2.Stop(); combobox4.IsEnabled = true; btn_quick.IsEnabled = true; } IniFile INI = new IniFile(IniFile.AppIniName); public void LoadIni() { combobox1.Text = INI.ReadString("到计时", "时", "0"); combobox2.Text = INI.ReadString("到计时", "分", "0"); combobox4.Text = INI.ReadString("快速计时", "分", "0"); } public void SaveIni() { INI.WriteString("到计时", "时", combobox1.Text); INI.WriteString("到计时", "分", combobox2.Text); INI.WriteString("到计时", "秒", combobox3.Text); INI.WriteString("快速计时", "分", combobox4.Text); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Threading; using System.Windows.Threading; namespace StopWatch { /// /// WatchCtrl.xaml 的交互逻辑 /// public partial class WatchCtrl : UserControl { public WatchCtrl() { InitializeComponent(); timer1 = new DispatcherTimer(); timer1.Tick += new EventHandler(OnTimer1); timer1.Interval = new TimeSpan(0, 0, 1); timer1_1 = new DispatcherTimer(); timer1_1.Tick += new EventHandler(OnTimer1_1); timer1_1.Interval = new TimeSpan(0, 0, 0, 100); timer2 = new DispatcherTimer(); timer2.Tick += new EventHandler(OnTimer2); timer2.Interval = new TimeSpan(0, 0, 1); } private DispatcherTimer timer1 = null; private DispatcherTimer timer1_1 = null; private DispatcherTimer timer2 = null; private void OnTimer1(object sender, EventArgs e) { second++; label1.Content = TimerClass.GetTimeString1(second) ;//DateTime.Now.ToString("h:mm:ss"); } public int second = 0; private int second1 = 0; public int count = 0; private void OnTimer1_1(object sender, EventArgs e) { //label1.Content = TimerClass.GetTimeString1(second) + "." + count.ToString();//DateTime.Now.ToString("h:mm:ss"); //count++; //if (count > 9) // count = 0; } private void OnTimer2(object sender, EventArgs e) { second1++; label2.Content = TimerClass.GetTimeString1(second1) ;//.ToString("h:mm:ss"); } private void btn_start_Click(object sender, RoutedEventArgs e) { timer1.Start(); timer2.Start(); if (btn_start.Content.ToString() == "停止") { btn_start.Content = "开始"; btn_reset.Content = "复位"; timer1.Stop(); timer2.Stop(); } else { btn_start.Content = "停止"; btn_reset.Content = "计次"; } } private int counter = 0; private void btn_reset_Click(object sender, RoutedEventArgs e) { if (btn_reset.Content.ToString() == "复位") { second = 0; second1 = 0; label1.Content = "00:00:00"; label2.Content = "00:00:00"; timer1.Stop(); timer2.Stop(); } else { if (second1 > 0) { counter++; listbox1.Items.Add(string.Format(" {0}\t{1}", counter, label2.Content)); } second1 = 0; label2.Content = "00:00:00"; } if (btn_reset.Content.ToString() == "复位" && btn_start.Content.ToString()=="开始") { listbox1.Items.Clear(); } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御弟謌謌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值