程序是先画一底坐标,之后根据数据用不同的颜色作曲线图 画线出来的颜色是正确的, 但用SetTextColor 设置字体颜色时,在画底框时没有问题,但同时作曲线[写字,就只能是DC的底色了 一旦用了白色为图片的底色,则显示不出字体 程序的大概如下:请各位大大指点Private Sub Command4_Click() '打印
…………………
If UBound(Arr_Data_Draw, 2) > 0 Then ’取出并查到有画图的数据
DeleteDC hDCmem_XY ’删除原来的图片
A = 画底框(vbWhite) '画一个底色为白色的图片底框
Call 重绘(Arr_Data_Draw) ’根据数据重新作图
………………..
End If
End Sub
Function 画底框(MyBackColor) 'X刻度的大小
…………….
'创建一个RGB颜色与窗体背景色一致的刷子
hBrush = CreateSolidBrush(MyBackColor)
FillRect hDCmem_XY, oRect, hBrush '以控件背景色填充位图
…………………………….
'在内存中画四条线的做法!
………………………………………………….
SetTextColor hDCmem_XY, vbBlack '设置DC上写入字体的颜色
TextOut hDCmem_XY, TimetoX(0) - 60, ValToY(MAXT / 2, MAXT) - 25, "温", 2
TextOut hDCmem_XY, TimetoX(0) - 60, ValToY(MAXT / 2, MAXT) - 10, "度", 2
TextOut hDCmem_XY, TimetoX(0) - 60, ValToY(MAXT / 2, MAXT) + 15, "℃", 2‘这里的SetTextColor到最后还是能显示出指定的颜色
并产生了一个hDCmem_XY 底框的DC公共变量
……………………..
End FunctionSub 重绘(Arr)
…………………………………..
hdc = GetDC(0)
hDCmem = CreateCompatibleDC(hdc)
hBmp = CreateCompatibleBitmap(hdc, lWidth, lHeight)
hBmpPrev = SelectObject(hDCmem, hBmp)
……………………… For i = 1 To UBound(Arr, 2) Step 3 '重画所有的点
……….
hPen = CreatePen(PS_SOLID, 2, ARR_COLOR(M_name - 1))
DeleteObject SelectObject(hDCmem, hPen) 'MoveToEx hDCmem, TimetoX(Tim_Old), ValToY(Data_Value(M_name, 1), MAXT), pt
'LineTo hDCmem, TimetoX(Tim_now), ValToY(Data_Value(M_name, 2), MAXT)
MoveToEx hDCmem, TimetoX(Time_Value(M_name, 1)), ValToY(Data_Value(M_name, 1), MAXT), pt
LineTo hDCmem, TimetoX(Time_Value(M_name, 2)), ValToY(Data_Value(M_name, 2), MAXT)
DeleteObject hPen
‘只是不同的线用不同的颜色来,画曲线
……………………………………………..
'为什么改变不了字体颜色?
SetTextColor hDCmem_XY, vbRed
TextOut hDCmem, TimetoX(0) + 30, ValToY(MAXT, MAXT), "HEATING", 7
SetTextColor hDCmem_XY, vbMagenta
TextOut hDCmem, TimetoX(Tim_Old) + 30, ValToY(MAXT, MAXT), "HOLDING", 7
‘这里的本意就是在DC里不同的地方写些不同阶段颜色的字体.
‘但最后显示出来的字是白底,字色是DC的底框色
‘一旦底框用了白色,这些字就不能显示出来了!
……………………
DeleteDC hDCmem
End Sub
…………………
If UBound(Arr_Data_Draw, 2) > 0 Then ’取出并查到有画图的数据
DeleteDC hDCmem_XY ’删除原来的图片
A = 画底框(vbWhite) '画一个底色为白色的图片底框
Call 重绘(Arr_Data_Draw) ’根据数据重新作图
………………..
End If
End Sub
Function 画底框(MyBackColor) 'X刻度的大小
…………….
'创建一个RGB颜色与窗体背景色一致的刷子
hBrush = CreateSolidBrush(MyBackColor)
FillRect hDCmem_XY, oRect, hBrush '以控件背景色填充位图
…………………………….
'在内存中画四条线的做法!
………………………………………………….
SetTextColor hDCmem_XY, vbBlack '设置DC上写入字体的颜色
TextOut hDCmem_XY, TimetoX(0) - 60, ValToY(MAXT / 2, MAXT) - 25, "温", 2
TextOut hDCmem_XY, TimetoX(0) - 60, ValToY(MAXT / 2, MAXT) - 10, "度", 2
TextOut hDCmem_XY, TimetoX(0) - 60, ValToY(MAXT / 2, MAXT) + 15, "℃", 2‘这里的SetTextColor到最后还是能显示出指定的颜色
并产生了一个hDCmem_XY 底框的DC公共变量
……………………..
End FunctionSub 重绘(Arr)
…………………………………..
hdc = GetDC(0)
hDCmem = CreateCompatibleDC(hdc)
hBmp = CreateCompatibleBitmap(hdc, lWidth, lHeight)
hBmpPrev = SelectObject(hDCmem, hBmp)
……………………… For i = 1 To UBound(Arr, 2) Step 3 '重画所有的点
……….
hPen = CreatePen(PS_SOLID, 2, ARR_COLOR(M_name - 1))
DeleteObject SelectObject(hDCmem, hPen) 'MoveToEx hDCmem, TimetoX(Tim_Old), ValToY(Data_Value(M_name, 1), MAXT), pt
'LineTo hDCmem, TimetoX(Tim_now), ValToY(Data_Value(M_name, 2), MAXT)
MoveToEx hDCmem, TimetoX(Time_Value(M_name, 1)), ValToY(Data_Value(M_name, 1), MAXT), pt
LineTo hDCmem, TimetoX(Time_Value(M_name, 2)), ValToY(Data_Value(M_name, 2), MAXT)
DeleteObject hPen
‘只是不同的线用不同的颜色来,画曲线
……………………………………………..
'为什么改变不了字体颜色?
SetTextColor hDCmem_XY, vbRed
TextOut hDCmem, TimetoX(0) + 30, ValToY(MAXT, MAXT), "HEATING", 7
SetTextColor hDCmem_XY, vbMagenta
TextOut hDCmem, TimetoX(Tim_Old) + 30, ValToY(MAXT, MAXT), "HOLDING", 7
‘这里的本意就是在DC里不同的地方写些不同阶段颜色的字体.
‘但最后显示出来的字是白底,字色是DC的底框色
‘一旦底框用了白色,这些字就不能显示出来了!
……………………
DeleteDC hDCmem
End Sub
解决方案 »
- VB窗体标题栏添加控件
- 急。。那位大哥可以告诉我vb查看数据库的时候提示溢出问题
- rs.update与sql 中的update有什么不同?
- 大家来讨论下这 SQL 语言要怎么写? 好象有点难度
- 《程序员》杂志
- 總是在大文件傳輸的99%多的時候,出現錯誤?
- 控件失去焦点后引出的问题,应该怎样解决。。。急
- datalist怎么用???Set DataList1.DataSource = rs怎么没有用啊???
- 我有一个LISTVIEW,我想把它的高度定为窗体高度-100,请问应该怎样写?
- 分可加到500,只要大家来解决问题,谢谢了,赚分啦
- 请问,在VB中如何通过Shockwave Flash控件播放Flash MX中生成的exe文件(播放Flash中生成的swf文件正常)?
- VB调用C#编写的WebService时,界面会卡住,有什么办法解决吗?
Public Function PictureFromDC(hDCsrc As Long, OldhDC As Long, F As Boolean) As StdPicture
'两张图片相加,并将第二张透明处理
'如是false则只是原图复制 Dim hdc As Long
Dim hDCmem As Long
Dim hBmp As Long, hBmpPrev As Long hdc = GetDC(0)
hDCmem = CreateCompatibleDC(hdc)
hBmp = CreateCompatibleBitmap(hdc, lWidth, lHeight)
hBmpPrev = SelectObject(hDCmem, hBmp)
ReleaseDC 0, hdc
'先将旧图拷贝出来
BitBlt hDCmem, 0, 0, lWidth, lHeight, OldhDC, 0, 0, vbSrcCopy
If F Then
'另一张图的黑色底(默认的背景色)变为透明(去除),只余下其它色,与原图粘结
TransparentBlt hDCmem, 0, 0, lWidth, lHeight, _
hDCsrc, 0, 0, lWidth, lHeight, vbBlack
End If
hBmp = SelectObject(hDCmem, hBmpPrev)
DeleteDC hDCmem
DeleteObject hBmpPrev '删除位图不能删除
Dim pic As PicBmp
Dim IPic As StdPicture
Dim IID_IDispatch As GUID
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With pic
.Size = Len(pic)
.Type = 1
.hBmp = hBmp
.hPal = 0
End With OleCreatePictureIndirect pic, IID_IDispatch, True, IPic '这个ture 会自动销毁吗?
Set PictureFromDC = IPic
'现在的问题是这个是否也要
Set IPic = Nothing
End Function
Private Const TRANSPARENT = 1
Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
语句:
SetBkMode(hDCmem_XY,TRANSPARENT)
TextOut hDCmem, TimetoX(Tim_Old) + 30, ValToY(MAXT, MAXT), "HOLDING", 7将hDCmem_XY换成 hDCmem就好了