您现在的位置:首页 >> 课程案例 >> 内容

图形操作的综合应用实例

时间:2009-6-19 10:30:29 点击:3283

 

一、 几何图形绘制

利用Line方法和Circle方法及DrawWidthDrawStyleDrawMode属性。

[11-9]Circle方法绘制如图11-16所示的类似太极图的效果。程序如下:

Const pi = 3.1415926

Sub tjt(x, y, r)

    FillStyle = 1

    Circle (x, y), r                                 '绘制大圆

    Circle (x, y - r / 2), r / 2, , pi / 2, 1.5 * pi           '绘制弧线

    Circle (x, y + r / 2), r / 2, , 1.5 * pi, pi / 2

    FillColor = vbBlack

    FillStyle = 0

    Circle (x, y + r / 2), r / 5                        '绘制小圆

Circle (x, y - r / 2), r / 5

End Sub

Private Sub Form_Click()

tjt 3000, 1500, 1000

tjt 1000, 2500, 500

tjt 1000, 1000, 400

End Sub

11-16Circle方法绘制的类似太极图的效果

[1110]  在窗体上放置两个文本框,用于指定函数

的有效区间[a,b],根据区间值ab建立一个坐标系,用Line方法在窗体上绘制函数在区间[a,b]之间的积分面积区域。

根据区间[a,b]的值设置图形框的左上角坐标为(a-1b´b+1),右下角坐标为(b+1-1)。将区间[a,b]等分为n 份,在每一等分点i上,用Line方法连线到(i,i*i)。程序如下:

Private Sub Command1_Click()

    Dim a, b

    a = Val(Text1): b = Val(Text2)

    Picture1.Scale (a - 1, b * b + 1)-(b + 1, -1)

    Picture1.Cls

    Picture1.Line (a - 1, 0)-(b + 1, 0)                  ' 画坐标轴

    Picture1.Line (0, -1)-(0, b * b + 1)

    For i = a To b Step 0.01

        Picture1.Line (i, 0)-(i, i * i)

    Next i

End Sub

运行效果如图11.13所示。

1117绘制积分面积图

二、 简单动画设计

有计划地移动一个对象包括改变对象的形状和尺寸,这就是动画:。编程时可以采用帧动画原理,即通过一系列静态图辅之以连续快速变化产生动画效果,也可以通过Move方法改变图形对象的TopLeft属性来移动图形。此外,在移动图形的同时还可以改变图形的WidthHeight属性值形成相对运动。动画的速度使用时钟控制。

[1111]  利用图像控件设计红绿灯程序。

1)界面设计

在窗体上放置两个图像控件、一个时钟、一个命令按钮、一个框架控件和一个图像控件数组,并用鼠标单击Frame1使之激活,在其中加入一个标签控件。对各图像控件Picture属性设置相应的信号灯图片。如图11 18(a)所示。各对象属性设置见表11-8所示。

 

                  a                           (b)

11-18 陀螺转动控件

11-8 控件属性设置

控件名

属性设置

控件名

属性设置

 Form

Caption=“信号灯”

Time1

Interval=100

Image1

Stretch=True

Image2

Stretch=True

Frame1

Caption=“说明”

Label1

手动方式可单击信号灯使之变换信号。自动方式可模拟自动信号灯

Image3(0)

Stretch=True

Visible=false

Image3(2)

Stretch=True

Visible=false

Image3(1)

Stretch=True

Visible=false

在通用模块声明公有变量:  Public  t

2)编写事件代码

Public t

Private Sub cmd1_Click()

    If cmd1.Caption = "&C 改为手动方式" Then

        cmd1.Caption = "&C 改为自动方式"

        Timer1.Enabled = False

    Else

        cmd1.Caption = "&C 改为手动方式"

        Timer1.Enabled = True

    End If

End Sub

Private Sub Image1_Click()

    If Timer1.Enabled = False Then

    u = Image1.Tag

    Select Case u

        Case 1

            Image1.Picture = Image3(0).Picture: Image1.Tag = 2

        Case 2

            Image1.Picture = Image3(1).Picture: Image1.Tag = 3

        Case 3

            Image1.Picture = Image3(2).Picture: Image1.Tag = 1

    End Select

    End If

End Sub

Private Sub Image2_Click()

    If Timer1.Enabled = False Then

        u = Image2.Tag

        Select Case u

            Case 1

                Image2.Picture = Image3(0).Picture: Image2.Tag = 2

            Case 2

                Image2.Picture = Image3(1).Picture: Image2.Tag = 3

            Case 3

                Image2.Picture = Image3(2).Picture: Image2.Tag = 1

        End Select

    End If

End Sub

Private Sub Timer1_Timer()

    t = t + 1

    Select Case t

        Case 1

            Image1.Picture = Image3(0).Picture: Image1.Tag = 1

         Case 12

            Image1.Picture = Image3(1).Picture: Image1.Tag = 2

        Case 15

            Image1.Picture = Image3(2).Picture: Image1.Tag = 3

         Case 16

            Image2.Picture = Image3(0).Picture: Image2.Tag = 1

         Case 27

            Image2.Picture = Image3(1).Picture: Image2.Tag = 2

         Case 30

            Image2.Picture = Image3(2).Picture: Image2.Tag = 3

         Case 31

            t = 0

    End Select

End Sub

 运行后结果如图11-18(b)所示。

1012]模拟地球绕太阳旋转。程序运行结果如图1119

地球运动的椭圆方程为:

X=x0+rx*cos(alfa)

Y=y0+ry*sin(alfa)

其中x0y0为椭圆圆心坐标,rx为水平半径,ry为垂直半径,alfa为圆心角。

11-19 地球绕太阳旋转的模拟图

1)在窗体上放置2个合适大小的形状控件Shape1Shape2和一个定时器控件。其中Shape1表示太阳,放在窗体正中央。Shape2表示地球。这些控件的属性设置如表11-8所示。

11-9 控件属性设置

控件名

属性设置

控件名

属性设置

Shape1

Shape=circle

Fillcolor=VBred

BordStyle=0

Height=975

Width=975

Shape2

Shape=circle

Fillcolor=VBlue:

BordStyle=0

Height=375

Width=375

Time1

Interval=100

form1窗体的通用部分声明3个全局变量

Dim rx As Single, ry As Single

Dim alfa As Single

2)编写窗体的Load事件,程序如下:

Private Sub Form_Load()

    Shape1.Left = Form1.ScaleWidth / 2 - Shape1.Width / 2

    Shape1.Top = Form1.ScaleHeight / 2 - Shape1.Height / 2

   '计算椭圆轨道的水平半径rx和垂直半径ry

    rx = Form1.ScaleWidth / 2 - Shape2.Width / 2

    ry = Form1.ScaleHeight / 2 - Shape2.Height / 2

    '将表示地球的Shape2的初始位置定位在水平轴的0刻度位置上

    Shape2.Left = Form1.ScaleWidth / 2 + rx - Shape2.Width / 2

    Shape2.Top = Form1.ScaleHeight / 2 - Shape2.Height / 2

End Sub

3)编写定时器的Timer事件,程序如下:

Private Sub Timer1_Timer()

    alfa = alfa + 0.05             '绘制地球的运行轨迹

    Circle (Form1.ScaleWidth / 2, Form1.ScaleHeight / 2), rx, , , , ry / rx

    x = Form1.ScaleWidth / 2 + rx * Cos(alfa)

    y = Form1.ScaleHeight / 2 + ry * Sin(alfa)

    Shape2.Left = x - Shape2.Width / 2

    Shape2.Top = y - Shape2.Height / 2

End Sub

三、图形漫游

如前所述,VB中的图形可以显示在图片框上,也可以显示在窗体上,在一般情况下,窗体的尺寸不能大于屏幕,而图片框的尺寸不能大于窗体。这就是说,如果不进行处理,则显示的图形的尺寸不能超过屏幕的大小。

实际上,当实际的图形比屏幕(窗体)大时,在窗体或图片框上只能显示图形的一部分,其余部分在窗体或图片框之外,无法看到。这里提供一种方法,可以通过滚动来显示图形的隐藏部分。

[12-13] 编写程序,显示大尺寸图形。运行结果如图11-20所示。

11-20 图形漫游

1)在窗体上放置1个已装置图片的图形框、1个垂直滚动条和1个水平滚动条,大小、位置任意,其中水平和垂直滚动条的SmallChange属性为10LargeChange属性为50.

定义通用过程HVscroll控件滚动条的位置和宽度、最大、最小属性及可见性。如果窗体宽(高)度大于图形框宽(高)度时使水平(垂直)滚动条不可见,否则设置滚动条在窗体的下方与右边。滚动条可卷动的区域为图形框宽(高)度与窗体宽(高)度与窗体宽(高)度之差。过程代码如下:

Private Sub HVScroll()

    ' 定义水平滚动条HScroll1的位置和宽度、最大、最小属性及可见性

    HScroll1.Left = 0: HScroll1.Top = Form1.ScaleHeight - HScroll1.Height

    HScroll1.Width = Form1.ScaleWidth - VScroll1.Width

    HScroll1.Max = Picture1.Width - Form1.ScaleWidth 

 ' 滚动条卷动值

    HScroll1.Visible = (Picture1.Width > Form1.ScaleWidth)

    ' 定义垂直滚动条    VScroll1的位置和高度、最大、最小属性及可见性

    VScroll1.Top = 0: VScroll1.Left = Form1.ScaleWidth - VScroll1.Width

    VScroll1.Height = Form1.ScaleHeight - HScroll1.Height

    VScroll1.Max = (Picture1.Height - Form1.ScaleHeight)

    VScroll1.Visible = (Picture1.Height > Form1.ScaleHeight)

End Sub

2)编写窗体的Load事件,该事件完成数据准备。由于在设计时图形框和滚动条的前后顺序是任意放置的,使用Zorder方法将滚动条移动到图形框前面,使之可以滚动图形。程序如下:

Private Sub Form_Load()

    Picture1.Move 0, 0                        ' 移图形框到坐标原点

    HVScroll

    HScroll1.ZOrder 0                         ' 放在图形框前

    VScroll1.ZOrder 0

End Sub

3)编写窗体的ReSize()事件过程。当窗体大小发生变化时,调用通用过程HVScroll重新设置滚动条的位置和大小。程序如下:

Private Sub Form_Resize()

    HVScroll

End Sub

4)编写水平滚动条的Change事件和Scroll事件

Private Sub VScroll1_Change()

    Picture1.Top = -VScroll1.Value

End Sub

Private Sub VScroll1_Scroll()

    Picture1.Top = -VScroll1.Value

End Sub

5)编写水平滚动条的Change事件和Scroll事件

Private Sub HScroll1_Change()

    Picture1.Left = -HScroll1.Value

End Sub

Private Sub HScroll1_Scroll()

    Picture1.Left = -HScroll1.Value

End Sub

四、图形的重绘

重绘是是解决图形被覆盖后的恢复显示。对形状控件(LineShape)绘制的图形由系统自动处理,重绘主要是解决由绘图方法(PsetLineCircle)所绘制的图形。重绘主要由AutoRedraw属性和Paint事件处理。

AutoRedraw属性

用于设置窗体或其他容器控件对重绘的处理。当此属性为True时,重绘是自动进行的。这是由于系统为AutoRedraw属性为True的容器控件单独开辟了图形缓冲区,不但自动进行重绘,而且重绘的速度很快。但这是以消耗大量内存资源为代价的。

AutoRedraw属性为False时,不能特此自动重绘,重绘的工作就要依赖Paint事件过程来完成。

Paint事件

Paint事件与AutoRedraw属性的设置密切相关,只有AutoRedrawFalse时,Paint事件才能够发生。当对象被移动或大小调整后,或在被其他窗体覆盖后又置于顶层时,Paint事件发生。也就是说,凡是需要重绘时,Paint事件就会发生。

但是,Paint事件过程并不具备图形重绘的功能。应该利用Paint事件来实现容器控件的图形重绘。最好的办法是将绘图方法有关的语句放在Paint事件过程中,这样每当发生Paint事件时,图形就被重绘。

[12-13] 在窗体上放置一个图片框作为绘图板,采用人工拖动鼠标的画线的方式绘图,可以调整画线的宽度、颜色并具有清除图形的功能。

(1)    窗体界面设计

在窗体上放置2个图片框控件。Picture1作为绘图板,占据窗体的主要显示区。而Picture2则作为调色板容器,在Picture2上添加标签Label1(显示当前绘图线的颜色)和有8个元素的标签数组Label2(0)Label2(7),用于显示8种供选择的绘图颜色。再添加两个命令按钮Command1(清屏)Command2(结束)。添加一个水平滚动条HScroll1,用于调整画线的线宽。最后添加3个标签Label3Label4分别用于实时显示当前鼠标的XY坐标,Label5用于显示滚动条当前的取值。窗体布局如图11-21所示。其中各控件属性设置如表11-9所示。

11-21 手绘图形

11-10 窗体及控件属性设置

控件名

属性设置

控件名

属性设置

Form1

Caption=“手绘图程序演示

Label2(1)

BackColor=VBBlue

Command1

Caption=“清屏

Label2(2)

BackColor= VBgreen

Command2

Caption=“结束

Label2(3)

BackColor= VBcyan

HScroll1

Max=10: Min=0

LargeChange=3

SmallChange=1

Label2(4)

BackColor= VBRed

Label2(5)

BackColor= VBmagenta

Picture1

AutoRedraw=True

Label2(6)

BackColor= VBYellow

Label2(0)

BackColor= VBBlack

Label2(7)

BackColor= vbwhite

2)各事件过程代码如下:

Private flag As Boolean

Private Sub Command1_Click()

    Picture1.Cls

End Sub

Private Sub Command2_Click()

    End

End Sub

Private Sub Form_Load()

    Label5.Caption = HScroll1.Value

End Sub

Private Sub HScroll1_Change()

    Picture1.DrawWidth = HScroll1.Value

    Label5.Caption = HScroll1.Value

End Sub

Private Sub Label1_Click()

    Label1.BackColor = Label2.Item(Index).BackColor

    Picture1.ForeColor = Label1.BackColor

End Sub

Private Sub Label2_Click(Index As Integer)

    Label1.BackColor = Label2.Item(Index).BackColor

    Picture1.ForeColor = Label1.BackColor

End Sub

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

    If Button = 1 Then          '如果是鼠标左键,则开始绘图

        flag = True

    End If

End Sub

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

    If flag Then

    Picture1.PSet (X, Y)        '如果处于绘图状态,则绘制鼠标指针经过的所有点

    End If

    Label3.Caption = "X:" & Str(X)    '显示当前鼠标(绘点)的位置

    Label4.Caption = "Y:" & Str(Y)

End Sub

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

    If Button = 1 Then

        flag = False            '如果是左键抬起,则停止绘图

    End If

End Sub

作者:Admin  
  • 上一篇:文件处理技术的综合应用
  • 下一篇:没有了
  • VB程序设计学习网站(赣南师范学院) © 2008 版权所有 All Rights Reserved.
  • 地址:江西省赣州市经济技术开发区 赣南师范学院数学与计算机科学学院 邮政编码:341000
    Email:ZQ188@163.com 技术支持QQ:87319633 移ICP备10086号
  • GnsySjxy! V2.4