7

さて、ユーザーのデータを保持するためにいくつかのリストビューを追加するWindowsフォームアプリケーションがあり、次のようになります

ここに画像の説明を入力

ご覧のとおり、私のフォームの背景色は黒なので、リスト ビューのグリッド ラインとヘッダーの白い色が目障りなコントラストになっています。

[質問] : リスト ビューのヘッダーとグリッド線の色を自分のニーズに合わせて編集するにはどうすればよいですか?

4

2 に答える 2

11

ListViewをサポートするようにカスタマイズすることに興味を持っている人は誰もいないようですGrid Line Color。私はこれを試したので、ここで共有したいと思います。ListView アイテムをスクロールすると、ちらつきが少し (あまり多くない) だけで、あまり良くありません。ただし、許容範囲です。win32より完璧にするために、ここについての知識が不足していると思います:

public class CustomListView : ListView {
        bool scrollDown;
        int lastScroll;
        public Color GridLinesColor {get;set;}
        [DllImport("user32")]
        private static extern int GetScrollPos(IntPtr hwnd, int nBar);
        public CustomListView(){
           GridLinesColor = Color.Red;
           DoubleBuffered = true;
           base.GridLines = false;//We should prevent the default drawing of gridlines.
        }
        public new bool GridLines {get;set;}
        protected override void WndProc(ref Message m)
        {                
            if (m.Msg == 0x20a){//WM_MOUSEWHEEL = 0x20a
                scrollDown = (m.WParam.ToInt64() >> 16) < 0;
            }
            if (m.Msg == 0x115){//WM_VSCROLL = 0x115
                int n = (m.WParam.ToInt32() >> 16);
                scrollDown = n > lastScroll;
                lastScroll = n;
            }                
            base.WndProc(ref m);
            if (m.Msg == 0xf && GridLines && Items.Count > 0&&View==View.Details)//WM_PAINT = 0xf
            {                    
                using (Graphics g = CreateGraphics())
                {
                    using(Pen p = new Pen(GridLinesColor)){
                      int w = -GetScrollPos(Handle, 0);
                      for (int i = 0; i < Columns.Count; i++)
                      {
                        w += Columns[i].Width;
                        g.DrawLine(p, new Point(w, 0), new Point(w, ClientSize.Height));
                      }
                      int a = Items[0].Bounds.Bottom - 1;
                      int b = Height - Items[0].Bounds.Y;
                      int c = Items[0].Bounds.Height;
                      for (int i = scrollDown ? a + (b/c) * c : a ; scrollDown ? i >= a : i < b ; i += scrollDown ? -c : c)
                      {
                        g.DrawLine(p, new Point(0, i), new Point(ClientSize.Width, i));
                      }                                      
                    }          
                }                 
            }

        }
}

更新: Cody Gray の提案のおかげで、水平スクロールを処理するコードを追加しました。GetScrollPosMSDN ドキュメント ページで推奨されているように、代わりに使用する必要があるため、簡単にするために使用しGetScrollInfoます。

ここに画像の説明を入力

于 2013-08-17T04:29:40.977 に答える