VB 窗体的设计及应用


 

进修目标:

u      掌握窗体设计

100

u      掌握多重窗体的设计与应用

u      掌握响应鼠标与键盘事件

上机运行了局如下:画直线,在鼠标被按下的位置画一个端点,在鼠标松开的位置画另一个端点。

 

重点:窗体及常用控件的基本属性、事件和方法

难点:鼠标事件和键盘事件

 

Private Sub Form_Activate()

窗体是一种对象,是所有控件的容器。由属性定义其外观,由方法定义其行为,由事件定义其与用户的交互。

End Sub

[注意]:(1)窗体中只能有一个按钮设置为撤消按钮(值为True)。

       设置窗体内部容器可用区域左上角的坐标,缺省值为(0,0

.Name属性:即“名称”属性

       在工程中添加的第一个窗体,其Name属性缺省值为Form1,添加的第二个窗体,其Name属性缺省值为Form2……

       也可给Name属性设置一个有实际意义的名称。

 

    设置窗体的标题,即窗体标题栏中显示的文本,其缺省值为Name属性值

 

    设置窗体轮廓的显示方法,0-平面,1-立体(缺省)。

.AutoRedraw属性

 

CurrentX = X

    设置窗体的边界样式。见表3-1(P.45)

.BackColor和ForeColor

    BackColor决定窗体的布景颜色,缺省时为系统颜色中的按钮轮廓颜色。

    ForeColor决定窗体的前景颜色,即窗体中文本和图形的颜色。缺省时为系统颜色中的按钮文本颜色。

End If

设置是否能吸收多行文本,缺省值为False,表示只允许输入单行文本。若设置为True时,可自动换行和回车换行。

.ControlBox

    设置窗体的左上角是否安排控制框。True:有控制框,False:无控制框

3)该撤消按钮的功能是:使用户可以撤消还未确认的改变,并把窗体恢复到先前状况。

    设置激和或屏蔽窗体。True:缺省值,允许窗体对事件作出反应,False:该窗体不再对任何事件作出反应。

.Visible

 

5.5.2  Tab挨次

Fontname: 设置字体的类型

Fontsize: 设置字体的大小

文本框常用的事件有:Click , DblClick , GotFocus , LostFocus , Change等事件。

FontItalic: 设置斜体

FontStrikethru: 设置比划体(删除线)

 

【注意】上述与字体有关的属性如何设置?

Ø界面设计时,在属性窗口中找到Font属性来设置;

Ø代码设计时,才划分援用这些属性名来进行设置。

.Height和Width

Case 6

.KeyPreview

    决定是窗体还是具有焦点的控件响应键盘事件。

    False: 默认值,只有窗体具有焦点时才引发键盘事件;True:由窗体响应键盘事件。

5.8.2 基本事件

    设置窗体左边沿和上边沿的坐标。

MaxButton和MinButton

    设置窗体右上边是否有最大/最小按钮

.Picture

    设置窗体中要显示的图形,设置时只需指明图片所在位置及文件名即可。如果界面设计时设置了Picture属性,图片被保存起来并与窗体同时加载。

.ScaleHeight和ScaleWidth

       设置窗体内部容器可用区域的高度和宽度。

        其他窗体要载入内存,必需通过Load语句或Show方法一个个地载入。

运行了局:当Form1被加载时,通过使用AddItem方法,将七个列表项添加到列表框List1MsgBox函数的功能是在屏幕上显示消息。

End Sub

    设置窗体的状况,有三个值:0(缺省值)- 一般;1-最小化;2-最大化

.CurrentX

    设置在窗体上输出文本或图形时的起始X坐标。

.CurrentY

.Fontname、Fontsize、FontBold、FontItalic、FontStrikethru和FontUnderline

设置哪一个命令按钮为窗体的缺省按钮(设置为True

5.2 窗体常见事件

5.2.1 鼠标事件

1 概述

       与窗体相关的鼠标事件有五个:ClickDblClickMouseDownMouseUpMouseMove

 

1                   Private Sub Form_Load()

 

If Button = 2 Then Print "你按下了右键"

0

         一组单选按钮中,最多只有一个按钮的value值为True

l         ListIndex属性

Select Case Shifttest

.MouseUp事件:释放任意鼠标按钮时产生。

 

 

它们之间的联系和区别:

单击鼠标,按挨次引发的事件过程为:MouseDown MouseUp Click

l         PassWordChar属性

双击鼠标,按挨次引发的事件过程为:MouseDown MouseUp ClickDblClickMouseUp

双击鼠标时还移动鼠标,则按挨次引发的事件过程为:MouseDown MouseUp ClickMouseMoveDblClickMouseUp

Click事件和DblClick事件不能识别当事件产生时鼠标指针的位置;而MouseDown MouseUp MouseMove等不仅能识别当事件产生时鼠标指针的位置,还能识别各鼠标按钮以及是否同时按下了键盘上的ShiftCtrlAlt键。

l         Form1的MDIChild属性设置为True。

MouseDown MouseUp MouseMove等事件的参数如下表:

参数

阐明

备注

Button

一个位域参数,其二进制低三位描述鼠标按钮状况

2、  甚么是一组单选按钮?

010—右(2

100—中(4

Shift

一个位域参数,其二进制低三位描述事件产生时键盘上ShiftCtrlAlt键的状况

Drawnow = False

010Ctrl 2

100Alt 4

X,Y

Case 3

 

 

注意:上述五个鼠标事件的事件过程的格式,见P.48P.49

l         主菜单——窗体标题栏下方的菜单。

2           MouseDown事件

当按下鼠标按钮时就可触发此事件。

 

例:       Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Command1.Move X, Y

End Sub

Move方法可将命令按钮移动到窗体的不同位置,单击窗体时鼠标指针的位置(X,Y)决定命令按钮的新位置。(X,Y)决定命令按钮的左上角坐标。可上机试。

 

Button参数是位域参数,其每位代表一个状况。Button参数的最低三位划分表示鼠标的左键、右键和中键。

语句:    Line (X1, Y1)-(X2, Y2)

功能:    绘制一条从点(X1, Y1)到点(X2, Y2)的直线。

语句:    Line -(X2, Y2)

功能:    绘制一条从上次绘制点到点(X2, Y2)的直线。

l         Enable属性

5.5  命令按钮(CommandButton

End Sub

2  Load事件

 

3           MouseUp事件

当释放鼠标按钮时产生此事件。

MouseUp事件往往与MouseDown事件或MouseMove事件配合使用。看下面的例子:(上机试。)

Option Explicit

Private x1, y1

 

6  Deactivate事件

x1 = X

End Sub

End Sub

 

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

Line (x1, y1)-(X, Y)

List1.AddItem "星期五"

 

u      掌握菜单的设计与应用

drawnow = False

5  Hide方法

当鼠标指针在屏幕上移动时就会引发MouseMove事件。

例1                  结合Line方法使用MouseMove事件

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Clear方法

用户选中的或最后单击的列表项的索引值,如果用户自行输入,无论输入的文本是否与列表项相符,ListIndex的值均为-1

注意:    ⑴此例的运行了局是曲线。(当然,从微分的角度看也是线段。)上机试。

              ⑵当鼠标指针移过屏幕时要调用多少次MouseMove事件?并不是对鼠标经过的每个像素城市产生MouseMove事件,操作环境每秒生成有限多个鼠标消息。

5.3  文本框

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Line -(X, Y)

Circle (X,Y),50

End Sub

上机运行了局:鼠标指针移动得越快,在任意两点之间所能识其它MouseMove事件越少。浩繁圆圈挤在一起表明鼠标在此位置移动缓慢。

11  Paint事件

例3     MouseMove事件往往也与MouseDown事件或MouseUp事件配合使用。

Dim Drawnow As Boolean

Change事件是当滚动条中滑块位置产生变化,即value值产生变化时所引发的事件。

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Drawnow = True

2

CurrentY = Y

控件是包孕在窗体内的对象。每种类型的控件都有自己的一套属性、事件和方法,以适用于特定的目的。

End Sub

Text1 , Text2 , Command1

If Drawnow Then Line -(X, Y)

y1 = Y

……

⑶可用MouseMove事件检测是否同时按下了两个或两个以上按钮。

001Shift1

End Sub

 

3的运行了局:只有按下鼠标任意按钮时才绘线(曲线),而在释放按钮时停止绘线。

l         WordWrap属性(文本回绕)

Print "你按下了Shift"

可用Button参数的返回值来判断鼠标事件产生时按下或释放了哪个鼠标按钮。

Ø结合Line方法使用MouseDown事件

Button参数一般可用十进制数值或常数来表示,如下表:

二进制值

援用时:列表框名.selected(Index)

常数

l         WindowList属性

适用事件

000

0

 

未按下或释放任何按钮

MouseMoveMouseDownMouseUp

001

1

vbLeftButton

按下或释放左键

返回列表框中项目的个数。

010

2

vbRightButton

5.8  框架(Frame

MouseMoveMouseDownMouseUp

100

4

vbMiddleButton

按下或释放中键

阐明:此语句只是把窗体载入内存,窗体在屏幕上并不可见,但此时可任意操作该窗体。

 

3

 

Dim Shifttest As Integer

MouseMove

101

5

              窗体名.Hide

文本框获得焦点的方法   ②用鼠标单击

MouseMove

110

l         ScrollBar属性

 

同时按下中、右键

MouseMove

111

7

    上式中,Index是项目的索引值。

同时按下左、右、中键

If Button = 4 Then Print "你按下了中键"

 

注意:    ⑴在MouseDown事件中使用Button参数可判断按下了哪个按钮;MouseUp事件中使用Button参数可判断释放了哪个按钮。

List即为字符串数组,下标由0开始,可利用List属性为列表框增加或删除列表项。

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

 

1       Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

 

5.2.3              检测ShiftCtrlAlt键的状况

l         Value属性

 

2            Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

4  Show方法

If KeyCode = vbKeyA Then

If Button = 4 Then Print "你释放了中键"

l         Alignment属性             

 

3            Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 1 Then Print "你仅按下了左键"

阐明:Spc(n)表示插入n个空白字符。

注意:    ⑴一次MouseMove事件可以设置Button参数的所有位或某些位,而不是只能设置一位。

3的运行了局:如果仅按下左键,则显示上述信息。但如果同时按下左键和右键,则不显示任何信息。

 

l         新建一个工程(此时已有一个窗体Form1)

If Button And 1 Then Print "你按下了左键"

If Button And 2 Then Print "你按下了右键"

KeyDown事件:按下任意键(键盘上的物理键)

注意:    4的运行了局:只要按下左键,就显示信息,而不管是否同时按下其他键。

                   ⑵此例应使用And操作符。

5  LostFocus事件

5            综合练习题:以例3为基础,编写一个应用程序,要求只有按下鼠标左键时才绘线(曲线),而在释放左键时停止绘线;按下鼠标右键时画直线。此题要求同学们上机操作。

3  Load语句

 

Dim drawnow As Boolean

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

控制标签的大小是否随文本长度的变化而火平扩充。默认值为:False,即标签大小不会随文本长度的改变而改变。

drawnow = True

设置或返回编辑域(文本框)中的文本内容。

CurrentY = Y

End If

If Button = 2 Then

Line -(X, Y)

End If

Line -(X, Y)

vbCascade

功能与列表框相同。

If drawnow Then

Line -(X, Y)

End If

End Sub

 

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

 

End Sub

 

 

       当鼠标指针位于窗体上方时,窗体将识别鼠标事件;当鼠标指针位于控件上方时,控件将识别鼠标事件。

Timer控件在设计时放入窗体的大小是固定的,运行时,它是不可见的。

    设置窗体在屏幕上的重建方法。有两个值:True和False

二进制值

当在组合框的文本框上输入数据时,就会引发该事件过程。

常数

意义

000

0

Ø结合Move方法使用MouseDown事件

l         ActiveForm属性

001

KeyDown事件和KeyUp事件的返回参数有两个:KeyCodeShift,而KeyPress事件的返回参数只有一个:KeyAscii

Print "你按下了Alt"

按下Shift

010

SelText ——设置替代前所选择文本的字符串内容。

vbCtrlMask

.ScaleLeft和ScaleTop

u      掌握标准控件的应用

5.8.1 基本属性

vbAltMask

 

011

    即便对于当前窗口而言,它也可能含有多个能进行输入的部件(窗体或控件)。Windows规定当前窗口中也只能有一个部件能接收键盘事件,而其他部件则不能接收键盘输入、响应键盘事件。称这个能处理键盘事件的部件“拥有输入的焦点”,简称“具有焦点”;而称那些不能接收键盘输入的部件“不具有焦点”。

 

0vbListBoxstandard):缺省值,标准样式(图5-1,教版本)。

101

5

    设置窗体是否看见。

同时按下ShiftAlt

110

    指当前处于活动状况、能接收键盘事件的窗体或控件。

 

同时按下CtrlAlt

111

7

 

同时按下ShiftCtrlAlt

.MouseMove事件:每当鼠标指针移动到屏幕新位置时产生。

阐明:使用Shift参数的方法与Button参数相同。

1     VB6.0编程实用教程P.222

Option Explicit

 

组合框实际上可看作是列表和文本框的组合,它有三种形态(由Style属性决定):下拉式组合框、简单组合框和下拉式列表框。见图5-3P.94.

Shifttest=shift And 7

l         SelCount属性

Case 1

5.2.2      检测鼠标按钮

Case 2

Print "你按下了Ctrl"

l         Enabled属性

vbShiftMask

事件产生时鼠标指针的位置坐标

Print "你按下了ShiftCtrl"

If KeyCode = vbKeyA And Shift =1 Then

       当用户关闭窗体时,会依次激发QueryUnloadUnloadTerminate事件。

    设置全部窗体的高度和宽度。

Print "你按下了CtrlAlt"

End Sub

Print "你按下了ShiftCtrlAlt"

End Select

End Sub

隐藏

对象名. SetFocus

5.2.4              键盘事件

1 几个概念

                           1——标题在按钮的左边

6

    Windows虽允许同一时刻有多个程序一起运行,但只允许其中有一个窗口处理键盘事件,而其他窗口则得不到键盘输入,这个能接收键盘输入的窗口就是当前窗口,当前窗口的标题栏是加亮显示的。

3

 

    改变焦点的方法

 

       对程序员而言,若想使用代码改变焦点,可使用SetFocus方法。其用法是:

       部件名.SetFocus

注意:SetFocus方法只适用那些EnabledVisible属性为True的对象部件。

 

2         键盘事件概述

窗体和控件能识其它键盘事件有三种:

KeyPress事件: 按下某个ASCII码对应的键

End Sub

KeyUp事件:   释放任意键

阐明:⑴只有获得焦点的对象才可以接收键盘事件。

⑵键盘事件彼此并不排斥,而是有联系的。当按下某一键时,将依次产生KeyDown事件和KeyPress事件,而松开此键后产生KeyUp事件。

KeyDown事件和KeyUp事件提供最低级的键盘响应,如ShiftCtrlAlt键的组合、箭头键、PageUpPageDown、区分数字小键盘的数字键与打字键盘的数字键,还有一些功能键。而KeyPress事件检测的键只对应于所有标准的ASCII字符,如KeyPress事件对F1CtrlShiftAlt等不响应。

KeyDown事件和KeyUp事件划分响应按下键的操作和释放键的操作,而KeyPress事件只响应按下键操作。

1

l         Caption属性

      

3     KeyPress事件

       当按下与ASCII字符对应的键时产生。

       一般情况下,要处理标准ASCII字符时都要使用KeyPress事件。KeyPress事件能区别大小写字符。

1     Private Sub Text1_KeyPress(KeyAscii As Integer)

KeyAscii = Asc(UCase(Chr(KeyAscii)))

思考题3:利用Timer控件使文字在窗体内往返振荡,碰着窗体边缘即改变方向运动。

运行了局:文本框Text1中输入的所有字符都强制转换成大写字符。

阐明:    KeyPress事件的返回参数只有一个:KeyAscii ,其返回的是对应于按键的ASCII码的十进制值。

Chr函数将ASCII字符代码转换成对应的字符;

5.3.4  举例1

  Asc函数将字符转换成对应的ASCII码。

 

设置框架的标题,使用户明确框架内控件的用途。

       KeyDown事件和2000名大学生公园纵酒狂欢KeyUp事件讲演键盘按键准确的物理状况:按下或松开。

       与此对照的是,KeyPress事件并不讲演键盘状况,不能识别键的按下或松开状况。

.WindowState

 

参数                            阐明

KeyCode                      指示按下的物理键的键代码(此时“A”与“a”作为同一个键返回)

Shift                                   指示CtrlShiftAlt键的状况

 

    见教材P.90.

 

1       Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

If Button = 2 Then Print "你释放了右键"

MsgBox "你按下了A"

End If

       KeyDown事件和KeyUp事件提供两个参数KeyCodeShift来返回输入字符的信息,如下表:

 

阐明:⑴功能键F1的键代码是vbKeyF1,Home键的键代码是vbKeyHome,……

KeyCode参数只能识别物理键,不能识别大小写。如果要判断输入的字符是大写形式或小写形式,需使用Shift参数。(见下例)

⑶键盘事件使用Shift参数的方法与鼠标事件相同。(见上节3.2.3)

 

2      Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

Case 5

MsgBox "你按下了大写A"

.ClipControls

End Sub

 

3        Dim shiftkey As Integer

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

shiftkey = Shift And 7

Select Case shiftkey

Case 1

  1Change事件

Case 2

Print "你按下了Ctrl"

Case 4

Print "你按下了Alt"

Case 3

Print "你按下了ShiftCtrl"

Case 5

如何援用列表中选定的项目?应使用如下语法:

Case 6

Print "你按下了CtrlAlt"

Case 7

Print "你按下了ShiftCtrlAlt"

End Select

End Sub

 

4        讲解习题二:第2题(教材P.44),要求输入成绩后按回车,马上就在另一个文本框中显示该分数对应的等级。

有关程序代码参看:VB上机讲义\实验二演示\工程一。

 

5.2.5       其他窗体事件

       Visual Basic程序是由事件驱动的,编写一个VB程序的最主要工作就是为大量事件编写程序代码。

       当用户开始运行只有一个普通窗体的应用程序时,一般会依次产生以下四个事件:InitializeLoadActivateGotFocus事件。

1  Initialize事件

       首先触发的是Initialize事件,它是在窗体作为一个对象被第一次创建时触发,此时窗体并没有成型。因此,在此事件过程中通常是一些设置窗体属性的代码,其格式为:

框架的作用是将同一类对象分组(例如有多个单选按钮)。

……

End Sub

 

上述程序运行的了局是:只要按下鼠标,就会绘制一条从上次绘制点到鼠标当前位置的直线。第一条直线始于缺省起点,也就是窗体的左上角。  (上机试。)

       此事件在Initialize事件产生后异常短的时间内,在窗体被载入内存时产生。在此事件过程中,通常指定控件的初始设置值。例如,指定要装入ComboBoxListBox控件的列表项内容,或给窗体级变量赋初始值等等。其格式为:

注意:鼠标事件以及后面要介绍的键盘事件并不是窗体独有的,其他控件也支持鼠标事件和键盘事件。

 

 

 

Private Sub Form_Load()

List1.AddItem "星期一"

List1.AddItem "星期二"

If Button = 1 Then

List1.AddItem "星期四"

End Sub

List1.AddItem "星期六"

List1.AddItem "星期日"

MsgBox "Form1正在被卸载!"

End Sub

5.1   窗体基本属性

 

3         Activate事件

当只有一个窗体时,则此窗口一定是活动的,所以会引发Activate事件。在此事件过程中,可以在窗体上输出文本或图形。其格式为:

窗体也称表单,它是VB应用程序运行时用户与应用程序之间交互的界面,用户主要通过窗体以及放在窗体上面的控件来与应用程序进行交互。所以说窗体是应用程序的操作平台。

……

End Sub

滚动条是用来协助窥察数据和调整数据的工具,一般不需知道具体的数值。滚动条有两种:火平滚动条和垂直滚动条。

4  GotFocus事件

按下或释放右键

阐明:在程序运行中,当控件或窗体用户通过单击的方法使控件或窗体首次获得焦点时,将先引发Click事件,然后引发GotFocus事件;但是一旦控件已获得焦点,则再次单击控件时,将只产生Click事件。

 

 

       此事件在窗体失去焦点时产生。

 

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

l         Caption属性

标签的常用属性:

7  QueryUnload事件

   DIForm1ActiveFormActiveControl

       QueryUnload事件在Unload事件之前产生,此事件的典型用法是在关闭一个应用程序之前用来确保包含在该应用程序中的窗体是否还有未完成的任务。例如,如果还未保存某一窗体中的新数据,则应用程序会提示保存该数据。其格式为:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

……

 

 

设置标题的位置,有两个值   0(默认值)——标题在按钮的右边

       Unload事件的引发原因与QueryUnload事件相同,当窗体从内存中卸载时产生。

       一般来说,可用一个Unload事件过程来确认窗体是否应被卸载或用来指定想要产生的操作。

2    Private Sub Form_Unload(Cancel As Integer)

MsgBox "本窗体正在被卸载!", "Unload事件"

End Sub

运行程序,单击标题栏上的关闭按钮,会弹出一个消息框。

 

9  Terminate事件

       当窗体从内存中卸载完时产生。其格式为:

Private Sub Form_Terminate()

该属性返回命令按钮的状况: True时,表示按钮被按下

图标方法排列子窗体

注意:用End语句来结束应用程序,这三个事件:QueryUnloadUnloadTerminate事件均不会产生。

vbArrangeIcons

10  Resize事件

 

.Appearance属性

3              Private Sub Form_Resize()

Command1.Left = (ScaleWidth - Command1.Width) / 2

Command1.Top = (ScaleHeight - Command1.Height) / 2

用于删除列表框中某指定列表项(即删除List数组中的指定元素),其格式为:

运行了局:当调整窗体的大小时,命令按钮一直连结在窗体中央。

 

控制文本框失去焦点时,文本框内被选择的文本是否仍以反白方法显示。默认值为True,即不再以反白方法显示。

       在一个对象被移动或放大之后,或覆盖现象结束之后,或使用Refresh方法时,将引发Paint事件。

本节思考题:

 

参考答案:(实例演示:见\VB上机讲义\实验二演示)

5.2.6       窗体的方法

1  Cls方法

       该方法清除窗体上所有的图形和文本。其格式为:

Visual Basic提供了一个计时器控件,此控件提供一个时间间隔属性,每隔一个时间间隔,就会引发计时器事件。

 

2  Print方法

       向窗体输出表达式的值。其格式为:

              对象名.Print  {Spc(n)|Tab(n)} expression charpos

End Sub

Tab(n)表示将插入点定位在绝对列号为n的列上。

charpos参数指定下次打印时插入点的位置。有三个取值:

;————接在上次打印的字符之后

l         Default属性

Tab  ——定位在下个打印区的起始位置。

 

 

       用来将窗体或控件载入内存。格式为:

              Load 窗体名或控件名

MouseMoveMouseDownMouseUp

注意:当程序开始执行时,只有设置为启动对象的那个窗体会自动载入内存并在屏幕上显示,且自动引发该窗体的Load事件。

按下Ctrl

 

If Button = 1 Then Print "你释放了左键"

       Load语句加载窗体时并不显示它,仅把它装入内存。为了在屏幕上显示窗体,应使用Show方法。调用Show方法与设置窗体Visible属性为True具有相同的效果。其格式为:

              窗体名.Show  [0/1]

       默认值为0,表示以非模态形式显示窗体,即能通过鼠标将焦点转移到其他窗体上。

4  用户单击一个名为Cmdsport的按钮,则显示一个名为Frmsport的对话框,在该对话框中提供一个运动项目列表。

Private Sub Cmdsport_Click()

Load Frmsport                                                 '首先加载窗体

Frmsport!LstsportAddItem  "足球"        '为窗体中的列表框控件添加项目

Frmsport!LstsportAddItem  "篮球"

Frmsport!LstsportAddItem  "排球"

[注意]:“列表框名.Text”与“列表框名.List(列表框名.ListIndex ”的意义相同。

End Sub

 

注意:    若事先没有用Load语句加载窗体,当直接使用Show方法时也能先加载窗体并显示窗体。为何一般都是先使用Load语句加载窗体再使用Show方法显示窗体,而不是直接使用Show方法呢?

       其一,用户希望加载窗体时隐藏它,这样用户可以对窗体及窗体中的控件进行设置和操作,待完成后再显示窗体;

       其二,如果窗体已事先加载,则再使用Show方法时窗体的显示速度会更快。

 

4           MouseMove事件

       如果希望从屏幕上隐藏一个窗体,而在内存中保存它以便能继续使用,应使用Hide方法。调用Hide方法与设置窗体Visible属性为False具有相同的效果。其格式为:

5-2  三类组合框比较表

阐明:⑴窗体被隐藏后,下次执行Show方法或Load语句时,不会再次引发该窗体的Load事件。

⑵若执行Hide方法时,窗体未事先装入内存,则此时会先加载窗体再隐藏该窗体。

 

6  Unload语句

       将窗体从内存中卸载。其格式为:

              Unload 窗体名

例如:  Unload Me

阐明:⑴窗体被卸载后,下次执行Show方法或Load语句时,会将窗体再次装入内存并引发该窗体的Load事件。

⑵窗体从内存中被卸载前,会引发QueryUnload和Unload事件。

 

5.2.7       图象处理

       程序运行时若要在窗体中加入布景图案,可通过Loadpicture函数实现。其格式为:

Private Sub Form_Initialize()

上式中,对象名可以是窗体、图片框或图像框,缺省时为窗体。“文件名”为文件全名。

阐明:  ⑴可在界面设计阶段设置窗体的Picture属性,此时图片会被保存并与窗体同时加载;如果在程序运行时通过Loadpicture函数来加载图片,该图片不和应用程序一起保存。

⑵可使用Savepicture语句来保存某个对象的图片属性。其格式为:

菜单的设计主要是利用菜单编辑器来实现,打开“菜单编辑器”的方法是:

保存Picture属性中的图片时,若原文件是位图、图标、元文件或增强元文件,则图片将以原始文件的格式保存;若原文件是GIF或JPEG文件,则图片保存为位图文件。

另外,Image属性中的图片总是以位图(bmp)的格式保存,而不管其原文件的格式。

 

5.2.8       多窗体设计

       对于多窗体设计,VB提供了多重窗体设计方法和多文档界面设计方法,两者的区别是:

多重窗体设计方法中,多个窗体之间是并列的关系。

多文档界面设计方法中,多个窗体中只有一个MDI窗体,称为父窗体,其他窗体称为子窗体。MDI窗体与子窗体之间是包含与被包含的关系。子窗体最小化后,它的图标显示在MDI窗体用户区的底部;子窗体最大化后将填满MDI窗体的全部工作区,此时,它的标题与MDI窗体的标题一起显示在MDI窗体的标题栏。如图3-1、图3-2、图3-3所示。(教材P.53

If Button = 1 Then Print "你按下了左键"

1  多重窗体设计方法

       添加多个窗体的方法是:

⑴单击“工程”菜单的“添加窗体”命令。

⑵选择启动窗体,即程序从哪个窗体开始执行。默认的启动窗体为Form1,若要改变启动窗体,方法是:单击“工程”菜单的“工程1属性”命令,在“启动对象”栏中选择启动窗体。

1:设计一个含三个窗体的项目,进行学生成绩登记。(教材P.54

 

2  多文档界面设计方法

⑴设计步骤:

4            Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

l         单击“工程”菜单的“添加MDI窗体”命令

l         MDI窗体中设计一个“窗口”菜单,用来管理子窗体。

 

l         若还想添加子窗体,则单击“工程”菜单的“添加窗体”命令,再将它的MDIChild属性设置为True。

未按下任何键

该属性在设计状况时不可用。

l         ActiveControl属性

MDI窗体的属性,返回活动子窗体上具有焦点的控件。

1

不能

 

l         AutoShowChildren属性

单击鼠标时还移动鼠标,则按挨次引发的事件过程为:MouseDown MouseUp Click MouseMove

意义

菜单的属性,在菜单编辑器中设置。(教材P.121

l         Arrange方法

MDI窗体的属性,排列MDI窗体中的子窗体。其格式为:

       MDI窗体名.Arrange 排列方法值

排列方法值的取值及含义见下表:

排列方法值

常量

阐明

该属性决定按钮是否有效,值为True时有效。

FontUnderline:  设置下划线

例:要援用活动子窗体上具有焦点的控件,可用下列代码:

vbTileHorizontal

l         Style属性

子窗体的方法,调整子窗体的位置。其格式为:

vbTileVertical

垂直方法排列子窗体

4)若焦点在同一窗体的另外一个命令按钮上,按Enter键选择有焦点的命令按钮。

       当改变一个窗体的大小时产生。

 

 

l         Zorder方法

Print "你按下了ShiftAlt"

[子窗体名]Zorder [位置值]

⑵设计MDI窗体的限制:

      位置值有两种:010为缺省值,表示将此子窗体移动到最前端同时为活动子窗体;1表示将子窗体移到后方。

 

3  多文档界面设计时的注意事项

⑴加载和卸载

加载子窗体时,一定会加载MDI窗体;而加载MDI窗体时,不会加载子窗体。

    关闭MDI窗体时,首先引发MDI窗体的QueryUnload事件,接着是子窗体的QueryUnload事件,然后是子窗体的Unload事件,最后是MDI窗体的Unload事件。

End Sub

阐明:子窗体名省略时,表示当前活动子窗体。

一个应用程序只能有一个MDI窗体。

Align属性的控件和具有没有界面的控件可以安排于MDI窗体,而其他控件不可。

 

设计子窗体时不能有菜单。

 

注意:Align属性是PictureBoxData等控件的属性,用于肯定控件在窗体上的位置。

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

2:设计一个程序:已知初速度、加速度、时间,求间隔及末速度。

2        下例程序在每次识别MouseMove事件之处,都绘制一个小圆圈。因此,可窥察到在一段时间内实际上有多少次MouseMove事件产生。(上机试。)

 

对于程序设计人员来说,程序窗口中包含的菜单、按钮、列表等,尽管从外表和功能上有很大区别,但都是一个个的对象(既有属性又有事件)。在Visual Basic中,把菜单、按钮、列表等对象称为控件。

下图显示了Visual Basic 6.0的标准工具箱(控件箱):

 

文本框是一个异常重要的控件,它为用户提供了输入信息(如暗码)和显示信息的场所,且在文本框内,可做与文本编辑有关的动作,如剪切、复制、粘贴、选定文本、删除等操作。

文本框的缺点是不能接收太大的数据。

5.3.1 基本属性

l         Alignment属性                  0:默认值,左对齐

控制控件上显示文本的对齐方法   1:右对齐

2:居中对齐

       例如,拖动一个窗体的边框,或者一个窗体被最大化、最小化或还原。当父窗体调整大小时,可用Resize事件过程来移动控件或调整控件大小,也可用此事件过程来重新计较那些变量或属性。

       Paint事件过程中,通常编写需要重新绘制图形的代码。但若AutoRedraw属性被设置成True,重新绘图会自动进行,于是就不需要Paint事件过程。

       此事件在窗体(而非其他控件)获得焦点时产生。

l         SelLengthSelstartSelText属性

MDI窗体的属性,控制装载子窗体时是否自动显示子窗体。有两个值:TrueFalse

设置保密字符,一般设为“*”。

当设置该属性时,文本的吸收、存储皆为输入的正文,但在屏幕上显示的却是设置字符的连续显示。(如一连串的“*”)

见教材P.68. 

设定文本框中是否出现火平或垂直滚动条,此属性只能在设计模式下设定,且MultiLine属性为True时才有效。

此属性有4个值:0 ——不要滚动条

                1 ——要火平滚动条

                2 ——要垂直滚动条

                3 ——要火和悦垂直滚动条

下拉式组合框

l         Enable属性

l         Text属性

存放文本框中显示或输入的文本。

l         SelLengthSelStartSelText属性

这三个属性用来实现文本编辑的很多功能,它们即可用于返回值,也可用于设置值。

1)当用于返回值时(即选定一段文本后):

SelLength ——返回文本框内反白区域的字符串长度。

.Caption属性

SelText ——返回文本框内反白区域的字符串内容。

2)当用于设置值时:

SelLength ——设置所选择的字符数。

SelStart ——设置所选择文本的起始点(从0开始)。

2

[注意]:这三个属性在设计时不能设置,只能在程序中进行读写。

5.3.2 基本事件

FontBold: 设置黑体

Print "你按下了Shift"

当用户改变文本框内容或用代码改变Text属性值时会引发Change事件,其过程为:

    Sub 文本框名_Change( )

    ……

 

  2GotFocusLostFocus事件过程

文本框获得焦点或失去焦点时划分引发的事件过程。

                       ①按[Tab]

                       ③在代码中使用SetFocus方法

5.3.3 基本方法

l         SetFocus方法

该方法用于使对象获得焦点,其格式为:

    End Sub

  UCase函数将字符转换成大写字符;

设计一个简易写字板……

见教材P.61~64

举例2:(讲完“标签”一节后再讲)

设计一个程序……

见教材P.64~66

5.4  标签(Label

标签也是显示文本信息的一个控件,但运行时用户不能输入任何信息,也不能修改、编辑。

因此,标签通常用来作注释或显示数据了局。

同时按下左、右键

l         Autosige属性

List1.AddItem "星期三"

l         Backstyle属性(布景状况)

控制标签控件的布景是否要变成透明,其值有01两种。默认值为1(不透明)。

l         Borderstyle属性(边框风格)

该属性即前述的select数组,它返回或设置一个项目是否被选中,该属性在设计时不可用。

l         Caption属性(设置标题)

肯定标签显示的文本,其长度<1000个字符。

可在设计状况下从属性窗口中设置该属性;也可在运行过程中通过下列语句来修改标签显示内容:  标签名.Caption = 显示的文本串

       对用户而言,若想改变焦点,可使用鼠标单击的方法。

使用该属性的前提是Autosige属性值为True

当文本超出标签范围,该属性为False(默认值)时,标签沿火平方向扩展;否则,沿垂直方向扩展。

举例:见教材P.64.  (2)

5.5.1 基本属性

End Sub

       此事件在窗体不再是活动窗体时产生(在LostFocus事件之后)。

设置命令按钮上显示的文本。

[注意]:(1)可通过Caption属性创建命令按钮的访问键快捷方法。

        方法是:将标题中某一字符前加上“&”字符,使构成该命令按钮的热键,运行时,该字符带下划线。

例:& Command

    程序运行时,命令按钮上显示“Command”。

    可用Alt+C来选定该命令按钮。

                           False时,表示按钮未被按下

Tab(n)——定位在绝对列号为n的列上。

 

[注意]:(1)一个窗体中只能有一个命令按钮为缺省按钮。

001—左(1

3)当命令按钮的Default设置为True且所在窗体是活动的,且焦点不在其它命令按钮上,用户可按Enter键来引发此缺省按钮的Click事件过程。

3

5.12.2 常用的事件过程

该属性有两个值:True(默认值)和False

 

l         Cancel属性

命令按钮的Cancel属性设置为True时,该按钮是撤消按钮。此时,不论该按钮是否具有焦点,按[ESC]键均相当于单击该按钮。

 

2)当一个命令按钮的,同一窗体中其它命令按钮的Cancel属性自动地设置为False

.Enabled

l         Value属性

……

2)若不想创建访问键,又要使标题中包含“&”字符,则应添加两个连字符“&&”,这样,在标题中就只显示一个连字符,而不显示下划线。

该属性在设计状况下无效。

       设置在窗体上输出文本或图形时的起始Y坐标。

1、  基本控件中除计时器、菜单、框架和标签外,都可以具有焦点。凡是需要和用户交互的控件都能拥有焦点。

2、  获得焦点的方法

(1)       鼠标单击控件

(2)       [Tab]

3、  通常情况下,[Tab]键的游走次序和控件竖立的挨次一致,但可通过控件的TabIndex属性来改变游走的挨次。

 1:在窗体上先后竖立了Text1Text2Command1等三个控件,则这三个控件的TabIndex值划分为:012。按[Tab]键时,这三个控件获得焦点的挨次为:

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

5.6.1 基本属性

4、  具有TabIndex属性的控件还有一个属性TabStop,其缺省值为True。若某个控件的TabStop值设置为False,则按[Tab]键时,焦点将不会在此控件上停留。

5.5.3 举例:

设计一个电话号码的输入……

6

十进制值

 

2:若想改变上述三个控件获得焦点的挨次,则可在设计状况或程序代码中改变这三个控件的TabIndex值。

l         maxmin属性

这两个属性划分规定了滚动条滑块位于最左边(下边)和最右边(上边)时的值,即规定了滚动条的取值范围。

VB规定:maxmin属性的设置值必需在-3276832768之间。

max的默认值为32768min的默认值为0

l         Value属性

设置或返回当前滚动条滑块在滚动条中的位置值。要注意,在设置Value属性时,min<=value<=max ,缺省值为0

l         LargeChange属性

设定在用户单击滚动条空白区时递增或递减的value属性改变值。默认值为1

l         SmallChange属性

设定在用户单击滚动条箭头时递增或递减的value改变值。默认值为1

5.6.2 基本事件

滚动条的支持事件有ChangeGotFocusLostFocusKeyDownKeyDressKeyUpScroll

 

Scroll事件是指拖动滑块所引发的事件。

5.6.3 举例:

1:设计一个简易调色板。

      见教材P.73.

l         HideSelection属性

      见教材P.74.

阐明: RGB函数是最简单的指定颜色值的方法,它将红色、蓝色和绿色每种颜色的亮度分为256个等级,由0~255来表示,将不同亮度值的三种颜色调和,形成一种新的颜色,其格式为:  对象名.属性名=RGB(红色亮度值,绿色亮度值,蓝色亮度值)

按下Alt

 

5.7  单选按钮和复选按钮

1、  甚么是单选按钮、复选按钮?用户使用时的功能?

不能

一个容器里的按钮为一组,窗体、框架、图片框都可作容器。见教材P.77. 4-8

3、  基本属性(两类按钮的属性意义相近,一起阐明)

End Sub

8  Unload事件

MouseMove

 

l         Caption属性

设置标题的文本内容。

End Sub

设置按钮在运行时的状况。            0  按钮未选中

1)对于复选按钮,此属性有三个值: 1  按钮被选中

2         按钮被选中,且不能再修改

         2)对于单选按钮,此属性有两个值   True :被选中

False(默认值)

.DblClick事件:对一个窗体对象来说,当用左键或右键双击窗体空白区域时产生;对一个控件来说,仅当双击左键时产生。如果DblClick事件在系统双击时间限制内没有出现,则对象识别为两个Click事件。

l         MultiLine属性

              对象名.Picture = Loadpicture("文件名")

[注意]:在设计框架及其内部的控件时,要正确地将控件放入框架内,让框架和控件形成一体,以便移动框架时,其上的控件也能一起移动。正确的设计方法是:

(1)       绘制框架(单击方法或双击方法都可)

(2)       在框架上安排控件,此时只能使用单击方法来绘制及安排控件。

4

⑹一般情况下应首先使用KeyPress事件,当KeyPress事件的功能不够使用时,才考虑使用KeyDown事件和KeyUp事件。

清除列表框中的所有列表项(即清除List数组中的所有元素)。

确认文本框是否能输入信息,缺省值为:True

该属性有两个值:  True(默认值)

                  False :框架内控件模糊,不会对事件响应。

.Left和Top

ClickDblClick ,用法如前。

5.8.3 举例:见教材P.78. 一个例子(框架及单选按钮的用法)。

 

5.9  计时器(Timer

              窗体名.Cls

       鼠标事件和键盘事件都用Shift参数判断事件产生时是否按下了ShiftCtrlAlt键,以及以甚么样的组合按下这些键。

5.9.1 常用属性和事件

例:       Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

该属性肯定计时器能否对Timer事件作出响应。

有两个值:TrueFalse ,其中True为缺省值,表示允许计时器对Timer事件响应,即有效。

l         Interval属性

时间间隔属性,取值范围为1~65535,单位为毫秒。缺省值为0,此时相当于Timer计时器无效。

此属性可在设计状况或运行时来设置。

 

l         Timer事件

此事件在计时器有效时的每个Interval属性值的时间间隔之后产生。其格式为:

……

End sub

5.9.2 举例:

l         AddItem方法

    见教材P.81. 起。

2:设计一个程序,……

    见教材P.83. 起。

011

思考题1:利用循环实现文字的动态移动。

思考题2:利用Timer控件实现文字的动态移动。

End Sub

SelStart ——返回文本框内反白区域的起始位置。

 

 

直接在文本框中输入

例如:要将列表框List1中新加入的项目变为当前选项,可用下行语句:

5.10.1 常用方法

先介绍两个重要数组:List数组和Select数组。

List数组中存放各列表项正文的内容,数组下标从0开始,即List(0)为第1个元素,依次类推。

Select数组元素与List的数组元素一一对应,Select数组元素是Boolean型的,例如:List(1)放的是第2个列表项的内容,而Select(1)存放的是此列表项是否被选中的信息,True表示被选中,False表示未被选中。

1:设计一个可关闭的计时器。

[注意]:在设计时,可以使用List属性在列表中增加或删除项目;

在运行时,可以使用AddItem方法向列表框中添加项目,使用RemoveItem方法删除项目,使用Clear方法清除列表框中的所有项目。

使用AddItem方法的格式为:

对象名.AddItem  “列表项内容”[Index]

上式中,对象名可以是列表框的Name属性,也可是组合框的Name属性。

新增的列表项安排于数组的甚么位置,由Index参数决定,为0时,新增列表项置于数组第1个元素;Index参数缺省时,新增列表次置于数组的最后。

l         RemoveItem方法

Case 7

        对象名.RemoveItem Index

上式中,Index为列表项的索引值,例如:

        RemoveItem 3             ‘删除List(3)元素

l         Clear方法

4     KeyDown事件和KeyUp事件

5.10.2  常见属性

l         List属性

⑵对每个MouseDown事件或MouseUp事件只设置一位,故无法检测是否同时按下了两个以上按钮;如果同时按下多个按钮,Viaual Basic会将此操作诠释为两个或多个独立的事件。

l         Columns属性

指定列表中的列数,0为缺省值,表示单列表示;若为非0的正值n,则多列显示。

l         ListCount属性

MouseMoveMouseDownMouseUp

 

返回或设置当前所选项目的索引值,若未选中任何1项,则ListIndex= -1List(-1)返回一个空字符。

MDI窗体的属性,返回具有焦点或最后被激活的子窗体。

如果是多重选择,则ListIndex返回用户最后单击的列表项的索引值。

如何援用列表中的项目?应使用如下语法:

         列表框名.List(Index)

End Sub

Print "你按下了ShiftAlt"

         列表框名.List(列表框名.ListIndex

l         Multiselec属性

用来控制是否可以多重选取列表项。

有三个值:012 0为默认值,表示不能多重选取。

1——表示简单多重选择

2——表示扩展的多重选择:即可使用[Shift][ctrl]键。

.MouseDown事件:按下任意鼠标按钮时产生。

返回被选中项目的数量。

十进制值

肯定标签是否有边框,其值有01两种。默认值为0(无边框)

l         Selected属性

Index的取值范围:0~ListCount-1

l         Sorted属性

决定列表项是否按字母挨次自动排序。

有两个值:TrueFalse False为缺省值,表示“否”。

火平方法排列子窗体

该属性描述了列表框的状况,有两个值01

同时按下ShiftCtrl

1vbListBoxCheckbox):每个列表项前都有一个复选框(新版本)。

l         Text属性

存放用户当前选定的或最后单击的列表项内容。

FrmsportShow                                      '在屏幕上显示窗体

l         ItemData属性

该属性是一个长整型数的数组,其数组元素的个数与响应的List数组的元素数目相同,此数组用来标识List数组的各个列表项。常用作列表框控件中项目数组的索引。

[注意]:用AddItem方法在列表中增加一个项目时,ItemData数组中也会自动插入一项,其缺省值为其对应项目的值。

l         NewIndex属性

返回最近加入到列表中的选项的索引值,该属性运行时才有效。此属性在使用自动按字母排序列表中异常有用。

列表框将选项列于框中;用户可用鼠标在上面选取一个或多个选项;若选项较多时,VB会自动给列表框加上垂直滚动条或火平滚动条;但列表框中的选项只能在设计时事先给出或在运行时通过代码来增减选项,不能由用户通过鼠标来任意增减选项。

List1.ListIndex=List1.NewIndex

5.10.3 举例:

例:设计一个程序,界面如图5-2所示……

下拉式列表框

5.11  组合框(ComboBox

 

     组合框和列表框的异同:

1、  相同点:都是通过AddItem添加列表项,用RemoveItemClear清除列表项,都是通过List数组存放列表项。还有很多属性的功能相同。

2、  不同点:(1)组合框内一次只能选取一个列表项;而列表框可以选取多个列表项。

          2)列表框不可在框内输入数据;而组合框可以直接在组合框内输入数据,纷歧定要在框内选取列表项。

5.11.1 基本属性

l         Style属性

                              0(默认值):下拉式组合框

肯定组合框的形态,有三个值:  1:简单组合框

2:下拉式列表框

三者的特点和区别如表5-2所示:(P.94.

此属性用来设置经过多少时间间隔对Timer事件调用一次。

阐明

Case 4

简单组合框

KeyDown事件和KeyUp事件的事件过程的格式:见教材P.47

Style

5.10  列表框(ListBox

列表一直显示

引发click事件过程

引发Dblclick事件过程

引发change事件过程

0

.Click事件:对一个窗体对象来说,当用左键或右键单击窗体空白区域或一个无效控件时产生;对一个控件来说,当用左键或右键单击该控件时产生,但对CheckBoxCommandButtonListBoxOptionButton控件来说,Click事件仅当单击左键时产生。

 

2)某个命令按钮的Default设置值为True时,窗体中其它的命令按钮自动设置为False

1

⑵相关属性和方法

显示

级联方法排列子窗体

⑴焦点

2

不可

5.13  菜单

CurrentX = X

不能

         Shift参数的取值及意义如下表:

l         Text属性

l         ListListCountSorted属性

对于下拉式组合框、简单组合框,Text属性在设计时可以输入信息,作为运行时的初始值显示;而下拉列表框的Text属性为只读型,设计时不能输入信息,只用来在运行时显示列表中确当前选项。

.BorderStyle

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

l         ListIndex属性

End Sub

设置窗体重建时是只画新表露部分还是重画全部窗体。(与AutoRedraw属性配合使用,见第九章)

此三个属性的用法与文本框相同。

l         Enable属性

Change事件过程:

5.6  火平/垂直滚动条

5.12.3 常用的方法

AddItem方法

RemoveItem方法

Line -(X, Y)

上述方法均与列表框的使用方法相同。

5.12.4 举例:

例:设计一个程序,……

    见教材P.95.

Private sub Timer1_Timer( )

隐藏

菜单也是一种控件,菜单分为两类:主菜单和快捷菜单。

上式中,属性名可以是BackcolorForecolorFillcolorBordorcolor等任一属性。

l         快捷菜单——按鼠标右键显示的菜单。

5.13.1  菜单的设计

      Savepicture 对象名.属性名, "文件名"

→“工具”菜单/“菜单编辑器”命令→弹出“菜单编辑器”窗口

同时按下左、中键


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值