我想在picture里快速显示如下的文字(带颜色)
DDD: 123 HHH: 568 ZZZ: 568 SSS: 999 
求教该如何做,谢谢!!!

解决方案 »

  1.   

    UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
      

  2.   

        Picture1.ForeColor = vbRed
        Picture1.Print "DDDD"
        Picture1.ForeColor = vbBlack
        Picture1.Print "FFFFD"
      

  3.   

    Picture1.ForeColor 颜色可以用RGB
    Picture1.ForeColor = RGB(255, 0, 0)
    三个数不小于0,不大于255,自己配吧。颜色可以是qbcolor
    Picture1.ForeColor = qbcolor(4)
    值 颜色 值 颜色 
    0 黑色 8 灰色 
    1 兰色 9 亮兰色 
    2 绿色 10 亮绿色 
    3 青色 11 亮青色 
    4 红色 12 亮红色 
    5 洋红色 13 亮洋红色 
    6 黄色 14 亮黄色 
    7 白色 15 亮白色 颜色可以是vb颜色常数
    Picture1.ForeColor = vbred
    常数  值  描述 
    vbBlack &H0 黑色 
    vbRed &HFF 红色 
    vbGreen &HFF00 绿色 
    vbYellow &HFFFF 黄色 
    vbBlue &HFF0000 兰色 
    vbMagenta &HFF00FF 洋红 
    vbCyan &HFFFF00 青色 
    vbWhite &HFFFFFF 白色 
    ...
      

  4.   

    谢谢!!!我不是这意思。
    我的意思是不用picture1.print方法,用其他方法快速绘制行彩色文字,谢谢!!!
      

  5.   

    使用API,主要用两个,一是SetTextColor,一是TextOut。
    需要注意的是,VB本身的ForeColor属性不光指定TextColor,还会创建一个新的Pen选入DC,从而降低了效率。
      

  6.   

    封装一下吧,又好用,又好移植,人见人爱^-^Private Sub Command1_Click()
        PicPrintColorText Picture1, vbRed, "DDD: 123"
        PicPrintColorText Picture1, vbBlue, "HHH: 568"
        PicPrintColorText Picture1, vbGreen, " ZZZ: 568"
        PicPrintColorText Picture1, vbMagenta, "SSS: 999"
    End Sub
    '---------------------------------------------------------------------------------------
    ' 过程名    : PicPrintColorText
    ' 时间      : 2010-3-29 11:11
    ' 作者      : 杨过.网狐.cn(csdn bcrun)
    ' 功能      :
    ' 说明      :
    ' 备注      : http://topic.csdn.net/u/20100328/20/67424952-4eb8-4778-9c20-01849528eded.html
    'picture请教,谢谢!!!
    '---------------------------------------------------------------------------------------
    '
    Public Sub PicPrintColorText(picDraw As PictureBox, ByVal NewColor As Long, _
        ByVal Text As String, Optional ByVal NeedLineBreak As Boolean = False)
        picDraw.ForeColor = NewColor
        If NeedLineBreak Then
            picDraw.Print Text
        Else
            picDraw.Print Text;
        End If
    End Sub
      

  7.   

    谢谢各位的帮助,谢谢!!!
    在股票软件K线图中(如大智慧),移动鼠标,无论是几个图,他的每日数据都能随鼠标移动变化,且各个指标颜色不同,它的绘制很快,还请拿各位帮助,谢谢!!!下面的代码加了DoEvents,则文字延时闪烁,不加DoEvents,则每日数据不随鼠标变化而变化,只显示鼠标停下来的数据Private Sub Picdrawk_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim i%, II%
    Dim TEMPGJ(21) As String
    Dim TEMPGJN As LongSelect Case PDDJMOVE
           Case 0
                For i = 1 To UBound(DrawLin) - 2
                    If DrawLin(i) > y - 2 And DrawLin(i) < y + 2 Then
                       Line1(i).Visible = True
                       Picdrawk.MousePointer = 7
                       iWhichSplit = i
                       Exit For
                    Else
                       Line1(i).Visible = False
                       Picdrawk.MousePointer = 99
                       iWhichSplit = 0
                    End If
                 Next
            Case 1
                 Picdrawk.MousePointer = 7
                 If splitline = 1 Then
                    If y < Picdrawk.ScaleHeight * 0.3 Then
                       Line1(splitline).y1 = Picdrawk.ScaleHeight * 0.3
                       Line1(splitline).y2 = Picdrawk.ScaleHeight * 0.3
                       DrawLin(splitline) = Picdrawk.ScaleHeight * 0.3
                    Else
                       Line1(splitline).y1 = y
                       Line1(splitline).y2 = y
                       DrawLin(splitline) = y
                    End If
                 Else
                    If y > DrawLin(splitline + 1) * 0.9 Then
                       Line1(splitline).y1 = DrawLin(splitline + 1) * 0.9
                       Line1(splitline).y2 = DrawLin(splitline + 1) * 0.9
                       DrawLin(splitline) = DrawLin(splitline + 1) * 0.9
                    Else
                       Line1(splitline).y1 = y
                       Line1(splitline).y2 = y
                       DrawLin(splitline) = y
                    End If
                 End If
                 Line1(splitline).Visible = True
                 
            Case 2
                    Ps.Visible = True
                    x = CInt((x - DrawLin(UBound(DrawLin) - 1)) / ((DrawLin(UBound(DrawLin)) - DrawLin(UBound(DrawLin) - 1)) / EveryScreenDay))
                    Line5.x1 = ((DrawLin(UBound(DrawLin)) - DrawLin(UBound(DrawLin) - 1))) / EveryScreenDay * x + DrawLin(UBound(DrawLin) - 1)
                    Line5.x2 = ((DrawLin(UBound(DrawLin)) - DrawLin(UBound(DrawLin) - 1))) / EveryScreenDay * x + DrawLin(UBound(DrawLin) - 1)
                    If x >= 1 And x < UBound(hq) Then
                    Line5.Visible = True
                    TEMPGJ(0) = ""
                    TEMPGJ(1) = "ÈÕ ÆÚ"
                    TEMPGJ(2) = hq(x).RQ
                    TEMPGJ(3) = "¿ªÅ̼Û"
                    TEMPGJ(4) = hq(x).KPJ
                    TEMPGJ(5) = "×î¸ß¼Û"
                    TEMPGJ(6) = hq(x).ZGJ
                    TEMPGJ(7) = "×îµÍ¼Û"
                    TEMPGJ(8) = hq(x).ZDJ
                    TEMPGJ(9) = "ÊÕÅ̼Û"
                    TEMPGJ(10) = hq(x).SPJ
                    TEMPGJ(11) = "³É½»Á¿"
                    TEMPGJ(12) = hq(x).CJL
                    TEMPGJ(13) = "³É½»¶î"
                    TEMPGJ(14) = hq(x).CJE
                    TEMPGJ(15) = "ÕÇ·ù"
                    TEMPGJ(16) = hq(x).ZF
                    TEMPGJ(17) = "Õñ·ù"
                    TEMPGJ(18) = ""
                    TEMPGJ(19) = "»»ÊÖÂÊ"
                    TEMPGJ(20) = ""
                    TEMPGJ(21) = ""
                    If x > 1 Then
                       TEMPGJN = hq(x - 1).SPJ
                    End If
                    If x = 1 Then
                       TEMPGJN = 0
                    End If
                    Call DrawxxtTEMP(Ps, TEMPGJ, TEMPGJN)
                    Erase TEMPGJ
                    TEMPGJN = 0
                    For i = 0 To UBound(DRAWLINZT)
                       ZBTSX = DrawLin(i) + Picdrawk.TextHeight("a") * 1.2
                       ZBTXX = DrawLin(i) '- Picdrawk.TextHeight("a") * 0.4
                       If i > 0 Then
                          Picdrawk.Line (0, ZBTXX)-(DrawLin(UBound(DrawLin)) * 0.999, ZBTSX), &H0&, BF
                          Picdrawk.DrawWidth = 1
                          Picdrawk.DrawStyle = 2
                          Picdrawk.Line (DrawLin(UBound(DrawLin) - 1), ZBTSX)-(DrawLin(UBound(DrawLin)), ZBTSX), &H404080  ' &H40C0&
                       Else
                          Picdrawk.Line (DrawLin(UBound(DrawLin) - 1) * 1.011, 0)-(DrawLin(UBound(DrawLin)) * 0.999, DrawLin(0)), &H0&, BF
                          Picdrawk.DrawWidth = 1
                          Picdrawk.DrawStyle = 2
                          Picdrawk.Line (DrawLin(UBound(DrawLin) - 1), DrawLin(0))-(DrawLin(UBound(DrawLin)), DrawLin(0)), &H404080  ' &H40C0&
                       End If
                       Picdrawk.DrawWidth = 1
                       Picdrawk.DrawStyle = 0
                       Picdrawk.Line (0, ZBTXX)-(DrawLin(UBound(DrawLin)), ZBTXX), &HC0&
                       Picdrawk.Line (DrawLin(UBound(DrawLin) - 1), ZBTXX)-(DrawLin(UBound(DrawLin) - 1), ZBTSX), &HC0&
                       Call Drawhtsdtextgd(Picdrawk, i, CInt(x))
                    Next
                    DoEvents
                 Else
                    Ps.Visible = False
                    Line5.Visible = False
                 End If
    End SelectEnd Sub
    Sub Drawhtsdtextgd(Picstep As PictureBox, xdwz As Integer, maxsizem As Integer)
    Dim i%
    Dim PRINTTEMP As String
    Dim NEWPRINTTEMP As String
    Dim yssd As Integer
    ReDim Preserve Cxhztxt(xdwz)If xdwz = 0 Then
        PRINTTEMP = DRAWLINZT(xdwz).ZBMC
        Picstep.CurrentX = DrawLin(UBound(DrawLin) - 1) * 1.005
        Picstep.CurrentY = (DrawLin(xdwz) - Picdrawk.TextHeight("a") * 1.2) / 2
        Picstep.ForeColor = &HDADADA
        Picstep.Print PRINTTEMP
     Else
        Picstep.CurrentX = DrawLin(UBound(DrawLin) - 1) * 1.005
        PRINTTEMP = DRAWLINZT(xdwz).ZBMC
        Picstep.CurrentY = DrawLin(xdwz)
        Picstep.ForeColor = &HDADADA
        Picstep.Print PRINTTEMP
    End If
    yssd = 0
    For i = 0 To UBound(DRAWLINZT(xdwz).arArr)
       ReDim Preserve Cxhztxt(xdwz).ixwithn(i)
       If DRAWLINZT(xdwz).arArr(i).HXPD = False Then
        
        NEWPRINTTEMP = NEWPRINTTEMP & " " & DRAWLINZT(xdwz).arArr(i).VarName & "£º" & Format(DRAWLINZT(xdwz).arArr(i).VarArr(maxsizem), "0.00")
        Picstep.CurrentX = DrawLin(UBound(DrawLin) - 1) * 1.005 + Picstep.TextWidth(PRINTTEMP) + Picstep.TextWidth(NEWPRINTTEMP) - Picstep.TextWidth(DRAWLINZT(xdwz).arArr(i).VarName & "£º" & Format(DRAWLINZT(xdwz).arArr(i).VarArr(maxsizem), "0.00"))
        If xdwz = 0 Then
            Picstep.CurrentY = (DrawLin(xdwz) - Picdrawk.TextHeight("a") * 1.2) / 2
        Else
            Picstep.CurrentY = DrawLin(xdwz)
        End If
         If yssd = 0 Then
           Picstep.ForeColor = vbWhite
        End If
        If yssd = 1 Then
           Picstep.ForeColor = vbYellow
        End If
        If yssd = 2 Then
           Picstep.ForeColor = &HFF00FF
        End If
        If yssd = 3 Then
           Picstep.ForeColor = vbGreen
        End If
        If yssd = 4 Then
           Picstep.ForeColor = vbWhite
        End If
        If yssd = 5 Then
           Picstep.ForeColor = vbWhite
        End If
        If yssd = 6 Then
           Picstep.ForeColor = vbWhite
        End If
        Cxhztxt(xdwz).ixwithn(i).icolock = Picstep.ForeColor
        Cxhztxt(xdwz).ixwithn(i).iyhight = Picstep.CurrentY
        Cxhztxt(xdwz).ixwithn(i).ixwith = DrawLin(UBound(DrawLin) - 1) * 1.005 + Picstep.TextWidth(PRINTTEMP) + Picstep.TextWidth(NEWPRINTTEMP) - Picstep.TextWidth(DRAWLINZT(xdwz).arArr(i).VarName & "£º" & Format(DRAWLINZT(xdwz).arArr(i).VarArr(maxsizem), "0.00"))
        Picstep.Print DRAWLINZT(xdwz).arArr(i).VarName & "£º" & Format(DRAWLINZT(xdwz).arArr(i).VarArr(maxsizem), "0.00")
        yssd = yssd + 1
        End If
    NextNEWPRINTTEMP = ""
    PRINTTEMP = ""
    End Sub
      

  8.   


    Public Function DrawxxtTEMP(picutor As PictureBox, HGF() As String, ZRGJ As Long)
       picutor.Cls
       picutor.Line (picutor.ScaleLeft, picutor.ScaleTop)-(picutor.ScaleWidth * 0.99, picutor.ScaleHeight * 0.99), vbRed, B
       
       picutor.CurrentY = picutor.TextHeight("A") / 6
       Dim i As Integer   For i = 0 To UBound(HGF)
              Select Case i
              Case 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21
                   picutor.FontSize = 11
                   picutor.ForeColor = vbWhite
                   picutor.CurrentX = (picutor.ScaleWidth - picutor.TextWidth(HGF(i))) / 2
              Case 2
                   picutor.FontSize = 9
                   picutor.FontBold = False
                   picutor.ForeColor = &HFFFF00
                   picutor.CurrentX = (picutor.ScaleWidth - picutor.TextWidth(HGF(i))) / 2
              Case 4, 6, 8, 10
                  picutor.FontSize = 9
                  If Val(HGF(i)) > ZRGJ Then
                  picutor.ForeColor = vbRed
                  End If
                  If Val(HGF(i)) = ZRGJ Then
                  picutor.ForeColor = vbWhite
                  End If
                  If Val(HGF(i)) < ZRGJ Then
                  picutor.ForeColor = &HFFFF00
                  End If
                  HGF(i) = Format(HGF(i) / 1000, "0.00")
                  picutor.CurrentX = (picutor.ScaleWidth - picutor.TextWidth(HGF(i)))
              Case 12
                  picutor.FontSize = 9
                  If Val(HGF(i)) > 1000000 Then
                  HGF(i) = Format(HGF(i) / 10000, "0") & "Íò"
                  End If
                  picutor.ForeColor = vbRed
                  picutor.CurrentX = (picutor.ScaleWidth - picutor.TextWidth(HGF(i)))
              Case 14
                  picutor.FontSize = 9
                  If Val(HGF(i)) > 1000000 Then
                  HGF(i) = Format(HGF(i) / 100000, "0.00") & "ÒÚ"
                  End If
                  picutor.ForeColor = vbRed
                  picutor.CurrentX = (picutor.ScaleWidth - picutor.TextWidth(HGF(i)))
              Case 16
                  picutor.FontSize = 9
                  If Val(HGF(i)) > 0 Then
                  picutor.ForeColor = vbRed
                  End If
                  If Val(HGF(i)) = 0 Then
                  picutor.ForeColor = vbWhite
                  End If
                  If Val(HGF(i)) < 0 Then
                  picutor.ForeColor = &HFFFF00
                  End If
                  HGF(i) = Format(Abs(HGF(i) * 100), "0.00")
                  picutor.CurrentX = (picutor.ScaleWidth - picutor.TextWidth(HGF(i)))
            '  Case Else
             ' picutor.ForeColor = vbRed
              
              End Select
           
           picutor.Print HGF(i)
           
       Next
    End Function
      

  9.   

    bcrun:我就是因为画得嫌慢,才求教画图快的方法,我想大家可能误会我的意思了,我就把我要做的东西发上来,还请各位帮助,谢谢!!!
      

  10.   

    不需要 DoEvents,一次性大量绘图的套路如下:
    Option ExplicitPrivate Sub Command1_Click()
        Picture1.Visible = False
        Picture1.Cls
        大量绘图
        Picture1.Visible = True
    End SubPrivate Sub Form_Load()
        Picture1.AutoRedraw = True
    End Sub
      

  11.   

    那楼主看下楼上的代码啊,他这个把多次paint到屏幕合做一次,应该会快上不少
      

  12.   

    Picture1.ForeColor = vbRed
    Picture1.Print "DDDD"
    Picture1.ForeColor = vbBlack
    Picture1.Print "FFFFD"
      

  13.   

    谢谢各位的帮助,谢谢!!!
    再求教一下:
    画矩形:我只会用picture1.line (0,0)-(100,100),,bf
    用API画矩形如何画,谢谢!!!
      

  14.   

    Rectangle函数,需要注意画刷,如果不想矩形被填充,要重新选入空画刷。
      

  15.   

    或者换个思路,不去绘制,而是另外用其它控件来显示数据,作为测试你可以用richtextbox试试,实际使用的时候,可以考虑用一组label来做一个自己的控件来实现。
      

  16.   

    对于这种楼主这种情况如果楼主每次鼠标移动都把所有的线重画一次,肯定是会有闪烁的。一般情况使用双缓冲,先在一个看不见的picturebox中绘制好,然后一次性绘制到显示的picturebox中。另外picturebox的AutoRedraw属性需要好好的利用。当AutoRedraw属性为True的时候,如果调用cls方法,将会清楚所有图片象素。但是如果AutoRedraw的属性为False,则cls只是清除AutoRedraw属性为False时画上去的图片象素。楼主可以试试,当AutoRedraw属性为False时,画图片上去后,窗口刷新一下图片就消失了。
      

  17.   

    通过上面所说的,如果只是想在鼠标所指的地方快速显示文字,那么在鼠标移动的事件中,判断鼠标已经移动到指定位置,则首先将picturebox的属性置为False,然后调用picturebox的cls方法,在调用print方法在指定的地方写上文字。