如何让画线的程序具有预览的功能?(ch03\练习7.vbp)
所谓“预览”意思是移动鼠标时,可以看到要画的线,而当放开鼠标时,决定最终直线。
分析:
定义 全程变量 (x0,y0) 表示画直线起始点
(x1,y1) 表示上一次画直线的终点坐标。
1)利用mousedown获得画直线起始点
x0=x, y0=y
并将画图方式选择为:
me.drawmode=vbnotxorpen (原值:vbcopypen)
含义:同一图形(在同一位置上)画两次等于没有画。
2)利用mousemove(鼠标移动时发生事件)
首先注意画直线起始点确定没有?(有起始点才能画直线 isempty(x0)=false)
第一次(从起始点)移鼠标时画直线(isempty(x1)=true)
line(x0,y0)-(x,y)
x1=x, y1=y
、
第二次(及以上)移动鼠标时: 首先将上一次画直线擦去
(isempty(x1)=false ) line (x0,y0)-(x1,y1)
然后再画新的直线
line(x0,y0)-(x,y)
x1=x, y1=y
3)利用mouseup事件捕获画直线最后一点。
如果有直线起始点(x0,y0)且有(x1,y1)
首先擦去已画过直线 line(x0,y0)-(x1,y1)
x1=empty
将画笔改回初始值:me.drawmode=vbcopypen
画直线:line(x0,y0)-(x,y)
x0=empty
4)利用isempty(变量名)判断是否有直线的起始点及上一次画直线的终止点。(ch03\练习7.vbp)
对话框的设计
对话框是VB应用程序与用户进行信息交换的窗口,可以使用VB提供函数,msgbox函数或inputbox函数作为对话框,亦可以使用commondialog控件设计对话框,甚至用户自已设计对话框。
Inputbox函数
inputbox(prompt [,title])
prompt:用于设定显示在对话框中的信息内容。
Title:是一个可选参数,用于设定显示在对话框中标题的信息内容。
函数返回值:返回用户输入字符串,如果用户单击cancel则返回空字符串。
注意:使用inputbox函数作对话框,一般只用于简单数据输入到窗口。
例:编写一个具有预览功能画弧程序。(ch03\练习10.vbp)
在对象上画弧的方法:
对象名.circle (x,y),r,c,sang,eang
1)在通用中定义全局变量
Dim ang1, ang2 As Single
Dim r1 As Single
Dim x0, y0 As Single
2)在窗体上放置一个命令按钮,单击命令按钮开始画弧,输入画弧起始角及终止角。
Private Sub Command1_Click()
pi = 3.14
ang1 = pi * (Val(InputBox("输入起始角:"))) / 180
ang2 = pi * (Val(InputBox("输入终止角:"))) / 180
End Sub
3)在mousedown事件中获得画弧的园心。
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
x0 = X
y0 = Y
Me.DrawMode = vbNotXorPen
End Sub
4)在mousemove事件中,将上一次弧擦掉,画新的弧。
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Not IsEmpty(x0) Then
If Not IsEmpty(r1) Then
Circle (x0, y0), r1, , ang1, ang2
End If
r1 = ((X - x0) ^ 2 + (Y - y0) ^ 2) ^ 0.5
Circle (x0, y0), r1, , ang1, ang2
End If
End Sub
5)在mouseup 事件中画出最后图形
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Not IsEmpty(x0) Then
If Not IsEmpty(r1) Then
Circle (x0, y0), r1, , ang1, ang2
End If
Me.DrawMode = vbCopyPen
r1 = ((x0 - X) ^ 2 + (y0 - Y) ^ 2) ^ 0.5
Circle (x0, y0), r1, , ang1, ang2
x0 = Empty
r1=empty
End If
End Sub
3.7 主动模式的程序设计
除了“事件驱动”程序设计模式之外,VB也允许我们将程序设置成“主动模式”。主动模式的程序与以前我们所讲DOS程序很相似。
如何将程序设置为主动模式
1)启动VB,建立一个“标准EXE”工程,选取“工程/工程名称属性”菜单命令,在“工程属性”对话框中,将“启动对象”设置为“sub main()”
2)利用菜单的“工程/添加模块”命令新增一个模块,在标准模块的代码窗口中输入sub main子程序。
3)执行这个程序。
例:建立一个工程名为:主动 .vbp 工程,并且在该工程中建立一个submain()子程序,读取用户数据,且设置为启动对象。
1)启动VB,在“工程/工程属性”中将“启动对象设置为:submain
2)在“工程/添加模块”中添加一个标准模块。在标准模块代码窗口中输入submain子程序。
sub main()
dim s as string
s=inputbox(“ 请输入数据“)
msgbox “您输入了” + s
end sub
doevents与主动模式程序
对VB程序而言,主动模式与事件驱动模式是可以并存的,如果我们所编写的程序只含有主动模式程序代码,将语句一行一行地编写成主程序和相关子程序即可。
但是如果所编写的程序同时有主动模式和事件驱动模式的程序代码,那么就不应该让主动模式的程序执行费时很多工作,因为主动模式的程序执行时,其他事件驱动模式的程序代码将被锁住,而无法执行。
当然有时候还是很难避免让主动模式的程序执行费时很久的工作,就必须在主程序中插入doevents语句使主程序做间歇性的休息,允许其他的事件驱动模式的程序代码有机会被执行。
例:打开ch03\doevets.vbp工程