以下是原程序代码:(请各位指点)
=========================================
新建一个工程,在窗体中添加按钮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
=========================================
新建一个工程,在窗体中添加按钮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
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货