医師 転職 ナースバンク
FC2ブログ
Take a Rest
適当に思ったことや、個人的なメモなどをアップする場所。 気が向いたときにしか書かないので、更新頻度は低め。
プロフィール

Author:agloo
FC2ブログへようこそ!



最近の記事



最近のコメント



最近のトラックバック



月別アーカイブ



カテゴリー



ブロとも申請フォーム

この人とブロともになる



ブログ内検索



RSSフィード



リンク

このブログをリンクに追加する



スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


ListViewでOwnerDrawを利用する
ListViewコントロールを利用して、ColumnItemの表示を一部右寄せにしたかったので、OwnerDrawを利用して作って見た。

簡単すぎるのか、Googleで検索しても良いサンプルが無かったのでメモとしてアップ。


Visual Studio2008を起動して、新しいプロジェクト→Windowsフォームアプリケーションをクリックして、プロジェクト名をListViewOwnerDrawに設定して下記のコードを貼り付けるとテストができる。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ListViewOwnerDraw
{
    public partial class Form1 : Form
    {
        public ListView listView1;
        public Form1()
        {
            InitializeComponent();

            this.Load += new EventHandler(Form1_Load);

            listView1 = new ListView();
        }

        /// <summary>
        /// ListViewの初期設定をする
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            this.Controls.Add(this.listView1);

            // セルに表示される文字の位置をコントロールするのでOwnerDrawをtrueにする
            listView1.OwnerDraw = true;
            // Headerの表示をコントロールする為にイベントを追加
            listView1.DrawColumnHeader += new DrawListViewColumnHeaderEventHandler(listView1_DrawColumnHeader);
            // Columnの表示をコントロールする為にイベントを追加
            listView1.DrawSubItem += new DrawListViewSubItemEventHandler(listView1_DrawSubItem);

            // 親フォーム全面に広げる
            listView1.Dock = DockStyle.Fill;
            // 詳細表示にする
            listView1.View = View.Details;
            // 列の並び替えをできないようにする
            listView1.AllowColumnReorder = false;
            // Gridを表示する
            listView1.GridLines = true;
            // セルクリックした場合に1行全てが選択されるようにする
            listView1.FullRowSelect = true;
            // 複数行を選択できるようにする
            listView1.MultiSelect = true;

            // Headerを設定する
            ColumnHeader h1 = new ColumnHeader();
            ColumnHeader h2 = new ColumnHeader();
            h1.Text = "HEAD1";
            h1.Width = 120;
            h2.Text = "HEAD2";
            h2.Width = 120;
            listView1.Columns.Add(h1);
            listView1.Columns.Add(h2);

            // ColumnItemを設定する
            string[] i1 = { "これは1行目の左寄せ", "これは右寄せ" };
            string[] i2 = { "これは2行目の左寄せ", "これは右寄せ" };
            string[] i3 = { "これは3行目の左寄せ", "これは右寄せ" };
            listView1.Items.Add(new ListViewItem(i1));
            listView1.Items.Add(new ListViewItem(i2));
            listView1.Items.Add(new ListViewItem(i3));
        }


        /// <summary>
        /// ListViewで表示されるセルの描画をコントロールする為のMethod
        ///
        /// ListViewItemStates
        /// 項目が選択されています
        /// Selected =   1(0x0001)
        /// 項目が無効です
        /// Grayed   =   2(0x0002)
        /// 項目がチェックされています
        /// Checked  =   8(0x0008)
        /// 項目にフォーカスがあります
        /// Focused  =  16(0x0010)
        /// 項目が既定の状態です
        /// Default  =  32(0x0020)
        /// 項目の上にマウス ポインタがあります
        /// Hot      =  64(0x0040)
        /// 項目がマークされています
        /// Marked   = 128(0x0080)
        /// 項目が中間状態です
        /// Indeterminate    = 256(0x0100)
        /// 項目にショートカット キーが表示されます
        /// ShowKeyboardCues = 512(0x0200)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
        {
            // Console.WriteLine("ColumnIndex = {0}", e.ColumnIndex);
            // Console.WriteLine("SubItemText = {0}", e.SubItem.Text);
            // Console.WriteLine("e.ItemState = {0}", e.ItemState);

            // 描画するSubItemが2列目(ColumnIndexが1)の時は、StringAligment.Farに設定して、右寄せにする
            // それ以外は、Nearにして、標準の左寄せ
            StringFormat drawFormat = new StringFormat();
            if (e.ColumnIndex == 1)
            {
                drawFormat.Alignment = StringAlignment.Far;
            }
            else
            {
                drawFormat.Alignment = StringAlignment.Near;
            }

            System.Drawing.Brush brush;

            // Forcus = 0x0010,Selected = 0x0001 として ItemStateにForcusとSelectedがセットされていた場合、
            // 2bitで書くと Selected = 0001 0000 ItemState = 0000 0001で
            // この二つ論理積を取ると0000 0001(0x0001 = Selected)となる。
            if ((e.ItemState & ListViewItemStates.Selected) == ListViewItemStates.Selected)
            {
                // Hightlightで範囲を塗りつぶす
                e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
                // 上でセルを塗りつぶしているので、表示する文字を反転する
                brush = SystemBrushes.HighlightText;
            }
            else
            {
                // 塗りつぶされていない通常のセルはWindowsTextに設定する
                brush = SystemBrushes.WindowText;
            }

            // 上で設定した,brushとdrawFormatを利用して文字を描画する
            e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, brush, e.Bounds, drawFormat);

            // drawFormatを開放する
            drawFormat.Dispose();
        }

        /// <summary>
        /// ListViewで表示されるHeader領域の描画をコントロールするMethod
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
        {
            // e.DrawDefault = trueにしているので、描画はOSに任せる
            e.DrawDefault = true;

            // 上をコメントアウトして、こちらに変更するとHeader部分の文字が中央に描画される
//            e.DrawText(TextFormatFlags.HorizontalCenter);

        }
    }
}

テーマ:プログラミング - ジャンル:コンピュータ




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。