注册 登录
编程论坛 VB6论坛

求助:picturebox实时曲线图形整体左移时出现重叠问题?

mickey2028 发布于 2017-02-13 21:45, 2266 次点击
实时曲线绘制到picturebox最右边极限时,图形整体左移时就会出现重叠,希哪位大虾解决一下,谢谢!!
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
10 回复
#2
风吹过b2017-02-14 10:49
初步看了一下代码,问题出在 前台翻后台时位置有重叠。
正在测试,你属性用错了。

#3
xiangyue05102017-02-14 10:58
这种情况可以用巧方法绕过去的。
两个Picturebox,Picturebox1作为Picturebox2的容器。Picturebox2也可以是chart
Picturebox2中不断绘制曲线,并根据曲线X轴调整宽度,同时left不断调整使之向左移动
Picturebox1启用滚动条,并在更新曲线代码中使滚动条始终在最后即可。
这样就不会
#4
风吹过b2017-02-14 11:12
不看了,没时间测试,复制图像时出的问题。这个需要静下心来研究,我以前也是卡在这里,所以最后是保存所有需要绘图的点,然后后台全部重新绘制过。

你参考吧!
https://bbs.bccn.net/thread-306299-1-1.html
#5
xzlxzlxzl2017-02-14 20:22
主要代码的问题不大,对出边界的判断要提前,画图要在前台画,后台仅做复制过去再复制过来的动作,另15缇=1像素,我将你的50改成60了,这样不会出现除不尽的情况,如此修改后的测试正常,代码如下:
程序代码:
Option Explicit

Dim TimeCount As Integer
Dim DataFromCom As Integer
Dim DataFromComLast As Integer

Private Sub Form_Load()

   '后台进行绘图
    picBack.Visible = False

    PicScale picBack '调整图像框的坐标系
    PicXLine picBack
   
    '前台进行显示
    PicScale picShow '调整图像框的坐标系
    PicXLine picShow

End Sub

Private Sub Timer1_Timer()

   DataFromComLast = DataFromCom

    Randomize
    DataFromCom = CInt(1000 * Rnd)

    TimeCount = TimeCount + 1
   
    If ((TimeCount + 1) * 60 > picBack.Width) Then
       picBack.PaintPicture picShow.Image, -60, 0, picShow.Width, picShow.Height, 0, 0, picShow.Width, picShow.Height '从前台复制到后台
       picShow.PaintPicture picBack.Image, 0, 0, picShow.Width, picShow.Height, 0, 0, picBack.Width, picBack.Height '从后台显示到前台
       TimeCount = TimeCount - 1
    End If

    DrawRealLine picShow, TimeCount, DataFromCom, DataFromComLast 'OK


End Sub

Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer, DataFromComX As Integer, DataFromComLastX As Integer)

   picX.Line ((TimeCountX - 1) * 60, DataFromComLastX)-(TimeCountX * 60, DataFromComX), vbGreen

End Sub

Private Sub PicScale(picX As PictureBox) '调整图像框的坐标系

    picX.Scale (0, picX.ScaleHeight)-(picX.ScaleWidth, 0)
   
End Sub

Private Sub PicXLine(picX As PictureBox)
   
    Dim intStep As Integer
   
    For intStep = 0 To 5000 Step 500
        picX.Line (0, intStep)-(picX.ScaleWidth, intStep), vbWhite
    Next
   
End Sub

#6
mickey20282017-02-14 20:45
回复 5楼 xzlxzlxzl
这样修改的代码还不行啊!
#7
mickey20282017-02-14 20:46
回复 4楼 风吹过b
四楼的高手不错!可以借鉴,谢谢了!!
#8
风吹过b2017-02-14 20:47
我测试过了 50 改 60 ,还出现问题,然后继续 研究时,发现他的坐标系修改过了,就没时间去研究了。
#9
xzlxzlxzl2017-02-14 20:49
在我电脑上运行正常,我并不是简单50改60的,仔细看我5楼的代码你就看的出来。我发工程,你运行下。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2017-2-14 20:51编辑过]

#10
xzlxzlxzl2017-02-14 20:56
主要修改如下:
    If ((TimeCount + 1) * 60 > picBack.Width) Then   //提前判断是否出边界
       picBack.PaintPicture picShow.Image, -60, 0, picShow.Width, picShow.Height, 0, 0, picShow.Width, picShow.Height '从前台复制到后台
       picShow.PaintPicture picBack.Image, 0, 0, picShow.Width, picShow.Height, 0, 0, picBack.Width, picBack.Height //从后台显示到前台是立即进行的,原来是在判断语句外边
       TimeCount = TimeCount - 1
    End If

    DrawRealLine picShow, TimeCount, DataFromCom, DataFromComLast 'OK //这句是对前台画图,你的是对picBack画图
#11
mickey20282017-02-14 21:02
回复 9楼 xzlxzlxzl
可以了!我测试过了,谢谢!!看来这个网站上的高手如云啊!
以后好好向高手学习。
1