none
ListViewの列ヘッダの見た目がOSで違う件について RRS feed

  • 質問

  • お世話になります。

    既出でしたら申し訳ございません。

    System.Windows.Forms.ListViewの列ヘッダ部分が、

    Windows7では薄いグレーで少し盛り上がったようなグラデーション表示されているのに対し、

    Windows10では真っ白で単色表示されるため、見た目に違いが生じている状況です。

    Windows10でもWindows7と同じように列ヘッダ部分が表示されるようにするには、どのような手段があるでしょうか?

    2017年2月16日 5:16

回答

  • 各利用者がコントロールパネルのテーマより設定するものですので、アプリケーション側で見た目を一致させることはできませんし、するべきではありません。

    一つ方法があるとすれば、テーマを使用しないという選択肢もあります。方法 : Windows XP の Visual スタイルを有効にするで説明がありますが、Program.csにある

    Application.EnableVisualStyles();

    行を削除またはコメントアウトすることで、XP以降のVisual Style(テーマ)を適用せず、Windows 2000スタイルにすることでOSによる違いをなくすことができます。
    # 技術的に可能なだけでお勧めはしません。

    • 回答としてマーク seamat 2017年2月16日 7:47
    2017年2月16日 6:28
  • Windows 7のVisual StyleとWindows 10のVisual Styleはデザインが異なるので、合わせようと思うと、自分でColumnHeaderの背景を描画する必要があるかと思います。

    例えば、次のようにします。(カラム上にマウスが乗った時などの処理は入っていません。)

    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                listView1.View = View.Details;
                listView1.DrawColumnHeader += new
                DrawListViewColumnHeaderEventHandler(listView1_DrawColumnHeader);
                listView1.OwnerDraw = true;
                listView1.Columns.Add("カラム1");
                listView1.Columns.Add("カラム2");
            }
    
            private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
            {
                // 背景を描画
                //e.DrawBackground();
                e.Graphics.FillRectangle(new SolidBrush(Color.White), e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, 10 * e.Bounds.Height / 23);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(246, 246, 246)), e.Bounds.Left, 10 * e.Bounds.Height / 23, e.Bounds.Width, 13 * e.Bounds.Height / 23);
                // カラムの間の線を描画
                e.Graphics.DrawLine(new Pen(Color.FromArgb(241, 241, 241)), e.Bounds.Left, e.Bounds.Top, e.Bounds.Left, 10 * e.Bounds.Height / 23);
                e.Graphics.DrawLine(new Pen(Color.FromArgb(241, 241, 241)), e.Bounds.Right - 1, e.Bounds.Top, e.Bounds.Right - 1, 10 * e.Bounds.Height / 23);
                e.Graphics.DrawLine(new Pen(Color.FromArgb(230, 230, 230)), e.Bounds.Left, 10 * e.Bounds.Height / 23, e.Bounds.Left, e.Bounds.Bottom);
                e.Graphics.DrawLine(new Pen(Color.FromArgb(230, 230, 230)), e.Bounds.Right - 1, 10 * e.Bounds.Height / 23, e.Bounds.Right - 1, e.Bounds.Bottom);
    
                // テキストを描画
                e.DrawText();
                return;
            }
        }
    }
    • 編集済み kenjinoteMVP 2017年2月16日 7:09
    • 回答としてマーク seamat 2017年2月16日 7:47
    2017年2月16日 6:44

すべての返信

  • 各利用者がコントロールパネルのテーマより設定するものですので、アプリケーション側で見た目を一致させることはできませんし、するべきではありません。

    一つ方法があるとすれば、テーマを使用しないという選択肢もあります。方法 : Windows XP の Visual スタイルを有効にするで説明がありますが、Program.csにある

    Application.EnableVisualStyles();

    行を削除またはコメントアウトすることで、XP以降のVisual Style(テーマ)を適用せず、Windows 2000スタイルにすることでOSによる違いをなくすことができます。
    # 技術的に可能なだけでお勧めはしません。

    • 回答としてマーク seamat 2017年2月16日 7:47
    2017年2月16日 6:28
  • Windows 7のVisual StyleとWindows 10のVisual Styleはデザインが異なるので、合わせようと思うと、自分でColumnHeaderの背景を描画する必要があるかと思います。

    例えば、次のようにします。(カラム上にマウスが乗った時などの処理は入っていません。)

    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                listView1.View = View.Details;
                listView1.DrawColumnHeader += new
                DrawListViewColumnHeaderEventHandler(listView1_DrawColumnHeader);
                listView1.OwnerDraw = true;
                listView1.Columns.Add("カラム1");
                listView1.Columns.Add("カラム2");
            }
    
            private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
            {
                // 背景を描画
                //e.DrawBackground();
                e.Graphics.FillRectangle(new SolidBrush(Color.White), e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, 10 * e.Bounds.Height / 23);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(246, 246, 246)), e.Bounds.Left, 10 * e.Bounds.Height / 23, e.Bounds.Width, 13 * e.Bounds.Height / 23);
                // カラムの間の線を描画
                e.Graphics.DrawLine(new Pen(Color.FromArgb(241, 241, 241)), e.Bounds.Left, e.Bounds.Top, e.Bounds.Left, 10 * e.Bounds.Height / 23);
                e.Graphics.DrawLine(new Pen(Color.FromArgb(241, 241, 241)), e.Bounds.Right - 1, e.Bounds.Top, e.Bounds.Right - 1, 10 * e.Bounds.Height / 23);
                e.Graphics.DrawLine(new Pen(Color.FromArgb(230, 230, 230)), e.Bounds.Left, 10 * e.Bounds.Height / 23, e.Bounds.Left, e.Bounds.Bottom);
                e.Graphics.DrawLine(new Pen(Color.FromArgb(230, 230, 230)), e.Bounds.Right - 1, 10 * e.Bounds.Height / 23, e.Bounds.Right - 1, e.Bounds.Bottom);
    
                // テキストを描画
                e.DrawText();
                return;
            }
        }
    }
    • 編集済み kenjinoteMVP 2017年2月16日 7:09
    • 回答としてマーク seamat 2017年2月16日 7:47
    2017年2月16日 6:44