いつもお世話になっております。
プログラム起動時にListView(REPORT) に表示しているアイテムを
昇順にソートして表示しようとしています。
リストビューのソート処理は作成済みなので、OnInitialUpdate()のあとに
OnColumnclick を呼び出す関数(0番目のカラムをクリックしたのと同等の処理)を
作ってみたのですがうまく動いてくれません。
現象ですが、Dedugモードではうまく動作します(0番目のカラムをクリックした
のと同じ動き)。ですが、Releaseモードでは1番目のカラムをクリックした動きに
なってしまいます。
メンバ変数にフラグ(オン/オフ と サブアイテムのインデックスを渡す)を立てて
OnColumnclick内 で判定するようにすれば見た目同じ動作のものは作れるのですが、
どこが悪いのかわからないままにするのは気持ちが悪いので、悪いところがあれば
教えていただけないでしょうか?
ほかに定石のようなものがあれば、教えていただきたいです。
以下は環境とソースの抜粋です。
よろしくお願いいたします。
// 環境 //////////////////
OS Win2000 SP4
VC++6.0
MFC SDI(ListView)
/////////////////////////
// プログラムから OnColumnclick を呼び出す /////////////////////////////////////////
static NMHDR sNMHDR;
NMHDR* psNMHDR;
NM_LISTVIEW* psNMListView;
NM_LISTVIEW sNMListView;
static LRESULT lResult;
CListCtrl& lvc = GetListCtrl();
// ゼロクリアしてるので pNMListView->iSubItem も 0になるはず・・・
ZeroMemory(&sNMListView, sizeof(sNMListView));
psNMListView = &sNMListView;
psNMHDR = (NMHDR*)psNMListView;
sNMHDR = *psNMHDR;
sNMHDR.hwndFrom = lvc; // メッセージを送信したコントロールのウィンドウハンドル
// idFrom に何を設定するかわからない GetHeaderCtrl() の値とも違うみたい
sNMHDR.idFrom = 0; // メッセージを送信したコントロールのID
sNMHDR.code = NM_CLICK; // 通知コード
OnColumnclick(&sNMHDR, &lResult); // カラムがクリックされたときの処理
//////////////////////////////////////////////////////////////////////////////
// カラムがクリックされたときの処理
void CFTPPlannerView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
////////////////////////////////////////////////////////////////////////
int nSubIndex;
CString strWork;
nSubIndex = pNMListView->iSubItem;
strWork.Format(%s : %d, nSubIndex, nSubIndex);
MessageBox(strWork, ソートするサブアイテム, MB_OK | MB_ICONINFORMATION);
・
・
・
・
> OnColumnclick(&sNMHDR, &lResult); // カラムがクリックされたときの処理
ここで渡しているのは、NMHDR構造体のポインタです。
> void CFTPPlannerView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
> {
> NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
それここちらで、NM_LISTVIEW構造体のポインタにキャストしても
うまく行きません。
ふぁいと!さんがやっているのは、
NM_LISTVIEWとNMHDRの二つの構造体を用意し、
それぞれ初期化しておきながら、NM_LISTVIEWは使わずにNMHDRだけを渡す。
という処理。
実際にやらなければいけないのは、
NM_LISTVIEWだけ用意し、NM_LISTVIEWのポインタをNMHDR*にキャストして渡す。
(NMHDRにセットすべき情報は、NM_LISTVIEW.hdrにセットする)
という処理です。
dairygoodsさんどうもありがとうございます。
NM_LISTVIEW.hdr.・・・とNM_LISTVIEW.iSubItem に値をセットして
渡してやれば期待する動作になりました。
これで OnColumnclick の中をいじらずに呼び出し側の設定だけで好きな
項目をキーにソートできます。
ご親切に教えていただきありがとうございました。