| 发表于:2007-03-18 12:11:581楼 得分:30 |
原来的程序写的比较乱, 模块化程度不够, 帮你重新写了一个, 最核心的功能已经完成了 在窗体上需要添加三个控件: 1. 一个名为picdraw的picturebox控件 2. 一个名为tmrdatacreate的timer控件 2. 一个名为tmrdraw的timer控件 option explicit private declare function bitblt lib "gdi32 " (byval hdestdc as long, byval x as long, byval y as long, byval nwidth as long, byval nheight as long, _ byval hsrcdc as long, byval xsrc as long, byval ysrc as long, byval dwrop as long) as long const channelnumber = 2 '通道数量 const databuffersize = 10000 '通道数据缓冲区大小 const screenscrollsize = 8 '屏幕滚动尺寸 const rulescalesize = 30 '标尺上的温度最大值 private type tempdata adata(0 to databuffersize - 1) as single istart as integer iend as integer end type private channeldata(0 to channelnumber - 1) as tempdata '通道数据 private channelcolor(0 to channelnumber - 1) as long '通道颜色 private prevdata(0 to channelnumber - 1) as single '用于通道作图的临时缓冲 '用于产生模拟数据的临时变量 private rnddir(0 to channelnumber - 1) as integer private rndcount(0 to channelnumber - 1) as integer private rnddata(0 to channelnumber - 1) as single private sub initdata() dim iloop as integer for iloop = 0 to channelnumber - 1 channeldata(iloop).istart = 0 channeldata(iloop).iend = 0 prevdata(iloop) = 0 rnddir(iloop) = 0 rndcount(iloop) = 0 rnddata(iloop) = 0 next iloop channelcolor(0) = vbred channelcolor(1) = vbgreen end sub private sub addchanneldata(byval ichannel as integer, byval fdata as single) dim itemp as integer with channeldata(ichannel) .adata(.iend) = fdata itemp = (.iend + 1) mod databuffersize if itemp <> .istart then .iend = itemp 'itemp = istart意味着缓冲区已满, 在此只能舍弃最新的数据 end with end sub private function getchanneldata(byval ichannel as integer) as single getchanneldata = -9999 '-9999意味着没有新的数据 with channeldata(ichannel) if .istart <> .iend then getchanneldata = .adata(.istart) .istart = (.istart + 1) mod databuffersize end if end with end function private sub drawdata(byval ichannel as integer, byval acolor as long) dim fdata as single fdata = getchanneldata(ichannel) if fdata <= -9999 then fdata = 0 picdraw.line (picdraw.scalewidth - screenscrollsize - 1, picdraw.scaleheight / 2 - prevdata(ichannel) * (picdraw.scaleheight / rulescalesize / 2))- _ (picdraw.scalewidth - 1, picdraw.scaleheight / 2 - fdata * (picdraw.scaleheight / rulescalesize / 2)), acolor prevdata(ichannel) = fdata end sub private sub screenscroll() bitblt picdraw.hdc, 0, 0, picdraw.scalewidth - screenscrollsize + 1, picdraw.scaleheight - 1, picdraw.hdc, screenscrollsize - 1, 0, vbsrccopy picdraw.line (picdraw.scalewidth - screenscrollsize + 1, 0)-(picdraw.scalewidth - 1, picdraw.scaleheight), picdraw.backcolor, bf end sub private sub tmrdatacreate_timer() dim iloop as integer for iloop = 0 to channelnumber - 1 if rndcount(iloop) = 0 then rnddir(iloop) = sgn(rnd - 0.5) '气温变化的方向 rndcount(iloop) = rnd * 10 + 5 '每种变化方向的连续变化次数 end if rnddata(iloop) = rnddata(iloop) + rnd * rnddir(iloop) rndcount(iloop) = rndcount(iloop) - 1 addchanneldata iloop, rnddata(iloop) next iloop end sub private sub tmrdraw_timer() dim iloop as integer screenscroll for iloop = 0 to channelnumber - 1 drawdata iloop, channelcolor(iloop) next iloop end sub private sub form_load() picdraw.scalemode = vbpixels initdata randomize timer tmrdatacreate.interval = 200 tmrdatacreate.enabled = true tmrdraw.interval = 200 tmrdraw.enabled = true end sub | | |
|