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);
} } } テーマ:プログラミング - ジャンル:コンピュータ
|