1

レポートビューに複数のCListCtrlを含むダイアログボックスがあるMFCアプリケーションをコーディングしています。そのうちの1つを並べ替え可能にします。だから私はHDM_ITEMCLICKイベントを処理し、すべてがうまく機能します..別のCListCtrlのヘッダーをクリックすると、他のCListCtrlがソートされることを除いて、それはちょっとばかげているように見えます。

これは明らかに、ヘッダーのIDが0であるため、メッセージマップのエントリは次のようになります。

ON_NOTIFY(HDN_ITEMCLICK, 0, &Ccreationprogramme::OnHdnItemclickList5)

しかし、すべてのヘッダーのIDがゼロであるため、ダイアログのすべてのヘッダーがメッセージを送信しているようです。

この問題を回避する簡単な方法はありますか?

編集:たぶん私は明確ではありませんでしたが、NMHDR構造内の値を確認しました。HwndFromポインターは、クリックされたヘッダーによって異なりますが、実行ごとに値が明らかに異なるため、あまり役に立ちません。idFrom値は0です。これは、上記で説明した理由により、すべてのヘッダーのIDであるためです。ありがとう

EDIT2:hwndポインターの値もCListCtrlに対応していません。これは、おそらく完全に別のオブジェクトからのものであるためです。

4

3 に答える 3

3

NMHDR構造の値を確認してください。
http://msdn.microsoft.com/en-us/library/bb775514%28VS.85%29.aspx

于 2010-04-08T16:11:48.673 に答える
3

解決策を見つけました。少し汚れていますが、機能するので、後で参照できるように投稿します。

ヘッダーは、CListCtrlのGetHeaderCtrlメンバー関数を介して取得できます。次に、m_hWndを介してハンドラーを取得できます。したがって、そのハンドラーがNMHDR構造体のハンドラーと同じであるかどうかをテストするだけで、コードは次のようになります。

void Ccreationprogramme::OnHdnItemclickList5(NMHDR *pNMHDR, LRESULT *pResult)
{  
  if (pNMHDR->hwndFrom == LC_gen_schedules.GetHeaderCtrl()->mhWnd)
  {
    // Code goes here
  }
    *pResult = 0;
}

助けてくれてありがとう

于 2010-04-08T16:55:49.287 に答える
2

LPARAMメッセージハンドラーに渡されるのは、実際には構造体へのポインターです。構造NMHEADER体には、メッセージを送信したコントロールのコントロールIDがNMHDR含まれています。HWNDこれをリストコントロールと比較して、HWNDクリックされたウィンドウのヘッダーコントロールを判別できる場合があります。

または、CListCtrlからクラスを派生させ、HDN_ITEMCLICKメッセージをリストコントロールに反映することもできます。このようにして、各リストコントロールオブジェクトは独自のヘッダーの通知を処理します。

于 2010-04-08T16:10:11.247 に答える