vb中如何实现实时曲线,历史曲线及打印!?

changwei 2002-08-26 01:37:42
前辈们,我有一个很着急的问题(急的我胡子都张出来了!),就是我实时的读取串口的数据,并保存在ACCESS数据库中,可是我现在想将实时数据作成实时曲线,将历史数据作成历史曲线,并希望都可以打印,可是我现在实在没有办法了,估计前辈们也有过这种痛苦的经历,恳请指导一下后进小生,求求你们了!:(
...全文
1165 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
changwei 2002-08-29
  • 打赏
  • 举报
回复
rd@polymer.com.cn 万分感谢!
printer 2002-08-29
  • 打赏
  • 举报
回复
留个Mail,我把代码给你发过去。
printer 2002-08-29
  • 打赏
  • 举报
回复
??
RECT = Retangle = 矩形
modGDI模块里面已经声明了啊

Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
changwei 2002-08-29
  • 打赏
  • 举报
回复
我想问打印机 RECT 实什么类型呀,为什么编译时总提示说 用户未定义类型!?
printer 2002-08-28
  • 打赏
  • 举报
回复
我想历史曲线的画法你可以模仿着写出来了吧,

在DrawCurve方法里面调用新增加的一个私有方法
SaveData(Now,nY)

在类clsCurve里面在增加接口
Private Sub DrawHistory(StartTime as Date,nTotalUnits as long)
获得数据之后画在Printer.hDC里面(和画在 m_hMemDC 的方法完全一样)
然后就可以打印了.
printer 2002-08-28
  • 打赏
  • 举报
回复
花了我一个多小时的时间写代码和调试,这点分不值得啊.
printer 2002-08-28
  • 打赏
  • 举报
回复
GDI实时曲线绘制演示
=========================================
新建一个工程,在窗体中添加按钮cmdDemo,图片框picOut,时钟控件Timer


'下面的是frmMain窗体
'===========================================================
Option Explicit
Dim CurveDrawer As clsCurve

Private Sub cmdDemo_Click()
Dim nY As Long
CurveDrawer.SetView picOut.hdc, picOut.Width - 10, picOut.Height - 10, 50, 50
Timer.Enabled = True
End Sub

Private Sub Form_Load()
ScaleMode = 3
Timer.Interval = 500
Timer.Enabled=False
Set CurveDrawer = New clsCurve
End Sub

Private Sub picOut_Paint()
CurveDrawer.RedrawCurve
End Sub

Private Sub Timer_Timer()
CurveDrawer.DrawCurve CLng(Rnd * 51)
End Sub



'下面的是modGDI模块
'===========================================================
Option Explicit
Public Type POINTAPI
x As Long
y As Long
End Type

Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Public Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Public Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Public 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
Public Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long





'下面的是clsCurve类模块
'===========================================================
Option Explicit

Private m_hMemDC As Long
Private m_hBakDC As Long
Private m_hOutDC As Long
Private m_hOldMemBmp As Long
Private m_hOldBakBmp As Long
Private m_hOldMemPen As Long
Private m_hBrush As Long

Private m_nXUnitLen As Long
Private m_nYUnitLen As Long
Private m_nPrevY As Long
Private R As RECT

Public Sub SetView(ByVal hOutDC As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal nXUnits As Long, _
ByVal nYUnits As Long)

Dim hObject As Long
m_hOutDC = hOutDC
R.Left = 0: R.Top = 0
R.Bottom = nHeight
R.Right = nWidth
m_nXUnitLen = nWidth \ nXUnits
m_nYUnitLen = nHeight \ nYUnits

m_hMemDC = CreateCompatibleDC(hOutDC)
m_hBakDC = CreateCompatibleDC(hOutDC)


hObject = CreateCompatibleBitmap(hOutDC, nWidth, nHeight)
m_hOldMemBmp = SelectObject(m_hMemDC, hObject)

hObject = CreateCompatibleBitmap(hOutDC, nWidth, nHeight)
m_hOldBakBmp = SelectObject(m_hBakDC, hObject)

hObject = CreatePen(0, 1, vbBlack)
m_hOldMemPen = SelectObject(m_hMemDC, hObject)

m_hBrush = CreateSolidBrush(vbWhite)
FillRect m_hMemDC, R, m_hBrush
BitBlt m_hOutDC, 0, 0, nWidth, nHeight, m_hMemDC, 0, 0, vbSrcCopy

End Sub


Public Sub DrawCurve(ByVal nY As Long)

'保留原来的曲线
Dim nWidth As Long, nHeight As Long
nWidth = R.Right
nHeight = R.Bottom

BitBlt m_hBakDC, 0, 0, nWidth, nHeight, m_hMemDC, 0, 0, vbSrcCopy
FillRect m_hMemDC, R, m_hBrush
'向左退移1个单位
BitBlt m_hMemDC, 0, 0, nWidth, nHeight, m_hBakDC, m_nXUnitLen, 0, vbSrcCopy

'画新的曲线
Dim PrevPoint As POINTAPI
nY = nHeight - CLng(nY * m_nYUnitLen)
MoveToEx m_hMemDC, nWidth - m_nXUnitLen, m_nPrevY, PrevPoint

LineTo m_hMemDC, nWidth - 1, nY

m_nPrevY = nY

'输出结果

BitBlt m_hOutDC, 0, 0, nWidth, nHeight, m_hMemDC, 0, 0, vbSrcCopy

End Sub




Public Sub RedrawCurve()
If m_hMemDC = 0 Then Exit Sub
BitBlt m_hOutDC, 0, 0, R.Right, R.Bottom, m_hMemDC, 0, 0, vbSrcCopy
End Sub

Public Property Get hdc() As Long
hdc = m_hMemDC
End Property


Private Sub Class_Terminate()
Dim hMemUsedBmp As Long, hBakUsedBmp As Long
Dim hMemUsedPen As Long

hMemUsedBmp = SelectObject(m_hMemDC, m_hOldMemBmp)
hBakUsedBmp = SelectObject(m_hBakDC, m_hOldBakBmp)
hMemUsedPen = SelectObject(m_hMemDC, m_hOldMemPen)

DeleteDC m_hMemDC
DeleteDC m_hBakDC

DeleteObject hMemUsedBmp
DeleteObject hBakUsedBmp
DeleteObject hMemUsedPen
DeleteObject m_hBrush
End Sub


changwei 2002-08-28
  • 打赏
  • 举报
回复
老虎前辈我用
Picture1.AutoRedraw = True
Picture1.Picture = Picture1.Image
Printer.PaintPicture Me.Picture1.Picture, 100, 100, Me.Picture1.Width * 1, Me.Picture1.Height * 1
Printer.EndDoc
Picture1.Picture = LoadPicture()
可以打印,可是我怎样才能设置纸的打印方向呢?我想横打
我用
Declare Function PageSetupDlg Lib "comdlg32.dll" Alias "PageSetupDlgA" (pPagesetupdlg As PageSetupDlg) As Long
设置为横向可是打出来还是纵向,怎么办? changwei
changwei 2002-08-28
  • 打赏
  • 举报
回复
感谢老虎前辈,问题基本解决,但是后进对打印机前辈的说明有点不理解:(
maxiuhui 2002-08-27
  • 打赏
  • 举报
回复
这个工作做了5年了
实时的用graphs.ocx控件又闪烁,尽量用PICTUREBOX控件
printer 2002-08-27
  • 打赏
  • 举报
回复
仅仅使用一个Picture多慢,而且写的一堆代码麻烦不要紧,关键是凌乱,PictureBox应该仅仅是用来显示的一个外部视图,核心应该采用内存设备场景,操作飞快.
需要打印实时曲线的时候,用Bitblt做个快照,复制到打印DC里面.
历史曲线的话,那就需要保存数据了,建议采用缓冲区的办法,等到数据量达到某一个阀值时才一次保存,需要打印时调入数据,在内存场景里面作图,然后Bitblt到Printer.hDC里面,不就搞定了吗.
网络咖啡 2002-08-27
  • 打赏
  • 举报
回复
使用picturebox自己画啊

打印偶用printer对象
changwei 2002-08-27
  • 打赏
  • 举报
回复
再次感谢DELF,小白你可以试试DELF说的
把graph32.ocx,gsw32.exe,gswdll32.dll拷贝到你的system目录下,再运行
regsrv32 graph32.
huxiangming 2002-08-27
  • 打赏
  • 举报
回复
忘了说明 picture1.autoRedraw=True
打印完后不要忘记使用
Picture1.Picture = LoadPicture()
不然会有2根曲线的。

huxiangming 2002-08-27
  • 打赏
  • 举报
回复
这样就可以打印了
picture1.picture=picture1.image
Printer.PaintPicture Me.Picture1.Picture, 500, 600, Me.Picture1.Width * 12, Me.Picture1.Height * 12
Printer.EndDoc
changwei 2002-08-27
  • 打赏
  • 举报
回复
我现在也着急呢,graph32.ocx好象只能打印单条曲线,不过它做统计特别好用。我现在用picturebox一点点的画呀,惨呀,又有新问题了,我无法打印picturebox,只好全打印form了,怎么办呀,delf救救我!
sunshine781114 2002-08-27
  • 打赏
  • 举报
回复
第一:
我在我机器上找不到那几个文件啊graph32.ocx,gsw32.exe,gswdll32.dll;
第二:
我用picture控件,用printer打印,打印不出来啊;

第三:帮我看看上边的那条语句好吗?谢谢了。怎么出错啊!!!
sunshine781114 2002-08-26
  • 打赏
  • 举报
回复
With MSFlexGrid1
.Col = 0
.Row = 1
DataReport1.Sections(6).Controls("label6").Caption = .Text
End With

我执行这条语句,出错“run-time error '9'
subscript out of range ”

怎样解决啊?
sunshine781114 2002-08-26
  • 打赏
  • 举报
回复
你们所说的打印看来不是用datareport来打印是不?你们是直接用.print方法?
delf 2002-08-26
  • 打赏
  • 举报
回复
其实用picturebox什么的,写个控件是最好的,graph32太大了,不过changwei你是做工控的吧,做程序主要是维护了,控件比较容易维护
加载更多回复(17)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧