注册 登录
编程论坛 VB6论坛

求助:picturebox实时曲线整体左移时部分网格线也出现左移问题?

mickey2028 发布于 2017-03-11 08:37, 2860 次点击
各位大侠:
  大家好!
  首先感谢大家解决了我以前的问题,特别是xzlxzlxzl美女高手,她能及时地解决我的问题。
  但小弟喜欢捣鼓,现在又发现以下问题:
  1、实时曲线整体左移时为什么部分网格线也出现左移问题?
  2、如何在里面画虚线网络线,又不影响曲线整体左移的效果?


只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
6 回复
#2
xzlxzlxzl2017-03-11 13:30
用下述代码覆盖你全部代码,如果有更复杂的不动背景,则需要用到PaintPicture方法的opcode参数,将动态的前景贴到不动的背景上,这样需要增加一个后台图片。
程序代码:
Dim DataFromCom As Integer '从串口读过来的实时值
Dim DataFromComLast As Integer '上次的串口值
Dim TimeCount As Integer

Private Sub Form_Load()
   
    '***********************************
    '后台仅做复制过去再复制过来的动作
    picBack.Visible = False
   
    picBack.DrawStyle = 2
    picBack.DrawWidth = 1

    PicScale picBack '调整图像框的坐标系
    PicXLine picBack
   
    picBack.DrawStyle = 0
    picBack.DrawWidth = 2
    '***********************************
   
    '***********************************
    picShow.DrawStyle = 2
    picShow.DrawWidth = 1
   
    '画图要在前台画
    PicScale picShow '调整图像框的坐标系
    PicXLine picShow
   
    picShow.DrawStyle = 0
    picShow.DrawWidth = 2
    '***********************************
   
End Sub

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

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

Private Sub PicXLine(picX As PictureBox)
   
    Dim intStep As Integer
    For intStep = 0 To 10
   
        picX.Line (0, intStep * 1000)-(picX.ScaleWidth, intStep * 1000), vbBlack
        
        picX.Line (0, -intStep * 1000)-(picX.ScaleWidth, -intStep * 1000), vbBlack  '用黑线清除原来的线
        
    Next
    picShow.DrawStyle = 2
    picShow.DrawWidth = 1
   
    For intStep = 0 To 10
   
        picX.Line (0, intStep * 1000)-(picX.ScaleWidth, intStep * 1000), vbWhite
        
        picX.Line (0, -intStep * 1000)-(picX.ScaleWidth, -intStep * 1000), vbWhite
        
    Next
     picShow.DrawStyle = 0
    picShow.DrawWidth = 2
   
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 Timer_Timer()

    DataFromComLast = DataFromCom

    Randomize
    DataFromCom = CInt(1000 * Rnd)

    TimeCount = TimeCount + 1
   
    '对出边界的判断要提前,另15缇=1像素,这样不会出现除不尽的情况
    '这主要是你调整了坐标系导致的实际图形复制只复制了上半幅,下半幅未复制到,而负数的图形是画到下半幅的。将图形拷贝起点坐标系修改如下,则无论正负均会左移
    If ((TimeCount + 1) * 60 > picBack.Width) Then
       picBack.PaintPicture picShow.Image, -60, -picShow.Height / 2, picShow.Width, picShow.Height, 0, -picShow.Height / 2, picShow.Width, picShow.Height  '从前台复制到后台
       picShow.PaintPicture picBack.Image, 0, -picShow.Height / 2, picShow.Width, picShow.Height, 0, -picShow.Height / 2, picBack.Width, picBack.Height '从后台显示到前台是立即进行的
       TimeCount = TimeCount - 1
    End If

    DrawRealLine picShow, TimeCount, DataFromCom, DataFromComLast 'OK
    PicXLine picShow  '重画栅格线
   
End Sub

#3
mickey20282017-03-11 18:23
回复 2楼 xzlxzlxzl
美女高手:你好!
  你能在周末休息的时间内给我快速解决问题,在此表示非常地感谢。
  但用了你修改的代码我又发现了以下几个问题:
  1、当实时数据为一个定值时,实时曲线就不能画线了(显示)?
  2、实时曲线整体平移的区域范围有限,比如说在-25℃至25℃内可以平移,超过25℃就不行了?我在代码中用40℃测试就不行。

只有本站会员才能查看附件,请 登录
#4
xzlxzlxzl2017-03-11 23:42
修改较多,直接上工程文件,内附一个我简单的曲线左移工程,在不需要效率的情况下可用那种方式解决。
只有本站会员才能查看附件,请 登录
#5
mickey20282017-03-12 11:43
回复 4楼 xzlxzlxzl
美女高手:你好!
  昨晚这么晚了还帮我修改代码,确实非常地感谢!!
  直接用你的工程基本上可以解决我的问题了,但我想在里面画虚线网格线,我修改了部分代码,网格线只能画出一半,不知为什么?
  还请麻烦你看看??

只有本站会员才能查看附件,请 登录
#6
xzlxzlxzl2017-03-12 19:05
已经修改坐标系了,坐标原点在图片左边缘中间,所以要画全竖线,y坐标应该是从picX.ScaleHeight / 2到-picX.ScaleHeight / 2,画竖线正确代码如下:
  For intStep = 1 To 10
    picX.Line (intStep * dd, picX.ScaleHeight / 2)-(intStep * dd, -picX.ScaleHeight / 2), vbWhite
  Next
#7
mickey20282017-03-12 20:26
回复 6楼 xzlxzlxzl
太感谢了!完美解决了我的问题。
1