用Visual Basic设计程序

计算机软件各种各样,每个软件都有各自不同的特点和功能,根据我们所要解决的问题的不同,可以选择不同的软件。如果用文字处理软件处理文字,用电子表格软件处理数据,用浏览器上网漫游等等。这些软件可以有效的完成人们交给的任务,给人们的学习、生活带来了很大的方便。
程序就是解决问题的若干计算机指令,程序设计就是将实际问题转化为用计算机语言实现的过程。因此,为了更好、更深入的了解与应用计算机,学习一些计算机程序设计的基础知识是很有必要的。学习程序设计也是对养成良好思维习惯的训练。要想学好程序设计,首先就是要把日常解决问题的方法,按照一定的条理理顺,然后就是动手上机实践。
Visual Basic是一种可视化的程序开发工具。”Visual”一词翻译成中文是“可视的、形象的”,它指的是开发图形用户界面(GUI,即Graphic User Interface)的方法。这种方法不需要编写大量的代码去描述界面元素的外观和设置,而只要把预先建立的对象添加到屏幕上的适当的位置即可。这样,软件设计人员就能在较短的时间内,以及少的程序量开发出同Windows界面效果一致的应用程序。本章将以Visual Basic为例,通过一些简单有趣的程序设计实例,介绍程序设计的基本方法和基本技能。
启动、退出Visual Basic系统,与启动其他Windows环境下的应用软件相同,即从任务栏中执行“开始”->“程序”->“Microsoft Visual Basic 6.0”->”Visual Basic6.0”(以启动 Visual Basic 6.0版为例)。
Visual Basic系统的界面除与一般的Windows应用程序窗口类似,有标题栏、菜单栏、工具栏外,还有工具箱、工程对象窗口、工程资源管理器窗口、属性窗口和窗体布局窗口等,如图所示。
为了用Visual Basic创建应用程序,应当使用工程(Project)。一个工程是用来建造应用程序的文件的集合。工程对象窗口就是”绘制”应用程序界面的窗口,也叫窗体设计器。因此,打开工程对象窗口系统一般都会自动弹出一个窗体(就是所设计应用程序的窗口)。工程资源管理器管理当前工程中所有的文件,即文件的集合。在窗体布局窗口中,可以看到所设计的界面在屏幕中的位置。工具箱和属性窗口则是用来为设计界面提供工具或设置参数的。

[图片上传失败...(image-4994e-1577361030242)]

image.gif

点此图标安装Visual Basic6.0软件[图片上传失败...(image-9092d2-1577361030242)]

image.gif

​(请杀毒后再安装)。
**** 第1节 开发应用程序的基本步骤****
本节通过一个简单的任务熟悉Visual Basic开发环境,初步了解有关的基本概念及在Visual Basic中编写程序的基本步骤,在后续任务中会逐步加深理解并掌握这些基本概念和基本步骤。
【学习任务】
制作一个如图所示的交通红绿灯程序:当单击红灯选项时,红灯亮;当单击黄灯选项时,黄灯亮;当单击绿灯选项时,绿灯亮。
[图片上传失败...(image-a652b4-1577361030242)]

image.gif

​[图片上传失败...(image-3c58b8-1577361030242)]

image.gif

​[图片上传失败...(image-deb731-1577361030242)]

image.gif


[任务分析]
1.规划程序界面
(1)红灯、黄灯、绿灯不能同时选择,即只能单选,因此,应该使用选项按钮。
(2)红绿灯实际上是三幅不同的图片,所以需要三个可以放置图片的对象。
2.程序运行分析
(1)当选中“红灯”选项时,应该显示红灯亮的图片,另外两幅图片可以隐藏起来。
(2)当选中“黄灯”选项时,应该显示黄灯亮的图片,另外两幅图片可以隐藏起来。
(3)当选中“绿灯”选项时,应该显示绿灯亮的图片,另外两幅图片可以隐藏起来。
【操作指南】
****1.创建用户界面****
(1)执行“文件”->“新建工程”命令,如图所示的“新建工程”对话框中,选择“标准EXE”后单击“确定”按钮,屏幕会显示一个如图的工程对象窗口(也称窗体设计器),这个窗口内有一个“窗口”,我们称它为“窗体”(Form)。
[图片上传失败...(image-c548b7-1577361030242)]

image.gif

​[图片上传失败...(image-ce560c-1577361030242)]

image.gif


从图中可以看到窗体的四周有8个点,拖动这些点可以调整窗体的大小。
(2)添加选项按钮。
1.在Visual Basic工具箱中双击“OptionButton”(选项按钮)[图片上传失败...(image-f0b95b-1577361030242)]

image.gif

​,在窗体中就多了一个选项按钮对象。
2.调整对象大小并移动到适当位置。将鼠标指针指向对象并拖动鼠标可移动对象位置。
3.在属性窗口中左侧的列表中选择“Caption”(标题),此时其右侧框中显示为“Option1”,单击右侧的框,将“Option1”改为“红灯”,如图,窗体的选项按钮的提示信息也同样被改变。
4.用同样的方法添加第2个选项按钮为“黄灯”,第三个选项按钮为“绿灯”。
[图片上传失败...(image-32ab84-1577361030242)]

image.gif


(3)添加图像对象。
1.在Visual Basic 工具箱中双击“Image”(图像)按钮,调整大小并移动到适当位置。
2.在属性窗口的列表中选择“Stretch”(伸展),单击右侧的[图片上传失败...(image-1311bc-1577361030242)]

image.gif

​按钮,选择下拉列表的“True”(真),这样可使加载的图像自动适应图像框的大小。
3.在属性窗口的列表中选择“Picture”(图片),单击右侧的[图片上传失败...(image-59f6ee-1577361030242)]

image.gif

​按钮,在“加载图片”对话框中选择文件,然后单击“打开”按钮,图像对象中显示出红灯亮的红绿灯,如图。
[图片上传失败...(image-267ba3-1577361030242)]

image.gif


4.在属性窗口的列表中选择“Visible”(可见的),单击右侧的[图片上传失败...(image-5b1c0-1577361030242)]

image.gif

​按钮,选择下拉表的“False”(假),则在运行时对象不可见。
5.用同样的方法添加的2、3个图像对象,这两个对象与第1个图像对象完全重合。
****2.编写程序****
(1)当程序运行时,鼠标单击“红灯”选项可以选中该项,对于这个事件,程序的反应是红灯亮的图片显示,另外两幅图片不显示。为表示这一过程,在窗体设计器中双击“红灯”选项按钮,在代码窗口中输入如图所示代码。
[图片上传失败...(image-e98236-1577361030242)]

image.gif

​[图片上传失败...(image-c1b2a1-1577361030242)]

image.gif

​[图片上传失败...(image-7677ab-1577361030242)]

image.gif


事件就是在对象上发生的动作,针对事件做出的反应,就称为“事件过程”。事件过程是通过代码实现的,它必须要有名称,其名称由对象名和事件组成。如系统赋予“红灯”选项的名称为“Option1”(可在属性列表中找到),用户的动作是“单击”,因此,该事件过程的名称为“Option1_Click”。
(2)在窗体设计器中(如看不到可以按Shift+F7键)双击“黄灯”选项按钮,在代码窗口中按如图输入相应的部分代码。
(3)在窗体设计器中双击“绿灯”选项按钮,在代码窗口中按如图输入相应部分代码。
****3.运行程序****
(1)执行“运行”->“启动”命令。
(2)在如图所示窗口中分别选中“红灯”、“黄灯”、“绿灯”选项按钮,观察显示的红绿灯是否与之对应。
[图片上传失败...(image-5483af-1577361030241)]

image.gif


(3)执行“运行”->“结束”命令,停止程序运行,返回设计界面。
如果程序不能按设计要求正确运行,停止程序运行后仔细检查前面所有操作步骤是否有问题。如果有问题重新修改后再运行,直到完全按设计要求正确运行为止。
****4.保存文件****
(1)执行“文件”->“保存工程”命令。
(2)在打开的“文件另存为”对话框中,选择适当的文件夹,并输入文件名“红绿灯”,如图所示(注意文件的默认扩展名),单击保存按钮。
[图片上传失败...(image-a3677d-1577361030241)]

image.gif


(3)在打开的“工程另存为”对话框中,同样选择适当的文件夹,并输入文件名“红绿灯”,如图所示(注意文件的默认扩展名),单击“保存”按钮。
[图片上传失败...(image-1d0262-1577361030241)]

image.gif


(4)执行“文件”->“生成红绿灯.exe”生成应用程序。
[任务小结]
通过本任务有如下收获:
(1)可以认识程序和做其他事一样,先要对其他事进行分析,然后根据分析结果确定解决问题的方法和步骤,这就是算法。
(2)了解Visual Basic 程序设计的一些基本概念,尽管对这些概念还不能完全理解,但在不断的学习过程中将进一步加深对它们的理解。其中对象和事件是 Visual Basic 的核心概念。
(3)了解用 Visual Basic 进行程序设计的基本过程,其中包括创建用户界面(包括绘制界面和设置属性)、编写程序(包括事件分析和编写代码)、运行调试、保存程序四个步骤。
[相关知识]
****1.基本概念****
(1)窗体(Form):是应用程序的窗口或对话框,是窗口的主体。
(2)控件(Control):是工具箱中可以被放置在窗体上的元素。
(3)对象(Object):视是窗体和放置在窗体中的控件。
(4)属性(Property):表示对象的特性,如名称、大小、颜色、位置、是否可用、是否可见等。
(5)事件(Event):是在对象上发生的动作,如单击鼠标、双击鼠标、移动鼠标、输入字符等。这些都是Visual Basic 系统为各对象预先定义且能够被该对象正确识别的动作。事件可由用户操作触发,可由程序代码产生,也可由系统本身触发。
(6)代码(Code):是针对事件编写的、指挥计算机工作的命令。
(7)事件过程(Event Procedure):事件作用在对象上时产生的反应。这个反应通过程序代码体现。
****2.在Visual Basic 中编写程序的基本步骤****
(1)用户界面设计。
首先绘制程序界面,然后设置个对象属性。
设计一个用户界面并不难,但设计一个用户喜爱的界面却并不容易,一定要注意简洁清楚,搭配合理,操作简便。
“绘制”界面的过程非常简单,在工具箱中选择适当的工具,并在窗体设计器中调整大小和位置,或在窗体设计器中根据对象的大小拖动鼠标。
一般来说,每创建一个对象,系统会自动赋予所创建的对象一组属性值。我们只需对其中的个别属性进行重新设置。
重新设置属性可以在设计时完成,也可以在运行时完成。
设计时设置属性是在属性窗口中完成。首先选择对象(在窗体设计器中单击对象,或在属性窗口的对象框中选择),然后在属性列表中选择要修改的属性并重新设置。
运行时设置属性是是通过在代码窗口编写代码,然后运行代码完成的。设置属性的代码格式为:
对象名.属性=属性值
在所有对象属性中,有一个属性建议大家一定要重新设置,这个属性就是“名称”(Name)。尽管系统为所有的对象都提供了名称,但系统所给出的名称,与该对象在程序中实际所起的作用没有对应关系,这给程序的编写与维护带来不便。如第1个应用程序中的“红灯”选项按钮的默认名称为“Option1”,由此我们可以知道它是一个选项按钮,但是这个按钮是干什么用的,就不得而知了。如果它的名称为“OptRed”,那么由前缀可以知道这是一个选项按钮,由后面的单词“Red”可以知道这个选项按钮是用于选择红灯的。这样的名称可以帮助区分各个对象,也有利于记忆。学习程序设计一开始就要养成一个良好的习惯——对于每一个对象都要设置名称属性。(常用各对象的名称前缀参见下表)
[图片上传失败...(image-3923da-1577361030241)]

image.gif


(2)编写程序。
首先进行事件分析,然后对分析编写个事件过程代码。
所谓事件分析就是考虑在程序运行时会有哪些动作,这些动作实施在什么对象上,每个动作需要计算机做出什么反应等等。事件分析一定要准确,准确的分析既可以保证程序按设计要求运行,也可以使编写程序变得非常容易。
一般来说,一个对象可以识别多个动作,如单击鼠标、双击鼠标、移动鼠标等。也就是说,一个对象可以识别一个以上的事件。因此,一个对象也就可能就有一个以上的事件过程,以保证针对不同的动作可以做出相应的处理。虽然一个对象可能包含多个事件过程,但并不是每个事件都需要编写相应的事件过程。同样的事件如果发生在不同的对象上,所引起的反应可能也不尽相同。因此,在实际Visual Basic 程序设计中,需要对哪一个对象的哪一个事件做出什么样的反应,完全根据该应用程序的使用要求和程序的设计目标而定,这就是事件分析。
事件过程就是针对某一事件需要计算机做出什么样的反应,通过一些命令告诉计算机,这些命令的组合就是程序。
(3)运行调试。
运行调试是指通过运行发现程序的错误,然后进行修改,再运行,再修改,直至程序运行正确无误,且满足程序设计要求。
运行调试不能忽略。通过运行调试既可以保证编写的程序不会有错误,同时还可以检验我们考虑问题是否周到。
在学习的过程中,即使调试完成,还可以给自己提出更高的要求,把程序完成的更出色。如“红绿灯”程序在调试的过程中,如果改变窗口大小或单击窗口最大化按钮,窗口的对象就不能排放在窗口的中间,否则整体效果就比较差,这是在设计是没有考虑到的。实际上只要提出了问题,无论是否解决,这本身就是提高。如果能够利用已学过的知识加以解决最好,如果不能,可以带着问题继续学习,或利用系统提供的帮助进行学习。
在Visual Basic 系统中,不但有“帮助主题”,还有“联机手册”,在这些帮助中既有解释、语法,又有演示示例。
(4)保存并打包。
一般来说保存需经过两步:第1步保存的是窗体文件(扩展名为.frm),即保存了窗体界面及该窗体中的所有事件过程的代码程序;第2步保存的是工程文件(扩展名为.vbp),即与该工程有关的全部文件和对象的清单,包括所设置的环境选项方面的信息。
上面保存的文件,如果要运行,必须在Visual Basic 环境下。在生成可执行文件以后,就可以离开Visual Basic 环境,直接在Windows系统下运行。生成的可执行文件的过程被称为“打包”。打包的方法非常简单:执行“文件”->“生成···”命令,在“生成工程”对话框中,选择适当的文件夹下按指定的文件名,自动生成一个扩展名为.exe的可执行文件。
****3.窗体对象****
(1)Caption属性:用于设定窗体标题栏中显示的文本。
(2)BorderStyle属性:用于设置窗体边界的样式。下表列出了可设置的属性值。[图片上传失败...(image-7f63e4-1577361030241)]

image.gif


(3)MaxButton属性:用于设置窗体是否包含最大化按钮。
(4)MinButton属性:用于设置窗体是否包含最小化按钮。
(5)Load事件:当窗体被装入内存时引发该事件。一般是通过运行程序将窗体装入内存,也就是说,运行程序时将会引发窗体的Load事件。也可以通过Load语句引发窗体的Load事件。
通常Load事件过程用来包含一个窗体的启动代码。例如,指定界面的初始状态(即对象缺省设定值)或初始化一些参数等。
****4.OptionButton(选项按钮)控件****
用于在一组选项中只能选择其中的一个选项,即通常所说的“单选”。
(1)Caption属性:用于显示选项的文本提示信息。
在窗体中创建选项按钮对象时,选项按钮有一个默认的提示信息,如Option1、Option2.为使得提示信息更符合实际情况,应对Caption属性进行设置。
(2)Value属性:用于决定选项按钮对象的状态。如果Value属性的值为True,表示已选择了该按钮;否则,如果Value属性的值为False,表示没有选择该按钮。系统的默认值为False。
(3)Click事件。
1.当用鼠标左键单击选项按钮对象时,可引发Click事件。
2.当选项按钮对象的Value属性设置为True时,可引发Click事件。
总之,只要在运行的过程中对象的Value属性值为True,就可引发Click事件。
****5.Image(图像)控件****
(1)BorderStyle属性:用于设置图相框的边框样式。属性值为0(None)时表示无边框,属性值为1(Fixed Single)时表示固定单边框。系统默认值为0.
(2)Picture(图片)属性:用于设置对象中要显示的图片文件。通过Picture属性可以加载以下类型的图片文件:
1.文件扩展名为.bmp(Bitmap)的文件:位图文件,即通过像素来表示的图像,其中每个像素对应一个或多个颜色信息位。位图文件通常都较大。
2.文件扩展名为.ico(Icon)或.cur(Cursor)的文件:图标文件或光标文件。
3.文件扩展名为.dib的文件:与设值规格无关的位图文件,这种图片文件无论在彩色或单色屏幕上都可以清楚的显示出来。
4.文件扩展名为.wmf(Windows Meta File)或.emf(Enhance Meta File)的文件:元文件,即将图片以图形对象(线、圆弧、多边形)而不是像素的形式来储存的文件。有两种类型的元文件,标准型和增强型。标准元文件通常带有.wmf扩展名,而增强元文件通常带有.emf扩展名。调整图像大小时,元文件对图片的保存比位图文件更精确。
5.文件扩展名为.jpg的文件:JPEG压缩文件,属于“有损压缩”,即压缩或会有一些失真(但视觉上不一定能感受出来)。
6.文件扩展名为.gif的文件:属于“无损压缩”,及压缩后再还原不会有失真。
如果要清除图片框中的文件,设计时选择Picture属性,然后按Del键。
(3)Stretch(伸缩)属性:用于确定是否调整图片大小以适应图像对象的大小。当它的值为True时,装入的图可以自动调整大小以适应图相框的尺寸;当它的值为False时,图像框将自动调整大小以适应装入图的尺寸,但如果图太大以至于超出窗口,则超出窗口的部分只能被截去。系统默认值为False。

  1. ****基本操作****

(1)显示各窗口。
1.通过菜单:通过“视图”菜单可以打开并显示“代码窗口”、“对象窗口(即窗体设计器)”、“工程资源管理器”、“属性窗口”、“工具箱”等。
2.通过快捷键:按Shift+F7键可以显示对象窗口;按Ctrl+R可以显示工程资源管理器窗口;按F4键可以显示属性窗口。
3.通过工程资源管理器:单机查看对象按钮可显示对象窗口;单机查看代码按钮可显示代码窗口。
(2)针对事件过程输入代码。
在窗体设计器中,双击引起事件的对象可以自由切换到代码窗口,并自动在代码输入区打开该对象的默认事件过程。然后,在事件过程的的“Private Sub........End Sub”之间输入相应的的代码。
在代码窗口中,打开左上方的下拉列表,从中选择所需对象,如果在代码输入区显示的不是所需事件过程,同样打开右上方的下拉列表选择适当的事件。然后,在事件过程的“Private Sub........End Sub”之间输入相应的代码。
在输入代码时,每个语句或命令都要按Enter键结束。如果要在同一行输入两个或更多的语句或命令,则其间要用“:”分隔。
【练习与思考】

  1. 列举苹果的几个属性。
  2. 把桌子上的钉子拔下来,分析一下完成这件事的完整过程。
  3. 进一步修改“红绿灯”程序:修改窗体标题、边框、图像的的大小,使界面更加协调,美观。
  4. 设计程序,要求界面中有4个选项按钮,分别对应“草花”、“方片”、“红桃”和“黑桃”。程序运行时选中其中的选项,相应的花色图片就显示出来。

【阅读材料】
Visual Basic 编程概念
要了解Visual Basic编程,有必要了解Windows的工作方式。Windows的工作方式用简单的语言来概述就是3个关键的概念:窗口、事件、和消息。Windows操作系统在管理所有的系统时要给每一个窗口指定唯一的标识,通过它来连续监视每一个窗口的活动或事件的信号。事件可以通过诸如单击鼠标或按下鼠标按键的操作而产生,也可以通过操作另一个窗口产生。每发生一次事件,程序将引发一条消息并送发给其他窗口,然后每一个窗口才能根据自身处理该条消息的指令而采取适当操作。
Visual Basic可以摆脱处理所有底层消息的麻烦(许多消息由Visual Basic自动处理),可以使开发者专心处理其他消息事件的过程,这样可以快速创建强大的应用程序,而无需处理不必要的细节。
在传统的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。从第一行代码执行应用程序并按程序预定的路径执行。因此,在开发应用程序时,就必须假设用户操作的各种可能过程,并根据这种假设进行编程。是编程变得非常复杂,稍有的疏忽就可能导致应用程序无法执行或产生错误的结果。
在事件驱动的应用程序中,代码不是按照预定的路径执行,而是相应不同的事件时执行不同的代码段。事件可以由用户操作触发,也可以由来自操作系统或其他应用程序的消息触发,甚至由应用程序本身的消息触发。这些事件的顺序是无法预测的,而事件的顺序决定了代码的执行顺序,因此,应用程序每次运行时所经过的代码的路径都是不同的。在开发应用程序时,只对有效的事件进行代码编写,其他事件(及用户的不必要的操作)没有代码,即不作任何反应。而是在各个不同事件过程中编写代码,使程序被分成一段段相对独立的代码。这样编程的过程就被简化了,使编程的效率大大提高。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容