当前位置:编程学习 > VB >>

用VB做波形显示遇到了瓶颈,求大师相助!

我想用VB做一个波形显示器,它的显示方式是先在黑背景下显示一段波形,当波形填充完整个区域后,后面的数据就会从右开始刷新以前的数据,刷新的方式是用pset花的点,先抹去上一场的波形,抹去上一场的波形的方式是将上一场波形的坐标点上过去的颜色(在画上一场波形的时候已经将该点的颜色保存下来了,其实就是背景颜色)替换掉波形的颜色,然后画上这一场的波形,我的代码在下面,可是我遇到了一个瓶颈,当我抹去过去的波形,填上颜色的时候总是有缺口,背景中的一些线总是被切断,求高手相助!!!


Option Explicit
 Dim TX(800) As Integer, TX_ago(800) As Long
 Dim TX_xb As Integer, TX_cal As Integer, TY As Integer
 Dim gallery0_cankao As Integer

Private Sub Form_Load()
  Call clear_form
  Call load_picture
  Call load_others
End Sub

Public Function load_others()
  Timer1.Enabled = False
  'ReDim TX(0 To Picture1.ScaleWidth)
End Function

Public Function load_picture()
    Dim CX, CY, F, i
    Picture1.ScaleMode = 3
    Picture1.DrawWidth = 1
    Picture1.ScaleWidth = 800
    Picture1.ScaleHeight = 400
    Debug.Print Picture1.ScaleWidth
    Debug.Print Picture1.ScaleHeight
    Picture1.BackColor = vbBlack
    For i = 1 To 20
        F = i / 20
        CX = F * Picture1.ScaleWidth
        CY = F * Picture1.ScaleHeight
        Picture1.Line (CX, 0)-(CX, Picture1.ScaleHeight), RGB(35, 35, 35) '列
        Picture1.Line (0, CY)-(Picture1.ScaleWidth, CY), RGB(35, 35, 35)   '行
    Next
    
End Function

Private Function clear_form()
    Dim i As Integer
    For i = 0 To 200
     Debug.Print
    Next
End Function

Public Function point_set(X As Integer, Y As Integer)
    Picture1.PSet (Val(X), Val(Y)), vbBlue
End Function
Public Function point_clear(X As Integer, Y As Integer, Color As Long)
    Picture1.PSet (Val(X), Val(Y)), Color
End Function


Public Function cankaoxian(i As Integer)
    Dim CX, CY
    CX = Picture1.ScaleWidth
    CY = Picture1.ScaleHeight
    Picture1.Line (0, i)-(CX, i), vbRed
End Function


Private Sub Gallery0_start_Click()
  gallery0_cankao = 200
  Call cankaoxian(gallery0_cankao)
  Timer1.Enabled = True
End Sub


Private Sub Gallery0_stop_Click()
  Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()

  Dim i As Integer, a As Integer, temp As Long
  
  i = TX_cal Mod Picture1.ScaleWidth
  TX_cal = TX_cal + 1
  TY = 60 * Cos(TX_cal * 3.1415 / 180) + 60 * Sin(3 * TX_cal * 3.1415 / 180) + gallery0_cankao
  
  temp = Int(TX_cal / Picture1.ScaleWidth)
  If temp <> 0 Then
  Call point_clear(i, TX(i), TX_ago(i))
  End If
  temp = Picture1.Point(i, TY)

  If temp <> -1 Then
  TX_ago(i) = temp
  Else
  TX_ago(i) = 0
  End If


  TX(i) = TY
  Call point_set(i, TY)
  
End Sub
--------------------编程问答-------------------- “背景线被切断”是主要是因为显示器(三原色)的原因造成的视觉问题吧。
如果你用白色来画波形,或背景色用白色,你就会觉得显示状态好得多了。


还有一个建议,在Function load_picture()中:

   Picture1.ScaleWidth = 800
   Picture1.ScaleHeight = 400
这两句最好别用,你应该在设计时,把Picture1的.ScaleMode直接选成3
然后直接输入它的Height和Width值,使它的ScaleHeight变为400,ScaleWidth变为800。
--------------------编程问答-------------------- 一个动态绘制正弦波形图的程序例子 --------------------编程问答-------------------- 谢谢1楼,我按照你说的“直接输入它的Height和Width值,使它的ScaleHeight变为400,ScaleWidth变为800”背景线就再也没有出现被截断的情况了,顺便问一下:在直接设置ScaleHeight和ScaleWidth和“直接输入它的Height和Width值”有什么区别吗?(我是新手,请多多关照!嘿嘿~~) --------------------编程问答--------------------
引用 2 楼  的回复:
一个动态绘制正弦波形图的程序例子

我花了一天时间研究了一下你给的程序,我想用画笔的方式来设置画出来的线的颜色和粗细,

    hpen = CreatePen(PS_SOLID, 4, vbBlue)
    lngK = GetTickCount
    MoveToEx lngMemoryDC, lngX, dblY, ByVal 0&
    lngX = lngX + 1
    dblY = (0.45 * H * Sin(K * lngX) + 0.5 * H)
    SelectObject lngMemoryDC, hpen
    lngP = LineTo(lngMemoryDC, lngX, dblY)



    hpen = CreatePen(PS_SOLID, 4, vbBlue)和SelectObject lngMemoryDC, hpen是自己添加的,PS_SOLID是常量,但调试的时候怎么报错“PS_SOLID没定义”?而且我直接用1代替了PS_SOLID之后,不管我怎么调整画笔的颜色,画出来的线都是黑色的,但调整粗细在画图的时候却可以表现出来? --------------------编程问答-------------------- 想绘制不同颜色的曲线,且要有好的图画效果,建议你使用GDI+,功能比GDI强大很多,也容易实现的多。
--------------------编程问答--------------------
建议不用背景色划线的方式清除上一屏,而是重新初始化背景色以及其他必要的标签等。
--------------------编程问答--------------------
引用 6 楼  的回复:
建议不用背景色划线的方式清除上一屏,而是重新初始化背景色以及其他必要的标签等。

不是用背景色吧...... --------------------编程问答--------------------
引用 5 楼  的回复:
想绘制不同颜色的曲线,且要有好的图画效果,建议你使用GDI+,功能比GDI强大很多,也容易实现的多。

我正在看GDI+ 不过我还是很想弄懂,为什么把画笔颜色改变了,在画图的时候图像效果却没有变化? --------------------编程问答-------------------- http://download.csdn.net/detail/veron_04/4039695
http://download.csdn.net/detail/veron_04/4237285
建议你用tlb的方式,简单方便。 --------------------编程问答--------------------
引用 9 楼  的回复:
http://download.csdn.net/detail/veron_04/4039695
http://download.csdn.net/detail/veron_04/4237285
建议你用tlb的方式,简单方便。

这个我都下了,在看教程的时候我死活也没能在VB6.0里找到GDI+,例子里面的程序我一个也没能跑起来,大师,请问一下怎么给自己的VB加载GDI+? --------------------编程问答-------------------- 把GdiPlus.tlb放到system32下即可 --------------------编程问答-------------------- 绘制动态折线图的VB6源代码。支持超过上下限变颜色和数据点显示。
http://download.csdn.net/detail/zhao4zhong1/1987571 --------------------编程问答--------------------
引用 11 楼  的回复:
把GdiPlus.tlb放到system32下即可

谢谢你,我已经弄好了 --------------------编程问答--------------------
引用 12 楼  的回复:
绘制动态折线图的VB6源代码。支持超过上下限变颜色和数据点显示。
http://download.csdn.net/detail/zhao4zhong1/1987571

谢谢你,我已经弄好了 --------------------编程问答-------------------- http://www.m5home.com/bak_blog/article/282.html



参考这个波形显示例子:)
补充:VB ,  控件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,