CListCtrl::DrawItem()での一番上のリストアイテムの描画位置が少し下にずれるというバグに対するスレ

悩み中。ぐぐったら同じ悩みがキャッシュにしか残ってなかったので復刻メモ。

[mfc 38519] CListCtrl::DrawItem()でのバグ
2002.03.07
いつも大変お世話になっております。
CListCtrlの派生クラスCListCtrlExを作ってオーナー描画を行っています。

このクラスでごくたまになんですが、一番上のリストアイテムの描画位置が
少し下にずれるというバグが発生します。
直接の原因はDrawItem()でlpDrawItemStruct->rcItemのtopに正常時より大き
い値が入ってくることで、そのためにヘッダーとアイテムの間に何もない
白いスペースができてしまいます。

それでこれ以上、どうやって原因をさぐっていけばいいのか分からず途方に
くれています。何かいい調査方法があれば助言いただけないでしょうか。


void CAHReportCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
  CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  CRect rcItem(lpDrawItemStruct->rcItem);
  int nItem = lpDrawItemStruct->itemID;
      :
      :
}

[mfc 38532] Re: CListCtrl::DrawItem()でのバグ
> このクラスでごくたまになんですが、一番上のリストアイテムの描画位置が
> 少し下にずれるというバグが発生します。

このような場合、これと同じ現象に遭遇した人でないと答えにくいね。

> それでこれ以上、どうやって原因をさぐっていけばいいのか分からず途方に
> くれています。何かいい調査方法があれば助言いただけないでしょうか。

「たまに」ってことは、再現条件を特定できていないのですよね?
わたしなら、その再現性を探します。どのような場合に発生するのかがわかれば、
対処の方法も、あるいは問題となる部分がわかる可能性があります。
また、サンプルコードなど自分以外の人が作ったコードで同種の問題が発生する
のかをチェックするのも良くやります。
とりあえずこんなところかなあ。
------------------------------------------------------------
all the time with a smile
いつも笑顔で ahirugao がー >^

[mfc 38571] Re: CListCtrl::DrawItem()でのバグ
> このクラスでごくたまになんですが、一番上のリストアイテムの描画位置が
> 少し下にずれるというバグが発生します。

関係ないかもしれませんが...
便乗質問です。

ごく最近、同じような現象に出くわしました。
途中でItemの高さを変更できる仕様で、以下の時に起こりました。
(起こらない時もある)
 1.縦スクロールバーが表示されている
 2.高さ(小)→高さ(大)に切り替えた時

Itemの高さを設定する方法は、ImageListを2種類用意しておき
    m_BigImageList.Create( 80, 60, TRUE, 1, 1);
    m_SmallImageList.Create( 40, 30, TRUE, 1, 1);

メニュー選択により、m_SmallImageListを設定されているListCtrlに、
m_BigImageListを設定し直しました
    m_ListCtrl.SetImageList( &m_BigImageList, LVSIL_SMALL );

5回に2回位は、この現象が起こり
再表示が必要なのではないかと色々試行錯誤しましたが、
直りませんでした。
結局、Listから全Itemを削除し、再度全てInsertする事により
起こらなくなりました。

もともとこのようなやり方がまずいのか
また、もっと他にスマートな方法があれば
ご教授願います。

以上