プログレスバーの、緑になっている部分の色を変更したい。

タグの編集
投稿者 秘密  (小学生) 投稿日時 2013/4/4 15:07:45
プログレスバーの、緑になっている部分の色を変更したいのですが、変更できるプロパティ,コードなどはありますか?
投稿者 YuO  (社会人) 投稿日時 2013/4/4 18:01:35
Visual Stylesを有効にしていないのであれば、PBM_SETBARCOLORで可能です。

site: PBM_SETBARCOLOR message (Windows)
http://msdn.microsoft.com/en-us/library/windows/desktop/bb760838(v=vs.85).aspx
投稿者 るきお  (社会人) 投稿日時 2013/4/4 22:06:07
プログレスバーはそのまま使ったことしかないです。
私の勘ではあまりいじらないでありのままで使った方が良いと思います。

一応プログレスバーを赤くする例を紹介します。
このプログラムを一度実行するとツールボックスにProgressBarExが出現します。
ProgressBarExをフォームに配置すると、赤いプログレスバーです。
Public Class ProgressBarEx
    Inherits ProgressBar

    Public Sub New()
        Me.SetStyle(ControlStyles.UserPaint, True)
    End Sub

    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)

        Const Edge As Integer = 1

        Dim width As Integer = e.ClipRectangle.Width * (Me.Value / Me.Maximum) - 4
        Dim height As Integer = e.ClipRectangle.Height - (Edge * 2)

        Dim rect As New Rectangle(Edge, Edge, width, height)

        If ProgressBarRenderer.IsSupported Then
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle)
        Else
            Dim outerRect As Rectangle = e.ClipRectangle
            outerRect.Width -= 1
            outerRect.Height -= 1
            e.Graphics.DrawRectangle(Pens.Black, outerRect)
        End If

        e.Graphics.FillRectangle(Brushes.Red, rect)

    End Sub

End Class


YuOさんの方法は私はどうも実現できませんでした。
投稿者 YuO  (社会人) 投稿日時 2013/4/5 03:56:36
えーっと、MSDNにもあるのですが、XP Visual Stylesを「使っていないとき」という制限があります。

・アプリケーションフレームワークを使っている場合は、プロパティで[XP Visual スタイルを有効にする]チェックボックスのチェックを外す
・アプリケーションフレームワークを使っていない場合は、Application.EnableVisualStylesメソッドを呼び出さない
が条件になります。

以下、VB 2012用のコード断片です。
Private Const WM_USER As Integer = &H400
Private Const PBM_SETBARCOLOR As Integer = WM_USER + 9

<DllImport("User32.dll", PreserveSig:=False, CharSet:=CharSet.Auto)>
Private Shared Sub SendMessage(hWnd As IntPtr, Msg As UInteger, wParam As IntPtr, lParam As IntPtr)
End Sub

Private Shared Sub SetBarColor(target As ProgressBar, color As Color)
    If Application.RenderWithVisualStyles Then
        Throw New InvalidOperationException("Visual スタイルが有効な状態では色の変更はできません。")
    End If
    SendMessage(target.Handle, PBM_SETBARCOLOR, IntPtr.Zero, CType(color.R Or (color.G << 8) Or (color.B << 16), IntPtr))
End Sub
投稿者 るきお  (社会人) 投稿日時 2013/4/6 12:42:58
YuOさん、ありがとうございます。

私はXP Visual スタイルの設定を行っていませんでした。
YuOさんのプログラムで無事赤いプログレスバーにできました。