用API画出线条像素的单位 与 PictureBox中的像素单位不统一怎么处理
用API画出线条像素的单位 与 PictureBox中的像素单位不统一怎么办
我想实现平移 结果发现两者的像素单位不统一,请问应该怎么解决这个问题呢???谢谢
------解决方案--------------------
Option Explicit 'api 函数声明
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 DrawStyle As Long) As Long
Option Explicit
Const Margin As Integer = 10 '字体与边界处距离
Const intLeftMargin As Integer = 30 '左连界
Const intRightMargin As Integer = 35 '右连界
Const intBottomMargin As Integer = 20 '下连界
Const intTopMargin As Integer = 30 '上连界
Const intXSpan As Integer = 5 'X轴分段数
Const intYSpan As Integer = 10 'Y轴分段数
Dim intXAddSpan As Integer '数据点到达图右边界时,应左移的时间数(秒)
Dim intXMin As Long 'X轴显示坐标的最小值,由于时间可以突破65535秒,所以将变量设为长整型
Dim intXMax As Long 'X轴显示坐标的最大值,由于时间可以突破65535秒,所以将变量设为长整型
Dim intYMin As Integer 'Y轴显示坐标的最小值
Dim intYMax As Integer 'Y轴显示坐标的最大值
Dim intDisplayWidth As Integer '定义动态曲线显示窗口的图像宽度,以pixel为单位
Dim intDisplayHeight As Integer '定义动态曲线显示窗口的图像高度,以pixel为单位
Dim intPixelsPerStepInX As Integer 'X轴两点间的像素数,pixel,以每秒几个像素为步长,这样可以保持X轴坐标的一致,不会因小数问题而出现误差
Dim sinPixelsPerStepInY As Single 'Y轴两点间的像素数,pixel,此处为单精度数,目的是为了保证计算精度
Dim N As Integer '时间计数器
Dim NWindow As Integer '窗口计数器
Dim WindowSpan As Integer '窗口显示范围
Dim intTimeStep As Integer '定义时间步长
Dim cx As Integer '当前点X坐标
Dim cy As Integer '当前点Y坐标
Dim lx As Integer '上一点X坐标
Dim ly As Integer '上一点Y坐标
Dim llx As Integer '切割点处X坐标
Dim lly As Integer '切割点处Y坐标
Private Sub CmdStart_Click()
If TmrTriger.Enabled = False Then '如果时钟未启动,打开时钟
TmrTriger.Enabled = True
End If
End Sub
Private Sub CmdStop_Click()
If TmrTriger.Enabled = True Then '如果时钟已启动,关闭时钟
TmrTriger.Enabled = False
End If
End Sub
Private Sub Form_Load()
intXMin = 0 'X轴坐标显示最小值
intXMax = 50 'X轴坐标显示最大值
intYMin = 0 'Y轴坐标显示最小值
intYMax = 20 'Y轴坐标显示最大值
N = 0 '计数器置初始值
intTimeStep = 3 '时间步长为3秒
WindowSpan = intXMax - intXMin '窗体的大小
intXAddSpan = WindowSpan / intXSpan '当时间超过窗体显示最大值时,定义需延长的显示长度
InitialGraph PicFrame, intXMin, intXMax, intYMin, intYMax '初始化数据显示窗口宽度
DrawGraph PicFrame, "二氧化碳浓度曲线", intXMin, intXMax, intXSpan, "秒", 0, 100, intYSpan, "%" '画网格
PicDisplay.Left = PicFrame.ScaleLeft + intLeftMargin '计算动态显示曲线窗口的左边界
PicDisplay.Top = PicFrame.ScaleTop + intTopMargin '计算动态显示曲线窗口的右边界
PicDisplay.Width = intDisplayWidth '计算动态显示曲线窗口的宽度
PicDisplay.Height = intDisplayHeight '计算动态显示曲线窗口的高度
BitBlt PicDisplay.hDC, 0, 0, PicDisplay.Width, PicDisplay.Height, PicFrame.hDC, PicFrame.ScaleLeft + intLeftMargin, PicFrame.ScaleTop + intTopMargin, vbSrcCopy '将图1中的显示内容拷至图2中
PicDisplay.Refresh '刷新显示
End Sub
'数据显示窗口宽度初始化
Private Sub InitialGraph(ByVal Pic As PictureBox, ByVal XMin As Long, ByVal XMax As Long, ByVal YMin As Integer, ByVal YMax As Integer)
intDisplayWidth = Pic.ScaleWidth - Pic.ScaleLeft - intLeftMargin - intRightMargin '计算动态曲线显示窗口的宽度
intDisplayHeight = Pic.ScaleHeight - Pic.ScaleTop - intTopMargin - intBottomMargin '计算动态曲线显示窗口的宽度
intPixelsPerStepInX = intDisplayWidth / (XMax - XMin) '计算每两相邻点间像素数
intDisplayWidth = intPixelsPerStepInX * (XMax - XMin) '重新计算动态曲线显示窗口的宽度
PicFrame.Width = intLeftMargin + intRightMargin + intDisplayWidth '将曲线显示窗口的宽度设为像素的整数倍
我想实现平移 结果发现两者的像素单位不统一,请问应该怎么解决这个问题呢???谢谢
------解决方案--------------------
Option Explicit 'api 函数声明
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 DrawStyle As Long) As Long
Option Explicit
Const Margin As Integer = 10 '字体与边界处距离
Const intLeftMargin As Integer = 30 '左连界
Const intRightMargin As Integer = 35 '右连界
Const intBottomMargin As Integer = 20 '下连界
Const intTopMargin As Integer = 30 '上连界
Const intXSpan As Integer = 5 'X轴分段数
Const intYSpan As Integer = 10 'Y轴分段数
Dim intXAddSpan As Integer '数据点到达图右边界时,应左移的时间数(秒)
Dim intXMin As Long 'X轴显示坐标的最小值,由于时间可以突破65535秒,所以将变量设为长整型
Dim intXMax As Long 'X轴显示坐标的最大值,由于时间可以突破65535秒,所以将变量设为长整型
Dim intYMin As Integer 'Y轴显示坐标的最小值
Dim intYMax As Integer 'Y轴显示坐标的最大值
Dim intDisplayWidth As Integer '定义动态曲线显示窗口的图像宽度,以pixel为单位
Dim intDisplayHeight As Integer '定义动态曲线显示窗口的图像高度,以pixel为单位
Dim intPixelsPerStepInX As Integer 'X轴两点间的像素数,pixel,以每秒几个像素为步长,这样可以保持X轴坐标的一致,不会因小数问题而出现误差
Dim sinPixelsPerStepInY As Single 'Y轴两点间的像素数,pixel,此处为单精度数,目的是为了保证计算精度
Dim N As Integer '时间计数器
Dim NWindow As Integer '窗口计数器
Dim WindowSpan As Integer '窗口显示范围
Dim intTimeStep As Integer '定义时间步长
Dim cx As Integer '当前点X坐标
Dim cy As Integer '当前点Y坐标
Dim lx As Integer '上一点X坐标
Dim ly As Integer '上一点Y坐标
Dim llx As Integer '切割点处X坐标
Dim lly As Integer '切割点处Y坐标
Private Sub CmdStart_Click()
If TmrTriger.Enabled = False Then '如果时钟未启动,打开时钟
TmrTriger.Enabled = True
End If
End Sub
Private Sub CmdStop_Click()
If TmrTriger.Enabled = True Then '如果时钟已启动,关闭时钟
TmrTriger.Enabled = False
End If
End Sub
Private Sub Form_Load()
intXMin = 0 'X轴坐标显示最小值
intXMax = 50 'X轴坐标显示最大值
intYMin = 0 'Y轴坐标显示最小值
intYMax = 20 'Y轴坐标显示最大值
N = 0 '计数器置初始值
intTimeStep = 3 '时间步长为3秒
WindowSpan = intXMax - intXMin '窗体的大小
intXAddSpan = WindowSpan / intXSpan '当时间超过窗体显示最大值时,定义需延长的显示长度
InitialGraph PicFrame, intXMin, intXMax, intYMin, intYMax '初始化数据显示窗口宽度
DrawGraph PicFrame, "二氧化碳浓度曲线", intXMin, intXMax, intXSpan, "秒", 0, 100, intYSpan, "%" '画网格
PicDisplay.Left = PicFrame.ScaleLeft + intLeftMargin '计算动态显示曲线窗口的左边界
PicDisplay.Top = PicFrame.ScaleTop + intTopMargin '计算动态显示曲线窗口的右边界
PicDisplay.Width = intDisplayWidth '计算动态显示曲线窗口的宽度
PicDisplay.Height = intDisplayHeight '计算动态显示曲线窗口的高度
BitBlt PicDisplay.hDC, 0, 0, PicDisplay.Width, PicDisplay.Height, PicFrame.hDC, PicFrame.ScaleLeft + intLeftMargin, PicFrame.ScaleTop + intTopMargin, vbSrcCopy '将图1中的显示内容拷至图2中
PicDisplay.Refresh '刷新显示
End Sub
'数据显示窗口宽度初始化
Private Sub InitialGraph(ByVal Pic As PictureBox, ByVal XMin As Long, ByVal XMax As Long, ByVal YMin As Integer, ByVal YMax As Integer)
intDisplayWidth = Pic.ScaleWidth - Pic.ScaleLeft - intLeftMargin - intRightMargin '计算动态曲线显示窗口的宽度
intDisplayHeight = Pic.ScaleHeight - Pic.ScaleTop - intTopMargin - intBottomMargin '计算动态曲线显示窗口的宽度
intPixelsPerStepInX = intDisplayWidth / (XMax - XMin) '计算每两相邻点间像素数
intDisplayWidth = intPixelsPerStepInX * (XMax - XMin) '重新计算动态曲线显示窗口的宽度
PicFrame.Width = intLeftMargin + intRightMargin + intDisplayWidth '将曲线显示窗口的宽度设为像素的整数倍