您的位置:程序门 -> vb -> 基础类



100分求一问题解决


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


100分求一问题解决[已结贴,结贴人:yml1001]
发表于:2007-03-18 10:40:05 楼主
程序要实现的功能很简单,我也写了一个模拟程序,可以发过去共同研究,我的qq:30926433
http://community.csdn.net/expert/topic/5402/5402834.xml?temp=.2579004
发表于: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
发表于:2007-03-18 12:46:212楼 得分:0
看到有人回帖无比高兴啊,谢谢了先,我44
发表于:2007-03-18 18:45:393楼 得分:0
jadeluo(秀峰)你写的程序模块化程度很高,程序写的非常好,但是我是新手,看不懂啊,你能针对我的程序,编写一下程序吗?你的程序看了一下午了,还是没能明白,明天就要交任务了
发表于:2007-03-18 22:23:294楼 得分:50
jadeluo(秀峰),还有两个问题向你请教
1:你给的程序画线是从右向左的,怎么改成是从左向右的呢?  
2:你用的是随机函数模拟的两条线,而我的是只有温度参数,你写的是两个参数阿,如何解决?for   iloop   =   0   to   channelnumber   -   1
                if   rndcount(iloop)   =   0   then
                        rnddir(iloop)   =   sgn(rnd   -   0.5)                     '气温变化的方向----参数1
                        rndcount(iloop)   =   rnd   *   10   +   5                     '每种变化方向的连续变化次数----参数2
                end   if
                rnddata(iloop)   =   rnddata(iloop)   +   rnd   *   rnddir(iloop)
                rndcount(iloop)   =   rndcount(iloop)   -   1
                addchanneldata   iloop,   rnddata(iloop)
        next   iloop
如何把我的参数加入到你写的程序
问题解决就结贴,分不够,可以再加
发表于:2007-03-18 23:24:055楼 得分:3
路过并接分
发表于:2007-03-19 08:18:336楼 得分:3
接分并路过
发表于:2007-03-19 08:46:027楼 得分:3
路过但不接分
发表于:2007-03-19 08:47:568楼 得分:3
路过但不接分
发表于:2007-03-19 08:51:529楼 得分:0
路过就有分,昨天是周末,人不是很多,希望今天能把问题解决
发表于:2007-03-19 08:53:3910楼 得分:0
1.   画线其实是固定在右边(或左边),   然后是滚动屏幕。
从左向右滚动(这种滚动方式比较少见,不太符合习惯):
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   (screenscrollsize   -   1,   picdraw.scaleheight   /   2   -   prevdata(ichannel)   *   (picdraw.scaleheight   /   rulescalesize   /   2))-   _
                                    (0,   picdraw.scaleheight   /   2   -   fdata   *   (picdraw.scaleheight   /   rulescalesize   /   2)),   acolor
        prevdata(ichannel)   =   fdata
end   sub

private   sub   screenscroll()
        bitblt   picdraw.hdc,   screenscrollsize,   0,   picdraw.scalewidth   -   screenscrollsize   +   1,   picdraw.scaleheight   -   1,   picdraw.hdc,   0,   0,   vbsrccopy
        picdraw.line   (0,   0)-(screenscrollsize   -   1,   picdraw.scaleheight),   picdraw.backcolor,   bf
end   sub

2.   addchanneldata   通道号,   温度值
发表于:2007-03-19 08:55:0811楼 得分:0
上面的代码有处小错误,修改一下:
private   sub   screenscroll()
        bitblt   picdraw.hdc,   screenscrollsize   -   1,   0,   picdraw.scalewidth   -   screenscrollsize   +   1,   picdraw.scaleheight   -   1,   picdraw.hdc,   0,   0,   vbsrccopy
        picdraw.line   (0,   0)-(screenscrollsize   -   1,   picdraw.scaleheight),   picdraw.backcolor,   bf
end   sub

发表于:2007-03-19 09:12:2412楼 得分:2
接分,帮楼主顶一个
发表于:2007-03-19 10:32:0613楼 得分:2
我也顶一下


发表于:2007-03-19 11:13:3414楼 得分:2
路过但不接分
发表于:2007-03-19 11:32:5915楼 得分:2
不路过   但接分
发表于:2007-03-19 12:42:3616楼 得分:0
不想路过,只想接分


快速检索

最新资讯
热门点击