tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridView右のスクロールバーの模様を変える方法
記事No9423
投稿日: 2009/09/30(Wed) 20:19
投稿者camputer

 こんばんは.
いつも勉強させていただいております.どうもありがとうございます.
camputerと申します.どうぞよろしくお願いいたします.
プログラム歴(数値計算ばかり)10年 + VB.NET歴1年弱になります.
開発環境はVB2008+XPです.

 FormやControlの形を変えたり,図を張り付けたりすることは
なんとか出来るようになったのですが,DataGridView右側のスクロールバーのみ
手をつけることができません.
全体を統一した色にしようとしても,その部分だけ灰色で浮いた感じに
なってしまいます...
ここに図を張り付けたり形を変えるような方法は何かあるのでしょうか?

 またもし,スクロールバー自体のスクロール位置をリアルタイムに取れるのであれば,
スクロールバーを全て消しておいて,その上にスクロールバー位置と
連動するような画像を何か張り付けてもよいのかな?などと思うのですが...
もし何か良さそうな方法がございましたら,是非ともご教授いただきたくお願い申し上げます.

 どうぞよろしくお願いいたします.

[ツリー表示へ]
タイトルRe: DataGridView右のスクロールバーの模様を変える方法
記事No9425
投稿日: 2009/10/01(Thu) 11:09
投稿者たくボン@10年ぶり
>  FormやControlの形を変えたり,図を張り付けたりすることは
> なんとか出来るようになったのですが,DataGridView右側のスクロールバーのみ
> 手をつけることができません.
> 全体を統一した色にしようとしても,その部分だけ灰色で浮いた感じに
> なってしまいます...
> ここに図を張り付けたり形を変えるような方法は何かあるのでしょうか?

公式には資料はないと思うけど、DataGridViewのスクロールバーはハンドルを持っているので、サブクラス化するとかすればなんとかなりそうな感じです。

描画の部分についても、スクロールバー自体がWM_CTLCCOLORSCROLLBARやWM_PAINTを受け取っているみたいなので、独自の描画関数を用意すればいいのかも。

ただし、イベント処理はスクロールバー自体にさせるのがいいと思うので、バー高さや矩形のサイズは変更しないのがいいと思います。

[ツリー表示へ]
タイトルRe^2: DataGridView右のスクロールバーの模様を変える方法
記事No9426
投稿日: 2009/10/01(Thu) 12:00
投稿者camputer
 たくボン 様

 ご親切にどうもありがとうございます!!
お教えいただいたあと、Googleの日本語ページで「"datagridview" "WM_CTLCOLORSCROLLBAR"」
で検索をかけてみると2件ヒットしました。
>サブクラス化するとかすればなんとかなりそうな〜
が分かりませんが、今から勉強してやってみます。

>ただし、イベント処理はスクロールバー自体にさせるのがいいと思うので、バー高さや矩形のサイズは変更しないのがいいと思います。
 どうもありがとうございます。アドバイスいただいた通りにやってみます。
以前から「.NET "DataGridView" "スクロールバー"」などと検索しても方法が見つけられなかった
案件だったのですが、まだまだ検索不足、ということでしょうか。。^^;

 今晩頑張ってみます!どうもありがとうございました!!

[ツリー表示へ]
タイトルRe^3: DataGridView右のスクロールバーの模様を変える方法
記事No9427
投稿日: 2009/10/01(Thu) 14:29
投稿者たくボン@10年ぶり
>  どうもありがとうございます。アドバイスいただいた通りにやってみます。
> 以前から「.NET "DataGridView" "スクロールバー"」などと検索しても方法が見つけられなかった
> 案件だったのですが、まだまだ検索不足、ということでしょうか。。^^;

検索する単語を探したいなら、SPYを色々活用してみるのがいいかもしれませんね。
メッセージにしても、クラスにしてもリソースはSDKにあったりするので、細かい部分を調べたりする場合はまず僕はSPYを使いますね。

それと、日本のサイトはなかなか技術を公開しない風潮があるので、海外サイトも見てみるのをお勧めします。僕も英語はまったくダメですがプログラムならなんとか読めるので情報を探す場合は海外から調べるときもあります。

[ツリー表示へ]
タイトルRe^4: DataGridView右のスクロールバーの模様を変える方法
記事No9428
投稿日: 2009/10/01(Thu) 19:35
投稿者camputer
 たくボン 様

 どうもありがとうございます!! SPYなるものを知りませんでした.
是非とも使ってみたく検索しておりましたが,「UI Spy」かもしくは「SPY++」というもの
でございましょうか..?
 ProgramFilesで検索をかけてみましたが,私のPCにはSPYというものは入ってなさそうで
ございます.何かインストールする必要があるのでございましょうか.....

>海外サイトも見てみるのをお勧めします
ご親切にどうもありがとうございます.
まだまだ,書いてあるコードからその趣旨を読み取れないことが多く,
コード以外の文章からヒントを得ることが多いため,少し敬遠しておりました...
しかし
>日本のサイトはなかなか技術を公開しない風潮があるので〜
ということでありましたら,頑張らなくてはいけませんねー..
海外サイトも積極的に見るようにいたします^^;

 今ずっと検索しておりますと,
DataGridView.RowTemplate.HeaderCell = New myDataGridViewRowHeaderCell
  :
  :
Public Class myDataGridViewRowHeaderCell
    Inherits DataGridViewRowHeaderCell
  :
  :
のようなコーディングでDataGridViewの書式を変えているものが見つかりましたので
こんな感じでやるのかな?などと考え,奮闘いたしております.

        DGVファイル名一括置換.ScrollBars = New ScrollBars
        DGVファイル名一括置換.ScrollBars = New ScrollBar
        DGVファイル名一括置換.VerticalScrollBar = New ScrollBars

と色々試しておりますが,
「型 'WindowsApplication1.ScrollBars' の値を
     'System.Windows.Forms.ScrollBars' に変換できません。」
「'MustInherit' で宣言されたクラスでは、'New' を使用することはできません。」
「'System.Windows.Forms.DataGridView.Protected ReadOnly Property
       VerticalScrollBar() As System.Windows.Forms.ScrollBar' は
       'Protected' であるため、このコンテキストではアクセスできません。」
などと,ことごとく拒否されております.
もう少し頑張ります...orz

 どうもありがとうございました!!

[ツリー表示へ]
タイトルRe^5: DataGridView右のスクロールバーの模様を変える方法
記事No9432
投稿日: 2009/10/06(Tue) 17:00
投稿者camputer
 こんにちは。たくボン様からWM_CTLCOLORSCROLLBARの存在とサブクラス化する
という事を教えていただいた後、
>独自の描画関数を用意すれば〜
がどうしても分からなそうだったのと、VScrollBar&DataGridViewの連動方法が
分かってきたので、まず普通にVScrollBarの色を変えるところから
トライしてみております。

 そこでForm1クラス上に次のように書いてみたのですが、
(以下、http://dobon.net/vb/bbs/log3-9/5149.htmlからいただいてきました)

    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

これではどうもForm1直上にあるVScrollBarでないとWM_CTLCOLORSCROLLBARを
拾えないようでございます。
(Form1直上のVScrollBarであれば背景のみ色を変更できるようになりました)


 そこでサブクラス化すればいいのかな(?)、と考えまして、
dobon.net様の  http://dobon.net/vb/dotnet/help/derivedcontrol.html 
                    の「Visual Studio 2005以降の場合」と
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.vscrollbar(VS.80).aspx を
参考にさせていただきまして

Public Class VScrollBar
    Inherits ScrollBar
    Dim VScrollBar1 As VScrollBar
     :
     :
End Class

を作成してその中に上記サブルーチン類を入れてみたのですが、
これをいったんビルドしてみても何故か、ツールボックス上に「横」向きスクロールバーが
追加されてしまいます。
 また、このまま実行しても、このCase WM_CTLCOLORSCROLLBARには
入ってきませんでした。。(WM_CREATEとWM_DESTROYには入ってきております。)

 とんちんかんな質問でしたら申し訳ございませんが、どこか怪しそうな箇所が
ございましたら是非ともご指摘いただけないでしょうか。お時間のある時にでも
何かアドバイスいただければ非常に嬉しいです。
 どうぞよろしくお願いいたします。

[ツリー表示へ]
タイトルRe^6: DataGridView右のスクロールバーの模様を変える方法
記事No9527
投稿日: 2009/10/29(Thu) 14:36
投稿者camputer
 こんにちは。
ご報告になります。なんとかDataGridViewスクロールバーの背景と、
他のVScrollBarの背景を変更することができました。

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview(VS.80).aspx
 で、「Inherits Control」となっている部分がビルドできるのでそのまま書き写して
いましたが、Case WM_CTLCOLORSCROLLBARが取れず検証にかなり時間を費やしました。。。

Public Class DGV
    Inherits DataGridView
    Private Const WM_CREATE As Int32 = &H1
    Private Const WM_DESTROY As Int32 = &H2
    Private Const WM_CTLCOLORSCROLLBAR As Int32 = &H137
    Private Const WM_PAINT As Int32 = &HF
    <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(&HFF)
            Case WM_DESTROY
                DeleteObject(hBrush)
            Case WM_CTLCOLORSCROLLBAR
                    hBrush = CreateSolidBrush(&HFF)
                    m.Result = hBrush
                    Return
            Case WM_PAINT
        End Select
        MyBase.WndProc(m)
    End Sub
End Class

 あと、VScrollBar Classを作成したつもりが「H」ScrollBarが出てくる現象ですが、
    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Const SBS_VERT As Integer = 1
            Dim cp As CreateParams = MyBase.CreateParams
            cp.Style = cp.Style Or SBS_VERT
            cp.Parent = cp.Parent
            Return cp
        End Get
    End Property
のようにSBS_VERTを与えてVScrollBarに変形できました。
HScrollBarの派生盤(?)としての「VScrollBar」のようでございます。
 こちらについても直下のフォーム内でオーバーライドして、WM_CTLCOLORSCROLLBARを
取れたので、背景色を変更出来ました。(ベースForm1上のコントロールはすべて
Form1上でのオーバーライドでWM_CTLCOLORSCROLLBARを取れるもの、と思い込んでおりまして、
検証にかなり時間を費やしました。。。orz)
 前景色(ドラッグできる灰色のボタンなど)については、調査中に何度か
「ボタンドラッグの度に灰色に書き直されているような挙動が〜」という記事を
見かけましたので、おそらく負荷が大きくなるだとうと考えてやめました。

 たくボン様からWM_CTLCOLORSCROLLBARをお教えいただいたおかげでございます。
またいっこ新しいことができるようになりましたm(_ _)m
どうもありがとうございました!

[ツリー表示へ]