DOBON.NET DOBON.NETプログラミング掲示板過去ログ

垂直スクロールバーの背景色の設定

環境/言語:[Windows  XP]
分類:[.NET]

いつもお世話様です。
VB.NET 初心者の質問です。
垂直スクロールバーの背景色を設定する方法を教えてください。
垂直スクロールバーをフォームに貼り付けてコードを書いたのですが背景色が変わりません。
VScrollBar1.BackColor = Color.Blue
念のため
VScrollBar1.ForeColor = Color.Blue
ともしましたが背景色は元のままです。
他に設定する必要のあるプロパティ等があるのでしょうか。
すみませんがお願いします。
> 垂直スクロールバーをフォームに貼り付けてコードを書いたのですが背景色が変わりません。
> VScrollBar1.BackColor = Color.Blue

ScrollBarクラスのBackColorプロパティはただあるだけで、残念ながら何の働きもしません(ForeColorも同様)。
■No5271に返信(管理人さんの記事)
> ScrollBarクラスのBackColorプロパティはただあるだけで、残念ながら何の働きもしません(ForeColorも同様)。

ありがとううございました。
解決済み!
■No5274に返信(平ちゃんさんの記事)

 平ちゃんさん、こんにちは。深山と申します。
 然して必要ではなかったのかも知れませんが、興味があったので調べてみました。

 スクロールバーから親ウィンドウに通知される WM_CTLCOLORSCROLLBAR メッセージを
トラップすることで背景色の変更が出来るようです。
# ただ、 HTML のスタイルシートのような細かい制御は出来ないようです。

WM_CTLCOLORSCROLLBAR Notification
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/scrollbars/scrollbarreference/scrollbarmessages/wm_ctlcolorscrollbar.asp


 簡単なサンプルを作成してみたので、よろしければ参考にして下さいな。
# なお、このサンプルを作成するにあたって、以下のサイト及び書込みを参考にさせて頂きました。

第14章 スクロールバー
http://homepage2.nifty.com/Mr_XRAY/Halbow/Chap14.html

[AB3] エディットコントロールの色変更
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=158


    Private Const WM_CREATE As Int32 = &H1
    Private Const WM_DESTROY As Int32 = &H2
    Private Const WM_CTLCOLORSCROLLBAR As Int32 = &H137

    <System.Runtime.InteropServices.DllImport("Gdi32.dll")> _
    Private Shared Function CreateSolidBrush(ByVal crColor As Int32) As IntPtr
    End Function

    <System.Runtime.InteropServices.DllImport("Gdi32.dll")> _
    Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
    End Function

    Private hBrush As IntPtr

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_CREATE
                hBrush = CreateSolidBrush(&HFF0000)
            Case WM_DESTROY
                DeleteObject(hBrush)
            Case WM_CTLCOLORSCROLLBAR
                If m.LParam.Equals(VScrollBar1.Handle) Then
                    m.Result = hBrush
                    Return
                End If
        End Select

        MyBase.WndProc(m)
    End Sub


# 少しだけ補足(蛇足?)
# CreateSolidBrush の引数は COLORREF で、 RGB 値の並びは 0x00bbggrr となっています。
# 一方 Color.ToArgb メソッドで得られる値は 0xaarrggbb ですので、コーディングの際には
# 注意が必要です。<いや、自分が最初それで失敗したというだけなのですけど(汗)

COLORREF
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/colors_9xiq.asp

Color.ToArgb メソッド
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemDrawingColorClassToArgbTopic.asp
■No5318に返信(深山さんの記事)
> ■No5274に返信(平ちゃんさんの記事)
>
>  平ちゃんさん、こんにちは。深山と申します。
>  然して必要ではなかったのかも知れませんが、興味があったので調べてみました。
>
深山さん お手間取らせましてすみませんでした。
私は初心者なのでこの内容をゆっくりと確認させていただきます。
VB.Netの限界か?とあきらめていましたので助かりました。
■No5343に返信(平ちゃんさんの記事)
> ■No5318に返信(深山さんの記事)
>>■No5274に返信(平ちゃんさんの記事)
>>
>> 平ちゃんさん、こんにちは。深山と申します。
>> 然して必要ではなかったのかも知れませんが、興味があったので調べてみました。
>>
> 深山さん お手間取らせましてすみませんでした。
> 私は初心者なのでこの内容をゆっくりと確認させていただきます。
> VB.Netの限界か?とあきらめていましたので助かりました。
>

 サンプルプログラムで確認しました。
色は hBrush = CreateSolidBrush(&HFF0000) の変更で好みに出来ました。
しかしリストビューなどの標準スクロールバーと比較すると着色する部分が逆になっています。質問時に私が背景色と前景色を間違えた?と思います。
今のところサンプルプログラムは難解なのではっきりとは言えませんが
Private Const WM_CTLCOLORSCROLLBAR As Int32 = &H137 の部分と
  case ブロックを修正すればよいかなぁと思っています。
有難うございました。
解決済み!
■No5367に返信(平ちゃんさんの記事)

 平ちゃんさん、こんにちは。深山です。

> 色は hBrush = CreateSolidBrush(&HFF0000) の変更で好みに出来ました。

 この部分なのですけど、その後の調べで次のようにも出来ることが判りました。
 RGB 値を直書きするより可読性が高くなるかと思います。

hBrush = CreateSolidBrush(ColorTranslator.ToOle(Color.Blue))

> しかしリストビューなどの標準スクロールバーと比較すると着色する部分が逆になっています。質問時に私が背景色と前景色を間違えた?と思います。
> 今のところサンプルプログラムは難解なのではっきりとは言えませんが
> Private Const WM_CTLCOLORSCROLLBAR As Int32 = &H137 の部分と
>   case ブロックを修正すればよいかなぁと思っています。

 えーっと、この定数値は Windows が使用してるもの(という言い方をすると語弊があるかなぁ?)
なので変えてやっても上手くはいきませんよ(^_^;)

 『着色する部分が逆に』というのがどういう状態を指してるのかよく解らないのですけど、
ボタン(矢印)部分やつまみ部分の色を変えたかったということでしょうか?
 もしそうでしたら、コントロールを自作するしかないかも知れません。 VScrollBar クラスを
継承したクラスを作成してオーナー ドローをしたとしても、ボタンをクリックすると表示が
元に戻ってしまいますから。
# 実験してみたところ、どうやらシステム側でスクロール バーを再描画してしまうようでした。
# マウス操作に併せてその都度描画し直してあげれば可能かも知れませんが‥‥どちらにせよ
# 大変だと思います。
■No5415に返信(深山さんの記事)
> ■No5367に返信(平ちゃんさんの記事)


深山さん ありがとうございます。


>  この部分なのですけど、その後の調べで次のようにも出来ることが判りました。
>  RGB 値を直書きするより可読性が高くなるかと思います。
>
> hBrush = CreateSolidBrush(ColorTranslator.ToOle(Color.Blue))

はい。格段にわかりやすくなりました。
ただ KnownColor列挙体を使う場合は一度RGBコンポーネントを取得し24ビットに変換する必要があります。
hBrush = CreateSolidBrush(ColorTranslator.ToOle(color.FromKnownColor(KnownColor.InactiveCaptionText)))
では何故か黒になってしまう。
次のようにすることで解決しました。
Dim color As Color = New Color()
color = color.FromKnownColor(KnownColor.InactiveCaptionText)
Dim cref As Integer
cref = color.B
cref = cref * 16 * 16 + color.G
cref = cref * 16 * 16 + color.R
hBrush = CreateSolidBrush(cref)


>  えーっと、この定数値は Windows が使用してるもの(という言い方をすると語弊があるかなぁ?)
> なので変えてやっても上手くはいきませんよ(^_^;)
>

はい なんとなくそんな気もしてました。


>  『着色する部分が逆に』というのがどういう状態を指してるのかよく解らないのですけど、
> ボタン(矢印)部分やつまみ部分の色を変えたかったということでしょうか?


はい その通りです。
この掲示板のスクロールバーと同じイメージです。
なお着色している部分をクリックしてつまみを移動させると瞬間色が変わり再度着色しているのがかなり気になります。



>  もしそうでしたら、コントロールを自作するしかないかも知れません。 VScrollBar クラスを
> 継承したクラスを作成してオーナー ドローをしたとしても、ボタンをクリックすると表示が
> 元に戻ってしまいますから。
> # 実験してみたところ、どうやらシステム側でスクロール バーを再描画してしまうようでした。
> # マウス操作に併せてその都度描画し直してあげれば可能かも知れませんが‥‥どちらにせよ
> # 大変だと思います。



自作コントロールはいずれマスターしなければいけない事なのでその折に再度チャレンジしてみます。
丁寧にご教授して頂き助かりました。
今後もよろしくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板