对图片框中的有效区域进行放大,放大的过程应该包括:
1.MouseDown
2.MouseMove
3.MouseUP
4.图形的重画
具体的操作过程如下:
在图片框控件中你想放大的区域起始位置按下鼠标的左键:
按住鼠标的左键不放,在图片框上沿水平的方向拖动鼠标,直到你要放大区域的结束位置,
然后松开鼠标的左键。
放大过程的程序代码:
(1)MouseDown:要放大图形,首先要按下鼠标的左键来确定放大区域的起始点,这个动作的鼠标事件就是MouseDown.
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture1.CurrentX = X
Picture1.CurrentY = Y
firstpx = Picture1.CurrentX
firstpy = Picture1.CurrentY
Picture1.PSet (Picture1.CurrentX, Picture1.CurrentX), QBColor(9)
End Sub
在这个程序中,要做的是,记录下由左键按下的所确定的点的坐标.所以用CurrentX,Currenty函数来记录这个点的坐标,然后将这个坐标存入firstpx,firstpy这两个参数中,然后画—个点作为标记。
(2)下一个动作是拖动鼠标选中要放大的信号区域。反应这个动作的事件是MouseMove.
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
nowx = X
nowy = Y
End Sub
在MouseMove这个事件中,随着鼠标的不断移动,VB也不断地把鼠标的新坐标放入X,Y这两个参数中去。我们为了要保证记录下最新的民林坐标,就需要不断地将X,Y的值传递给变量nowx,nowy.
(3)紧接着的动作是MouseUp.当松开鼠标的左链时,我们要确定放大区域的终止坐标,同时还要调用绘图的子程序来重新绘制放大区域的图形。
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture1.DrawStyle = 2
Picture1.Line (firstpx, firstpy)-(firstpx, nowy), QBColor(2)
Picture1.Line (firstpx, nowy)-(nowx, nowy)
Picture1.Line (nowx, nowy)-(nowx, firstpy)
Picture1.Line (nowx, firstpy)-(firstpx, firstpy)
widthindots = Picture1.Width
a% = setzoomscale((firstpx), (nowx), widthindots)
Call axisnumberz
Picture1.MousePointer = 2
For i = Int(firstpx) To Int(nowx)
xpoint = i
ypoint = Filedata(i)
If xpoint = Int(First) Then
xold = xpoint
yold = ypoint
End If
Picture1.Line (xpoint, ypoint)-(xold, yold), QBColor(10)
xold = xpoint
yold = ypoint
Next
Call gridon
End Sub
前四行Picture1.line的语句实际上是做了一个短形框,用米显示被选中的
放大区域.下面的循环语句是用来在图片框中重新绘制放大区域的图形。所有的图形数据都在Filedata()这个数组中,只要不停地调用就可以了。
在for语句中,看到的Int(nowx)和Int(firstpx)这两个函数。这是两个求整的函数。因为nowx和firstpx是鼠标的坐标,它的值是实数型的,然而在图形中的每一个信号对应在x轴上的值都是整型的,所以,要利用Int()函数将位坐标的值变为整型,然后用循环来不停地读入X轴的坐标.
Setzoomscale()子函数的程序如下:
Pvivate Function setzoomscale(xstart as double,xend as double,hsteps as integer)
Xincrement = (xend - xstart) / hsteps
Datalen = len(test)
Dataidnum = FreeFile
Ymin = 0 ‘判断图形中的最大最小
Ymax = ymin
For I = int(xstart) to int(xend)
Ynew = filedata(i)
If jmin > ynew then ymin = ynew
If ymax < ynew then ymax = ynew
Next I
Picture1.scale(xstart -5,ymax +(ymax - ymin)/10)-(xend + 5,ymin – (ymax - ymin)/10)
End Function
这段函数是对选中的图形放大区地行图形的比例调整,经过对图形中信号的逐一比较.得出其中得最大和最小值.然后根据这两个值来确定图片框控件的长宽和比例值。
下面,再来看axisnumberz()的程序代码,这段程序主要是给放大后的图形的X,Y方向加上放大后的数轴.
Private Sub axinumberz()
Xnuminc = Picture1.ScaleWidth/(htics-1)
Ynuminc = Picture1.ScaleHeight/(vtics-1)
Xnum1 = Picture1.ScaleLeft
Ynum1 = picture1.ScaleTop
Gridspacex = Picture1.Width/(htics-1)
Gridspacey = Picture1.Height/(vtics-1)
For ix = 0 to htics -1
Number$ = format$(xnum1+ ix*xnuminc +Str$(fpx),”0”)
X1 = Picture1.left + ix*gridspqcex- 0.5*TextWidth(Number$)
Y1 = Picture1.Height + Picture1.Top + 0.5*TextHeight(“0”)
Form1.Currentx = x1
Form1.Currenty = y1
Form1.Print Number$
Next ix
For iy = 0 to vtics -1
Number$ = format$(xnum1+ iy*ynuminc +Str$(fpx),”0.00”)
X1 = Picture1.left - TextWidth(Number$) – TextWidth(“.”)
Y1 = Picture1.Top+ iy * gridspacey - 0.5*TextHeight(“0.00”)
Form1.Currentx = x1
Form1.Currenty = y1
Form1.Print Number$
Next iy
End sub
要在划分出的网格处给图形标上对应的数字。Htics和Vtics是你选择的划分的格数,Number$将对应的网格处的坐标变成字符串.x1求出了对应Number$处的坐标,然后又加上了半个字符串的长度,使Number$显示在对应网格的中间。
如果对已经放大的图形还不够满意的话,可以审重复多次的放大图形,直到满意为止.
[[italic] 本帖最后由 dawn4640576 于 2008-1-7 10:00 编辑 [/italic]]