您尚未登录,请登录后浏览更多内容! 登录 | 加入最MC

QQ登录

只需一步,快速开始

 找回密码
 加入最MC

QQ登录

只需一步,快速开始

查看: 34370|回复: 155
打印 上一主题 下一主题

[资源] 【还是弃坑吧】【请解除精华】从零开始编写启动器【WPF万岁】【C#大法好】

  [复制链接]
  • TA的每日心情
    奋斗
    2017-7-31 16:24
  • 签到天数: 102 天

    [LV.6]常住居民II

    跳转到指定楼层
    楼主
    发表于 2016-2-4 11:28:27 | 只看该作者 |0人打赏回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 Eric_Stevens 于 2016-6-5 18:05 编辑

    本教程已弃坑:
    因为大家都在使用现成的API,所以发这帖子说实话确实没啥意义。再加上zuimc中95 per cent都是编程文盲,所以就连装13的机会都没有。偶尔还要应付回复中的装逼(比方说底下有个人就连自动生成的构造函数都发来水一贴)。另外俺的学业也越来越紧张了。如果谁想继续维护本帖,欢迎投稿或者自行开坑。(本帖封闭版权限制已经解除,随你复制)

    @zuimc @qq525048187 请解除精华,谢谢。



    看教程之前,一些值得注意的事情:
    一点儿都不温馨的提示(必看,吃亏不赔!):
    一点儿都不温馨的提示这不是易语言!这不是易语言!!这不是易语言!!!
    一点儿都不温馨的提示#2:本教程适合有一定C#和XAML界面语言基础的序猿,并且不会讲述C#编程的基础内容。一些和教程主题略无关联的部分(例如:json和xml的序列化与反序列化,WebResponse以及一些作为编程爱好者你必须懂得的对象之类的奇葩东西),可以自行百度
    一点儿都不温馨的提示#3:本教程不提供工程完整代码。除偶尔在教程中添加必要的代码以外,基本上是提供思路和难点的开导。没人会欢迎拿到软件源码改改版权的小学生的。嗯,是这样的。
    一点儿都不温馨的提示#4:理论上,本程序的操作可以应用于VisualStudio2008及以上版本,但由于兰州烧饼使用的SDK是2015 Upd1的版本,部分操作可能不同


    看见上面的一坨提示,估计你已经快要Alt+F4或者Ctrl+W了吧(别按)。所以俺再给大家献上一坨的温馨提示。
    温馨提示:
    温馨提示#1:由于俺是界面设计党,运行代码架构写得像shi一样(不过偏偏运行得起来hhh)。希望诸位C#大神能够纠错
    温馨提示#2:本教程遵循Eric_Stevens封闭协议(shenmegui)版权归Eric_Stevens所有。好吧换句话说就是转载死全家。



    目录
    第一章 准备工作
        I.开始吧(2.4填完)
             — 可怕的事实(可选)
             — 创建项目
             — 界面结构
             — 更改标题和运行
       II.初步的界面设计(2.16填完)
             — 弹指之间实现窗体阴影
             — 伪造标题栏
                  - 窗口资源节点
                  - 应用样式于按钮
                  - 符号和导入字体
             — 通过事件给按钮赋予生机
      III.启动器架构初探(2.20填完)
    第二章 最难的部分
         I.前奏:json和xml的反序列化(2.28填完)
    第三章 服务器搭建和数据获取
    第四章 润色和加工


    答疑环节
    Q:为何要使用C#语言进行启动器的编写?
    A:因其简单:C#和java类似,只要有C艹或者java基础,都可以玩溜C#;因其高效:虽说该语言并非用中文编写,但其相对于其他主流语言,例如C艹、java、易语言都更加简洁;因其不报毒这才是最重要的!!!!!

    {:mobpig:}Q:XAML是啥?好吃吗?
    {:mobnotch:}A:好吃极了!XAML是目前Win开发主流的界面语言。Win8~Win10的应用商店应用开发、WPF应用程序都有用到XAML。XAML可以实现宏伟的动画效果(包括三维图形),还可以让界面焕发新的光彩。俺在论坛发布过一个采用WPF的应用程序,名字为VipAide炫彩版,请自行去辅助软件区查找。(Win2D也有一些luan用,不过教程里不会用到)
    Win2D:我真是[哔]了狗了~



    第一章 准备工作
    第一节:开始吧(难度:★☆☆☆☆)
    注意:该节是全篇教程最详细并且最简单的一节。且看且珍惜。

    第一部分:可怕的事实(可选)

    首先你需要有一个VisualStudio!!!
    没有VisualStudio的倒霉孩纸请看这里:
    WinXP只支持VisualStudio 2010及之前的版本Win7以上系统支持VisualStudio所有版本。Vista未知(Vista哭瞎在厕所)
    VisualStudio 2010网上一坨的破解版,而VisualStudio 2015 Community 目前已经免费(注意是Community版)。可在官网 http://www.visualstudio.com/zh-cn/ 下载。
    本教程不支持VisualStudio2005!

    第二部分:创建项目

    打开万能的VisualStudio(下文称VS),新建一个VC#的WPF项目,随意命名,如图所示


    然后慢慢等VS创建项目。。。。。。

    第三部分:界面结构


    创建完成后,映入眼帘的工作区应该是这样一个界面。我会略微对界面的结构进行阐述。以后我就直接使用图片中的名词进行教程的讲解





    第四部分:更改标题和运行

    让我们选中设计视图中的那块空白的程序窗口记得选中整个窗口,别选里边的Grid),也可以在代码视图中选中代码中的<Window>节点。然后打开窗口右侧标签栏中的“属性”标签页找到“公共”节点中的“Title”选项,并将其设置为你想设定的窗口标题。然后单击VS窗口顶部的“启动”按钮。等待生成完毕后,应该会出现这样一个窗口(如图所示)



    恭喜你!你已经迈出了启动器的第一步

    注:①其实也可以在代码中更改窗口标题,学过html网页编程的都知道,每一个节点中都有各自的属性。我们只需要找到Window节点中的“title”属性,更改其值即可



    {:mobsheep:}第二节:初步的界面设计(难度:★☆☆☆☆)
    第一部分:弹指之间实现窗体阴影

    像下面这种类型的极简扁平化的窗口你应该见过多次吧



    图片为VipAide软件截图,软件版权系兰州所有。
    这种抛弃Windows默认设计风格的新型窗口一看就让人心旷神怡,但如何做到呢?
    如果你在用易语言:加模块,加模块,加模块
    如果你用CPP:DllImport,DllImport,DllImport
    如果你用VB winform:DllImport,DllImport,DllImport
    如果你用C# winform:DllImport,DllImport,DllImport
    如果你用C#+XAML界面语言鼠!标!点!就!够!了!
    *笔者只写过VB winform和CPP以及C# .NET(包括winform、WPF和UWP)。以上内容的观点可能有误,欢迎指正。
    以下就是使用XAML达到该效果的详细操作方法。(代码方法不讲,教程的第一章节面向小白)
    首先像上一节一样选中设计视图中的整个窗口,然后打开属性选项卡。展开“外观”节点。勾选AllowTransparency右侧的复选框。此时效果如图所示:


    该效果的目的是允许窗口有透明的部分。
    接下来,我们看到AllowTransparency下方的BorderThinkness(边框粗细)属性,将右侧的四个TextBox的值设置为20。现在你可以看到窗口的白色区域变小了,但窗口的外框仍然不变。
    而后,继续看到BorderThinkness下方的Effect(窗体效果)(这三个选项就是连在一起的233),点右侧的“新建”按钮,在弹出的窗口选择DropShadowEffect并确定。这时候,我们看到Effect已经变成了一个包含了巨多选项的节点。首先设置ShadowDepth的值为1,使阴影位置处于窗口正下方。然后设置BlurRadius为15,让阴影扩大。接着调整Opacity为30%左右。(操作方法和Photoshop的混合选项的阴影通道类似)
    现在预览图中的窗口就长这样啦:


    是不是很有现代气息并且简单至极啊?

    第二部分:伪造标题栏

    今天咱的任务是伪造标题栏hhh,就是做一个标题栏然后附上关闭按钮和最小化按钮。这个部分将是我们第一次使用后台的运行代码。这时候你可能会说:吓死我这个寄存器了!(汇编玩多了


    首先,我们看到设计器的代码视图。让我们略微理解一下在WPF下,XAML的结构。(该段可选)

    XAML本质意义上类似于XML和HTML,但和YAML截然不同。
    在HTML中,最巨大的容器节点为html其次是body,body是装有各种控件的容器。而html又有很多属性节点,比方说head和script等等。XAML也类似。
    在WPF下(Win8、Silverlight、WP8、UWP除外),最高节点是<window>,类似于HTML的html,<window>的节点中存储着很多窗口的属性和控件样式资源以及动画资源。其包含着装有各种控件的容器<Grid>。大多数节点只能有一个<Content>,所以一个窗口不能有两个<Grid>。不过<Grid>可以存储理论上无限的控件资源(内存溢出吧你。所以说,我们大部分在XAML设计器中消磨的时光,都是和Grid在一起♂。


    而今天,我们也将首次抛弃可视化的设计器。直接在代码视图中对界面进行编辑。

    首先在Grid中写上如下代码:
    1. <Rectangle/>
    复制代码
    注意:和html一样,一定要在后面加上斜杠。(XAML的大多数语法和HTML相同,以后不详述
    这段代码用以新建一个矩形
    接着我们给这个矩形附上一些属性,不提供示例代码,以下为语法
    1. <Rectangle 属性=“值" 属性=“值" 属性=“值" 属性=“值" 属性=“值" 属性=“值" 属性=“值" ... />
    复制代码
    这些属性是:

    Fill="你想要的颜色"                           左边的属性指示填充色
    VerticalAlignment="Top"                   这指示垂直排序,设置为Top时空间默认在窗体顶部
    Height="30"                                      高度,单位px
    没啦。

    现在如果不出问题的话你应该会看到窗口的顶端出现了一条诡异的东西

    如果你这时候启动,那么当你鼠标在这诡异东西上方按住拖动时窗口不会移动。咋办呢?

    激动人心的编码时刻开始啦!

    我们再给Rectangle添加一条属性,是MouseDown="这里输入事件名,尽量不要中文",然后把光标移动到事件名上,按下F12,即切换到代码视图。

    在事件代码中写上:

    现在就可以拖动窗口啦。
    分号别漏!分号别漏!分号别漏!

    小插曲:窗口资源节点

      WARNING  

    接下来的这一部分直接进入了XAML的较难环节,我会直接提供代码。但自定义部分不会提供。


    首先咱来了解一下何为WPF中的窗口资源即Window.Resources标签
    Window.Resources中可以存储诸多内容,例如窗口的动画效果、控件的样式和巨多乱七八糟的东西(这不是废话吗
    今天呢,我们得用到Window.Resources中的Style标签
    首先在Grid节点之外创建一个<Window.Resources>节点,创建好后,整个XAML的结构如下:
    <Window ... >
        <Window.Resources>
        ......
        </Window.Resources>
        <Grid>
        ......
        </Grid>
    </Window>
    这时候,我们在Resources的节点之内输入以下代码:

    注意x:Key可以更改,详情请看图中。另外,图中的颜色的属性都和教程的方向有偏颇,建议在理解的情况下,自行更改。请不要使用OCR光学识别。
    在接下来的这段时间内,请自行对关闭按钮的格式和最小化按钮的格式进行定义我已经传授给了你捕鱼的方法,鱼得你自己捕捉。
    小提示:Window.Resources中可以拥有多个Style,但是各个Style的x:Key不能相同。

    小插曲:应用样式于按钮

    我敢赌五毛大多数人对上面的代码没有任何理解。别担心,还有更难的呢。

    如果你有阿兰图灵一般聪明,成功理解了上面的Style。那么你可能会好奇。如何把样式应用于按钮呢?

    其实很简单。今天的控件创建部分就不堆代码了,想必在这几天的玩耍中你应该知道了有一个装有所有控件的容器:工具箱。位于VS窗口左侧。首先我们从中拖一个Button到窗口上。然后切换到代码视图,给VS自动创建的Button节点添加一条属性(语法和上文的rectangle相同),属性是:Style="{StaticResource 你定义好的资源Key}",然后看看按钮样式是否变化成非默认样式了吧。

    :①其实这个例子也可以解释为何各个Style的x:Key不能相同,因为它们是需要调用的资源标识符。如果产生混淆,将无法调用,最终导致界面的dll(PresentationFramework.dll)崩溃。
           ②请灵活的使用代码提示,这可以节省不少时间。例如当你键入上方Style属性的StaticResource时,VisualStudio会自动打开一个窗格,内部有你可能会输入的代码,而当你要输入资源key的时候,VS又会列举所有的资源。
           ③请在适当的时候给程序添加注释,以防遗忘。注释语法和HTML相同:<!-- 内容 -->

    小插曲:符号和导入字体


    完成以上的工作后,你应该有能力也有信心完成伪造关闭按钮和最小化按钮的工作了。但当你想一展身手时,却发现自己没有关闭、最小化、最大化等等的符号!!!别担心,话说微软在Win10推出之际推出了一个符号字体,美其名曰:Segoe MDL2 Assets。该字体里啥都有(别想得那么猥琐。请自行百度并且下载安装该字体。
    或许这个时候,你已经安装字体成功了。但在如此喜庆之时,我得再给你泼盆冷水:别人电脑上没这字体!!!
    那咋办呢?
    放心,WPF支持导入字体。
    首先我们打开你的启动器项目的保存位置,在装有一坨文件(包括代码文件)的文件夹中,把你下载好的字体扔进去。接着,回到VS,打开VS窗体右侧的“解决方案资源管理器”,点击其工具栏中的“显示所有文件”,然后你就会发现自己放进去的字体出现在了文件列表中了。别急,接下来我们右键单击该字体,在弹出的右键菜单中选择“包括在项目中”。噫,导入部分完工。
    接下来,我们选中你要作为带符号字体的按钮。打开VS右侧的属性窗格,找到Font的属性,然后在下拉列表的最顶端选择Segoe MDL2 Assets(所有导入的字体都会出现在字体列表顶端)
    接着,打开系统自带的字符映射表。将字体更改为Segoe MDL2 Assets(如图)。现在,就在如海般的符号中找寻你心仪♂的那一个吧!

    别忘了插入进按钮的Text!

    第三部分:通过事件给按钮赋予生机

    噫完成以上任务后,你应该拥有了一个窗口的雏形。这时候你一定会纳闷儿:我的最小化按钮和关闭按钮咋点不了啊?
    首先,我们给需要点击事件的按钮添加一条属性:Click="这里随便填,尽量别写中文",然后将光标移动到双引号中的任意字符,按下F12,切换到代码视图。键入需要的代码。
    以下为两种情况的代码:
    1.最小化
    1. this.WindowState = WindowState.Minimized;
    复制代码
    2.关闭
    1. this.Close();
    复制代码
    当然,WindowState中也有最大化的选项。如果需要请自行百度。
    练到了这儿,我可以很欣喜地告诉你,第二节快完成了。不过,在第二节的最后,你还需要做一些小小的事情。
    首先,创建一个启动游戏按钮,样式可自行定义。
    其次,创建三个文本框,并且给他们分别赋予不同的x:Name属性。这三个文本框分别指示:玩家名称(目前先做盗版登录)、内存大小、java路径,样式同样可自定义。关于textBox的样式模式,可以自行百度。
    恭喜你,第二节-初步的界面设计已经结束了!更多界面设计的内容,将出现在第四章-润色和加工。



    第三节:启动器架构初探(难度:★★☆☆☆)
    本来这一节想长篇大论的,仔细想想还是一笔带过吧
    当人们谈起启动器的时候,总会认为编写启动器难若登天。其实不然,启动器就是帮助用户执行一段已经编译好的java启动指令。指令中含有用户名、内存等诸多参数。(就和通过指令启动Minecraft服务器乃至javaApplication一样)
    所以现在你的脑中应该有了启动器的大致架构了吧。
    首先,初始一些变量。例如字符串型的用户名,数组型的内存以及字符串型的更多参数。并且反序列化jar带有的json文件,取其中必要参数进行定义。
    其次,通过多种途径寻找java(例如通过转义符直接跳转到ProgramFiles然后寻找java,或者通过注册表的方式查询java的位置)。(当然,也可以设置一个try。如果用默认的java运行报错的话,catch异常,而后运行java的寻找程序)
    接着,将所有变量带入指令(所有非string型的都Convert.ToString()),并且使用WinAPI中的运行cmd指令启动Minecraft。
    最后,监测Minecraft句柄。检查其是否崩溃。如果崩溃,就提醒用户,并且自动打开log文件。如果未崩溃,就自动关闭启动器。


    第一章就这么结束啦!大家使劲喷吧!

    第二章预告

    由于大家嫌教程太简单,俺就干脆用术语传授大家好啦(省打字的功夫)在第二章里,一大坨菜鸟小白难以理解的高深知识将会如巨浪般卷来。“序列化与反序列化”、“类”、“DllImport”……希望他们不会打击你继续编写启动器的信心。
    无论如何,我们下一章见。
    1. public void 下章见()
    2. {
    3.     try
    4.     {
    5.         this.教程章节.Navigate(new Uri("第二章 最难的部分",UriKind.Relative));
    6.     }
    7.     catch
    8.     {
    9.         Console.WriteLine("噫如果跳转不了的话那就是作者死了。")
    10.     }
    11. }
    复制代码


    第二章 最难的部分
    {:mobnotch:}前奏:json和xml的反序列化(难度:★★★☆☆)
    说好了不提供操作过程的噫
    序列化用通俗的话来讲就是把一大坨一大坨的数据使用一定的语法表示;而反序列化即把用一定语法表示的数据进行读取。

    在json的反序列化方面,我不推荐使用系统自带的运行时API(即System.RunTime.Serialization.Json)。因其麻烦而且不稳定,会增加许多的工作量。而第三方的API,即Newton
    soft.Json
    。Newtonsoft.Json在反序列化json数据方面,做得非常出色。下载可自行百度。添加COM拓展的方法也可自行百度。其用法也自行百度。(如果要详细的技术资料,建议访问博客园:http://www.cnblogs.com

    xml的反序列化,用不着第三方的API。系统自带的方式就能够完成大多数的任务了。具体的操作方法,我已经在VipAide的帖子中开源(因为检查更新的源码必须要使用到xml的反序列化)。大家可以去参考。不过别把WebResponse也当作xml反序列化抄下来了(虽然到数据获取那一章还要讲的)



    []  

    评分

    参与人数 5人气 +11 MC币 +20 收起 理由
    Slime_mark + 1 从点击安装程序开始等了10分钟。。。.
    3223904062 + 5 + 5 唉哟不错哟!
    Jonjs + 5 + 5 自从看完,我就变成了笨蛋
    ぁ凯た撒うが + 5 唉,靠别人给的精华...
    kosking + 5 打呀打酱油~VS2015...走过路过不要错过,打.

    查看全部评分

    打赏

    0

    收藏

    4

    支持

    2

    反对

    1

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    难过
    2018-1-13 21:09
  • 签到天数: 489 天

    [LV.9]以坛为家II

    沙发
    发表于 2016-2-4 11:28:20 | 只看该作者
    支持,虽然我并不会C#。。。

    评分

    参与人数 1人气 +1 MC币 +1 收起 理由
    Eric_Stevens + 1 + 1 每次发帖都你回。

    查看全部评分

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    慵懒
    2017-2-23 00:08
  • 签到天数: 57 天

    [LV.5]常住居民I

    板凳
    发表于 2016-2-4 11:30:12 来自手机 | 只看该作者
    前排支持!
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    慵懒
    2018-11-25 00:04
  • 签到天数: 658 天

    [LV.9]以坛为家II

    地板
    发表于 2016-2-4 11:30:29 | 只看该作者
    感觉第一节会点编程的都能捅咕出来,
    不管是E,,VE,C,C++,PB,PHP,JAVA
    好像都能捅咕出来。
    所以第一节是个大坑啊!

    点评

    VE什么鬼  详情 回复 发表于 2016-2-4 11:31
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    奋斗
    2017-7-31 16:24
  • 签到天数: 102 天

    [LV.6]常住居民II

    5#
     楼主| 发表于 2016-2-4 11:31:31 | 只看该作者
    qq525048187 发表于 2016-2-4 11:30
    感觉第一节会点编程的都能捅咕出来,
    不管是E,,VE,C,C++,PB,PHP,JAVA
    好像都能捅咕出来。

    VE什么鬼
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    奋斗
    2017-7-31 16:24
  • 签到天数: 102 天

    [LV.6]常住居民II

    6#
     楼主| 发表于 2016-2-4 12:09:23 | 只看该作者
    码完了第二节的一小部分。。今晚继续开更。
    1. Console.WriteLine("今晚继续")
    复制代码
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    郁闷
    2022-4-11 16:01
  • 签到天数: 59 天

    [LV.5]常住居民I

    7#
    发表于 2016-2-7 09:57:14 | 只看该作者
    我还是比较喜欢java语言

    点评

    然而java写不到多平台,C语言可以应用到各个领域  详情 回复 发表于 2016-2-7 10:32
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    奋斗
    2017-7-31 16:24
  • 签到天数: 102 天

    [LV.6]常住居民II

    8#
     楼主| 发表于 2016-2-7 10:32:44 | 只看该作者
    kosking 发表于 2016-2-7 09:57
    我还是比较喜欢java语言

    然而java写不到多平台,C语言可以应用到各个领域

    点评

    炫耀C语言真的好吗 说不定还有其他语言比这个更先进呢  详情 回复 发表于 2016-4-9 14:28
    知道啊,你这样教大家学习启动器,它们没有c语言基础,怎么会... 看着你,模仿你弄呗... 什么叫C语言多不知道,你直接弄个零基础C语言教程不是更好!  详情 回复 发表于 2016-2-7 11:47
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    郁闷
    2022-4-11 16:01
  • 签到天数: 59 天

    [LV.5]常住居民I

    9#
    发表于 2016-2-7 11:47:41 | 只看该作者
    Eric_Stevens 发表于 2016-2-7 10:32
    然而java写不到多平台,C语言可以应用到各个领域

    知道啊,你这样教大家学习启动器,它们没有c语言基础,怎么会...
    看着你,模仿你弄呗...  什么叫C语言多不知道,你直接弄个零基础C语言教程不是更好!
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    郁闷
    2022-4-11 16:01
  • 签到天数: 59 天

    [LV.5]常住居民I

    10#
    发表于 2016-2-7 11:57:54 | 只看该作者
    本帖最后由 kosking 于 2022-4-2 19:38 编辑

    最近我也在学习C这只是经典的你好世界,不代表一定要启动器,这是我学的教程的第一个任务...
    using System;
    namespace HelloWorldApplication
    {
        class HelloWorld
        {
            static void Main(string[] args)
            {
                /* 我的第一个 C# 程序*/
                Console.WriteLine("Hello Zuimc!");
                Console.ReadKey();
            }
        }
    }
    ......说实话,我还是比较喜欢java~因为我的世界java版本

    点评

    你这只是控制台的程序!!离窗体有一段事件  详情 回复 发表于 2016-4-8 16:42
    矮油我写的不是控制台,是WPF  详情 回复 发表于 2016-2-7 12:22
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    您需要登录后才可以回帖 登录 | 加入最MC

    本版积分规则