リストビューに三角マークを付けるには?

解決


コマッタ王子  2007-06-10 18:18:54  No: 65364

Visual Studio 2005 +SP1, VC++, MFC, SDIアプリです。
子供のダイアログにリストビューを表示しています。
コラムをクリックしてソートしたときに、昇順・降順の三角マークを付けたくて、次のコードを書きました。

void CDialog1::OnLvnColumnclickMyListView(NMHDR *pNMHDR, LRESULT *pResult)
{
    CHeaderCtrl* phdrCtrl;
    phdrCtrl = m_myListView.GetHeaderCtrl();
    HDITEM hdrItem;
    phdrCtrl->GetItem(0, &hdrItem);
    if (m_bUpward == FALSE)
        hdrItem.fmt = hdrItem.fmt ^ HDF_SORTUP | HDF_SORTDOWN;
    else
        hdrItem.fmt = hdrItem.fmt ^ HDF_SORTDOWN | HDF_SORTUP;
    phdrCtrl->SetItem(0, &hdrItem);
}

「debug」でビルトすると、三角マークがちゃんと付きますが、「release」でビルトすると、三角マークが付きません。
debug と release のプロジェクトプロパティに相違はありません。
上記のコードに不備があるのでしょうか?
どなたか、お気づきのことがあったら教えてください。お願いします。


瀬戸っぷ  2007-06-10 19:04:15  No: 65365

hdrItemの中身、初期化していないようですが?
memset(またはZeroMemory)で0クリアした上で、
hdrItem.maskを適切に設定してみては?

debugだとmaskメンバは0xccccccccに初期化されているかと思われます。
fmtメンバを有効とするHDI_FORMATビットが設定された状態になりますから、
debugビルドで成功したのでしょう。
releaseでは不定値となりますから……


コマッタ  2007-06-10 20:03:26  No: 65366

debug と release に、そんな違いがあるとは知りませんでした。

::ZeroMemory(&hdrItem, sizeof(HDITEM));
hdrItem.mask = HDI_FORMAT;

上の2行を追加したら、release ビルドでも見事に三角マークが付きました。
早速のご教授ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加