- PR -

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

1
投稿者投稿内容
firementhol
会議室デビュー日: 2008/10/30
投稿数: 2
投稿日時: 2008-10-30 21:37
ListViewをオーナドローし(LargeItem表示)、アイコンやラベルを描画していますが、文字列をDrawStringで描画した場合に、ラベル表示領域に収まりきらない現象が発生します。下記のようなコードです。

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内に文字列が収まらない場合がある!
}

この原因及び対処方法について何かお分かりの方がいましたら、情報を下さい。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2008-10-31 10:08
こんにちわ。

引用:

文字列をDrawStringで描画した場合に、ラベル表示領域に収まりきらない現象が発生します。



こちらですが、ListViewオーナードロー時の問題というよりは、仕様が不明瞭であると・・・
OwnerDrawしないケースで確認いただければわかると思いますが、
未選択状態でのラベル表示領域はListViewItemのText文字列の文字数に完全には依存していません。
(文字数が少ない場合には依存していますが、文字数が多い場合に、その文字数にしたがって、WidthやHeightが増えることはありません。)

そのため、OwnerDrawしないときにはListViewItemのText文字列がラベル表示領域を超える場合、
[aaaaaa…]
というように、3点リーダーを末尾につけています。
(これがOwnerDrawしないときのListViewの表示仕様です。)

ListView上にどのように表示するのか、これを仕様として明確にし、実装すればよいのではないでしょうか。
ひとつの案が、OwnerDrawしないときと同様に表現するということであると思います。

以上、参考になれば幸いです。

※おそらく実行時に項目を選択状態にしているときは、文字列すべてが
 表示されていると思います。


[ メッセージ編集済み 編集者: Toshi 編集日時 2008-10-31 10:21 ]
firementhol
会議室デビュー日: 2008/10/30
投稿数: 2
投稿日時: 2008-10-31 15:01
Toshi様

ご回答ありがとうございます。

文字列は全て表示する仕様です。

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

DrawItemイベントで与えられるe.Boundsはどのようにして決定されているのでしょうか?
1

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