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

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 るきお  (社会人) 投稿日時 2013/4/6 12:42:58
YuOさん、ありがとうございます。

私はXP Visual スタイルの設定を行っていませんでした。
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/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/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 15:07:45
プログレスバーの、緑になっている部分の色を変更したいのですが、変更できるプロパティ,コードなどはありますか?