none
ListViewオーナドロー時の問題について RRS feed

  • 質問

  • ListView(LargeItem表示)に、条件によって無効化した画像やテキストを表示させるためにオーナードローを使用しています。
    DrawItemイベントハンドラ内でラベルを描画していますが、文字列をDrawStringで描画した場合に、ラベル表示領域に収まりきらない現象が発生します。
    画面のDPI設定を通常サイズ(96DPI)以外に設定した場合などに発生しています。

    この現象によって、アイコン画像とラベルテキストが重なった表示となってしまいます。

    下記のようなコードです。

    private void listView_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
    ListViewItem item = (ListViewItem)e.Item;

    // ラベル表示領域の取得
    Rectangle labelRec = item.GetBounds(ItemBoundsPortion.Label);

    // 文字列の描画
    StringFormat sf = new StringFormat();
    sf.Alignment = StringAlignment.Center;
    e.Graphics.DrawString(item.Text, item.Font, Brushes.Black, labelRec, sf); // labelRec内に文字列が収まらない場合がある!
    }

    ListViewItemのTextへある文字列を設定した場合に、
    DrawItemイベントにて描画領域がe.Boundsにて与えられますが、
    このサイズは文字列が長ければ複数行分のラベル表示領域を含んだRegionとなっています。
    このRegion内のラベル表示領域矩形を取得し、その中に文字列をDrawStringで表示したいのですが、
    矩形内に収まらない場合があります。


    この原因及び対処方法について何かお分かりの方がいましたら、情報を下さい。
    2008年12月2日 7:29

回答

すべての返信