进度条上如何添加文字

wen000_ 2015-06-15 09:22:51
请问如何将进步百分比同时作为文字显示在进度条上?
...全文
1143 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wx9288 2015-10-08
  • 打赏
  • 举报
回复
求问怎么调用 能举个例子吗
wen000_ 2015-06-15
  • 打赏
  • 举报
回复
引用 7 楼 hironpan 的回复:
楼上那位仁兄提供的代码,测试有效,效果很赞,已翻译为vb.net

Class textProgressBar
    Inherits System.Windows.Forms.ProgressBar

    <System.Runtime.InteropServices.DllImport("user32.dll ")> _
    Private Shared Function GetWindowDC(hWnd As IntPtr) As IntPtr
    End Function

    <System.Runtime.InteropServices.DllImport("user32.dll ")> _
    Private Shared Function ReleaseDC(hWnd As IntPtr, hDC As IntPtr) As Integer
    End Function

    Private _TextColor As System.Drawing.Color = System.Drawing.Color.Black

    Private _TextFont As New System.Drawing.Font("SimSun ", 12)

    Public Property TextColor() As System.Drawing.Color
        Get
            Return _TextColor
        End Get
        Set(value As System.Drawing.Color)
            _TextColor = value
            Me.Invalidate()
        End Set
    End Property

    Public Property TextFont() As System.Drawing.Font
        Get
            Return _TextFont
        End Get
        Set(value As System.Drawing.Font)
            _TextFont = value
            Me.Invalidate()
        End Set
    End Property

    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)
        If m.Msg = &HF OrElse m.Msg = &H133 Then
            '拦截系统消息,获得当前控件进程以便重绘。  
            '一些控件(如TextBox、Button等)是由系统进程绘制,重载OnPaint方法将不起作用.  
            '所有这里并没有使用重载OnPaint方法绘制TextBox边框。  
            '  
            'MSDN:重写   OnPaint   将禁止修改所有控件的外观。  
            '那些由   Windows   完成其所有绘图的控件(例如   Textbox)从不调用它们的   OnPaint   方法,  
            '因此将永远不会使用自定义代码。请参见您要修改的特定控件的文档,  
            '查看   OnPaint   方法是否可用。如果某个控件未将   OnPaint   作为成员方法列出,  
            '则您无法通过重写此方法改变其外观。  
            '  
            'MSDN:要了解可用的   Message.Msg、Message.LParam   和   Message.WParam   值,  
            '请参考位于   MSDN   Library   中的   Platform   SDK   文档参考。可在   Platform   SDK(“Core   SDK”一节)  
            '下载中包含的   windows.h   头文件中找到实际常数值,该文件也可在   MSDN   上找到。  
            Dim hDC As IntPtr = GetWindowDC(m.HWnd)
            If hDC.ToInt32() = 0 Then
                Return
            End If
            'base.OnPaint(e);
            Dim g As System.Drawing.Graphics = Graphics.FromHdc(hDC)
            Dim brush As New SolidBrush(_TextColor)
            Dim s As String = String.Format("{0}%", Me.Value * 100 / Me.Maximum)
            Dim size As SizeF = g.MeasureString(s, _TextFont)
            Dim x As Single = (Me.Width - size.Width) / 2
            Dim y As Single = (Me.Height - size.Height) / 2
            g.DrawString(s, _TextFont, brush, x, y)
            '返回结果  
            m.Result = IntPtr.Zero
            '释放  
            ReleaseDC(m.HWnd, hDC)
        End If
    End Sub
End Class
太帅了,亲测有效 求大神授之以渔,如果我想学习用VB重写.net里的控件类的话该从msdn里的什么地方学起啊 http://bbs.csdn.net/topics/391053811 如果可以,请大神在此回答
csdnFUCKINGSUCKS 2015-06-15
  • 打赏
  • 举报
回复
引用 7 楼 hironpan 的回复:
楼上那位仁兄提供的代码,测试有效,效果很赞,已翻译为vb.net

Class textProgressBar
    Inherits System.Windows.Forms.ProgressBar

    <System.Runtime.InteropServices.DllImport("user32.dll ")> _
    Private Shared Function GetWindowDC(hWnd As IntPtr) As IntPtr
    End Function

    <System.Runtime.InteropServices.DllImport("user32.dll ")> _
    Private Shared Function ReleaseDC(hWnd As IntPtr, hDC As IntPtr) As Integer
    End Function

    Private _TextColor As System.Drawing.Color = System.Drawing.Color.Black

    Private _TextFont As New System.Drawing.Font("SimSun ", 12)

    Public Property TextColor() As System.Drawing.Color
        Get
            Return _TextColor
        End Get
        Set(value As System.Drawing.Color)
            _TextColor = value
            Me.Invalidate()
        End Set
    End Property

    Public Property TextFont() As System.Drawing.Font
        Get
            Return _TextFont
        End Get
        Set(value As System.Drawing.Font)
            _TextFont = value
            Me.Invalidate()
        End Set
    End Property

    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)
        If m.Msg = &HF OrElse m.Msg = &H133 Then
            '拦截系统消息,获得当前控件进程以便重绘。  
            '一些控件(如TextBox、Button等)是由系统进程绘制,重载OnPaint方法将不起作用.  
            '所有这里并没有使用重载OnPaint方法绘制TextBox边框。  
            '  
            'MSDN:重写   OnPaint   将禁止修改所有控件的外观。  
            '那些由   Windows   完成其所有绘图的控件(例如   Textbox)从不调用它们的   OnPaint   方法,  
            '因此将永远不会使用自定义代码。请参见您要修改的特定控件的文档,  
            '查看   OnPaint   方法是否可用。如果某个控件未将   OnPaint   作为成员方法列出,  
            '则您无法通过重写此方法改变其外观。  
            '  
            'MSDN:要了解可用的   Message.Msg、Message.LParam   和   Message.WParam   值,  
            '请参考位于   MSDN   Library   中的   Platform   SDK   文档参考。可在   Platform   SDK(“Core   SDK”一节)  
            '下载中包含的   windows.h   头文件中找到实际常数值,该文件也可在   MSDN   上找到。  
            Dim hDC As IntPtr = GetWindowDC(m.HWnd)
            If hDC.ToInt32() = 0 Then
                Return
            End If
            'base.OnPaint(e);
            Dim g As System.Drawing.Graphics = Graphics.FromHdc(hDC)
            Dim brush As New SolidBrush(_TextColor)
            Dim s As String = String.Format("{0}%", Me.Value * 100 / Me.Maximum)
            Dim size As SizeF = g.MeasureString(s, _TextFont)
            Dim x As Single = (Me.Width - size.Width) / 2
            Dim y As Single = (Me.Height - size.Height) / 2
            g.DrawString(s, _TextFont, brush, x, y)
            '返回结果  
            m.Result = IntPtr.Zero
            '释放  
            ReleaseDC(m.HWnd, hDC)
        End If
    End Sub
End Class
感谢翻译,没写过VB,本来想自己试着翻译的,但试了下感觉要费时不少。
皮特胖胖 2015-06-15
  • 打赏
  • 举报
回复
楼上那位仁兄提供的代码,测试有效,效果很赞,已翻译为vb.net

Class textProgressBar
    Inherits System.Windows.Forms.ProgressBar

    <System.Runtime.InteropServices.DllImport("user32.dll ")> _
    Private Shared Function GetWindowDC(hWnd As IntPtr) As IntPtr
    End Function

    <System.Runtime.InteropServices.DllImport("user32.dll ")> _
    Private Shared Function ReleaseDC(hWnd As IntPtr, hDC As IntPtr) As Integer
    End Function

    Private _TextColor As System.Drawing.Color = System.Drawing.Color.Black

    Private _TextFont As New System.Drawing.Font("SimSun ", 12)

    Public Property TextColor() As System.Drawing.Color
        Get
            Return _TextColor
        End Get
        Set(value As System.Drawing.Color)
            _TextColor = value
            Me.Invalidate()
        End Set
    End Property

    Public Property TextFont() As System.Drawing.Font
        Get
            Return _TextFont
        End Get
        Set(value As System.Drawing.Font)
            _TextFont = value
            Me.Invalidate()
        End Set
    End Property

    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)
        If m.Msg = &HF OrElse m.Msg = &H133 Then
            '拦截系统消息,获得当前控件进程以便重绘。  
            '一些控件(如TextBox、Button等)是由系统进程绘制,重载OnPaint方法将不起作用.  
            '所有这里并没有使用重载OnPaint方法绘制TextBox边框。  
            '  
            'MSDN:重写   OnPaint   将禁止修改所有控件的外观。  
            '那些由   Windows   完成其所有绘图的控件(例如   Textbox)从不调用它们的   OnPaint   方法,  
            '因此将永远不会使用自定义代码。请参见您要修改的特定控件的文档,  
            '查看   OnPaint   方法是否可用。如果某个控件未将   OnPaint   作为成员方法列出,  
            '则您无法通过重写此方法改变其外观。  
            '  
            'MSDN:要了解可用的   Message.Msg、Message.LParam   和   Message.WParam   值,  
            '请参考位于   MSDN   Library   中的   Platform   SDK   文档参考。可在   Platform   SDK(“Core   SDK”一节)  
            '下载中包含的   windows.h   头文件中找到实际常数值,该文件也可在   MSDN   上找到。  
            Dim hDC As IntPtr = GetWindowDC(m.HWnd)
            If hDC.ToInt32() = 0 Then
                Return
            End If
            'base.OnPaint(e);
            Dim g As System.Drawing.Graphics = Graphics.FromHdc(hDC)
            Dim brush As New SolidBrush(_TextColor)
            Dim s As String = String.Format("{0}%", Me.Value * 100 / Me.Maximum)
            Dim size As SizeF = g.MeasureString(s, _TextFont)
            Dim x As Single = (Me.Width - size.Width) / 2
            Dim y As Single = (Me.Height - size.Height) / 2
            g.DrawString(s, _TextFont, brush, x, y)
            '返回结果  
            m.Result = IntPtr.Zero
            '释放  
            ReleaseDC(m.HWnd, hDC)
        End If
    End Sub
End Class
皮特胖胖 2015-06-15
  • 打赏
  • 举报
回复
重写貌似不大可行,OnPaint方法重写无效,所以改用WndProc中重写,但是win7及以上操作系统,进度条是一直变化的,然后就一闪一闪亮晶晶了,以下作参考。。。

Public Class NewProgressBar
    Inherits System.Windows.Forms.ProgressBar
    Protected Overrides Sub WndProc(ByRef m As Message)
        Dim newGrap As Graphics = Me.CreateGraphics
        newGrap.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        newGrap.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        newGrap.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
        newGrap.DrawString(Me.Value, New Font("宋体", 12, FontStyle.Regular, GraphicsUnit.Point), Brushes.Black, New PointF(0, 0))
        newGrap.Dispose()
        MyBase.WndProc(m)
    End Sub
End Class
csdnFUCKINGSUCKS 2015-06-15
  • 打赏
  • 举报
回复
引用 4 楼 wen000_ 的回复:
[quote=引用 3 楼 ducker3590 的回复:] 重写可以参照这里 这里显示的文字是进度条百分百,想修改成其他的话,修改string s的值即可
我是VB选手,C#的我也找到一大堆 求问如何重写已有控件呢,给出一个简单的框架就可以呢[/quote]
引用 4 楼 wen000_ 的回复:
[quote=引用 3 楼 ducker3590 的回复:] 重写可以参照这里 这里显示的文字是进度条百分百,想修改成其他的话,修改string s的值即可
我是VB选手,C#的我也找到一大堆 求问如何重写已有控件呢,给出一个简单的框架就可以呢[/quote] 重写跟语言关系不是很大啊 写法都是一样的 继承需要重写的控件类 然后对需要重写的地方进行修改就行了啊
wen000_ 2015-06-15
  • 打赏
  • 举报
回复
引用 3 楼 ducker3590 的回复:
重写可以参照这里 这里显示的文字是进度条百分百,想修改成其他的话,修改string s的值即可
我是VB选手,C#的我也找到一大堆 求问如何重写已有控件呢,给出一个简单的框架就可以呢
csdnFUCKINGSUCKS 2015-06-15
  • 打赏
  • 举报
回复
重写可以参照这里 这里显示的文字是进度条百分百,想修改成其他的话,修改string s的值即可
wen000_ 2015-06-15
  • 打赏
  • 举报
回复
引用 1 楼 hironpan 的回复:
1、在进度条上加个Label 2、重写进度条,在paint?事件中画文字 以上只是想法,未尝试
第一个方法应该可行,但现在处于起步阶段,重写还不知道如何下手?
皮特胖胖 2015-06-15
  • 打赏
  • 举报
回复
1、在进度条上加个Label 2、重写进度条,在paint?事件中画文字 以上只是想法,未尝试

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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