C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 仮想ListViewで独自描画


(過去ログ 80 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■47325 / inTopicNo.1)  仮想ListViewで独自描画
  
□投稿者/ Crowe (4回)-(2010/02/25(Thu) 23:05:03)

分類:[C#] 

仮想ListViewを作成してアイテムの表示をしています。(件数が多いので
その各アイテム上に独自に描画を行いたいのですがうまくいきません。
(大きなアイコン、アイコン上に描画)

RetrieveVirtualItemイベントが発生した時に描画を行おうとすると
描画によってRetrieveVirtualItemイベントが発生→無限ループとなるようです。

private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
    e.Item = this.ListViewItems[e.ItemIndex];
    // 描画処理〜
}


そこでWndProcからWM_PAINTを拾い描画を行おうとしました。

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0xF)	//WM_PAINT
    {
        this.OnPaint(new PaintEventArgs(this.CreateGraphics(),this.Bounds));
    }
    base.WndProc(ref m);
}
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    for (int i = 0; i < this.Items.Count; i++)
    {
        // 各アイテムに描画
    }
}

とすると今度は無限ループは発生せず、描画も行われます。
しかしRetrieveVirtualItemイベントが発生したアイテムについては上書きされるようで描画されません。
またスクロールさせて一度に表示する項目が増えた場合や画面切り替えでもうまく描画できないようです。
(せっかく仮想にしたのに重くなるし・・・)
ダメもとでSelectedIndexChangedイベントの時に描画しても予想通り上書きされます。

なにかいいアイデアはありませんでしょうか。

引用返信 編集キー/
■47326 / inTopicNo.2)  Re[1]: 仮想ListViewで独自描画
□投稿者/ 渋木宏明(ひどり) (1285回)-(2010/02/25(Thu) 23:31:51)
渋木宏明(ひどり) さんの Web サイト
> RetrieveVirtualItemイベントが発生した時に描画を行おうとすると

そのタイミングで描画を行うべきではありません。

> そこでWndProcからWM_PAINTを拾い描画を行おうとしました。

ListView には、オーナードローを支援するプロパティやイベントが実装されているので、それを使うべきだと思います。

引用返信 編集キー/
■47327 / inTopicNo.3)  Re[2]: 仮想ListViewで独自描画
□投稿者/ Crowe (5回)-(2010/02/25(Thu) 23:56:19)
No47326 (渋木宏明(ひどり) さん) に返信

どこかでTreeView や ListViewはオーナードローできないという記事を
見かけて諦めかけていました。早とちりしたようで勝手に泥沼に。

ListView.OwnerDraw
ListView.DrawColumnHeader
ListView.DrawItem
ListView.DrawSubItem

を使用すればいけるようですね。
渋木宏明(ひどり) さんありがとうございました。


>>RetrieveVirtualItemイベントが発生した時に描画を行おうとすると
>
> そのタイミングで描画を行うべきではありません。
>
>>そこでWndProcからWM_PAINTを拾い描画を行おうとしました。
>
> ListView には、オーナードローを支援するプロパティやイベントが実装されているので、それを使うべきだと思います。
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -