- PR -

ListViewのオーナードローについて

1
投稿者投稿内容
未記
会議室デビュー日: 2009/03/20
投稿数: 4
投稿日時: 2009-03-20 02:02
こんにちは

System.Windows.Forms.ListViewのOwnerDrawをtrueにして
ヘッダを描画しようとしています。(エクスプローラ風のソート順矢印を表示させたいのです)
そこで、DrawColumnHeaderイベントのハンドラ内で描画を行っているのですが
イベント引数のStateプロパティで期待した値が取れません。

マウスカーソルがヘッダに重ねられて描画イベントが発生したときには"Hot"、
ヘッダからカーソルが離れたときには"Default"か何かであって欲しいのですが、
実際はどちらでも"ShowKeyboardCues"となります。

どうにかして2つの状態(カーソルのあり/なし)を判断したいのですが、
どのような方法がありますでしょうか?

環境はXP + .NET Framework 2.0 以降です。ちなみにXP+2.0環境ですと
e.ForeColorがカーソルありのときColor.Navy、なしのときColor.Blackとなるのですが
Vista+3.5では常にColor.Blackとなり、判断がつきませんでした。

以下、State他の確認コードです
コード:
private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
  System.Diagnostics.Debug.Write(e.State);
  if ((e.State & ListViewItemStates.Selected) == ListViewItemStates.Selected)
  {
    System.Diagnostics.Debug.WriteLine(" Selected " + e.ForeColor.ToString());
  }
  else if ((e.State & ListViewItemStates.Hot) == ListViewItemStates.Hot)
  {
    System.Diagnostics.Debug.WriteLine(" Hot " + e.ForeColor.ToString());
  }
  else
  {
    System.Diagnostics.Debug.WriteLine(" ??? " + e.ForeColor.ToString());
  }
}



どなたか、ご経験のある方にヒントなりを頂ければ幸いです。
未記
会議室デビュー日: 2009/03/20
投稿数: 4
投稿日時: 2009-03-24 00:23
自己レスです。

一応以下のようにしてイベントが発生した際のカーソルの座標位置によって判断できそうです。
コード:

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
if (e.Bounds.Contains(this.listView1.PointToClient(Cursor.Position)))
{
System.Diagnostics.Debug.WriteLine("Hot");
using(Brush br = new SolidBrush(Color.White))
{
e.Graphics.FillRectangle(br, e.Bounds);
}
}
else
{
System.Diagnostics.Debug.WriteLine("Default");
using (Brush br = new SolidBrush(Color.Gray))
{
e.Graphics.FillRectangle(br, e.Bounds);
}
}
}



上記ですとヘッダ間のカーソル移動のときに微妙に判定がずれるようですので微調整が必要かもしれません。
自分はめんどくさかったんでマウスカーソルの有無で描画を変えるのを放棄しました^^;
押された状態であるListViewItemStates.SelectedはStateから判断できるんでそれのみ対応しました。

ListViewItemStatesのSelectedとShowKeyboardCues以外の値はいつどこでだれが返してくれるんだろうなぁ、と思う仲春のこの頃です。

[ メッセージ編集済み 編集者: 未記 編集日時 2009-03-24 00:49 ]
1

スキルアップ/キャリアアップ(JOB@IT)