1

CWnd範囲からサブ範囲を選択する派生クラスとしてカスタム コントロールを作成しました。テストするために、Visual Studio 2010 で MFC ダイアログ アプリケーションを作成し、カスタム クラスのメンバー インスタンスといくつかのメンバーCEditインスタンスを使用して、カスタム コントロールから現在選択されている範囲を表示しました。

カスタムクラスには、次のものがあります。

BEGIN_MESSAGE_MAP(CRangeSelectorCtrl, CWnd)
  ...
  ON_WM_LBUTTONDOWN()
  ...
END_MESSAGE_MAP()

...

void CRangeSelectorCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
  if (leftScrollArrowRect().PtInRect(point))
  {
    d_range_selector.SlideBar(-1);
    Invalidate();
  }
  else if (rightScrollArrowRect().PtInRect(point))
  {
    d_range_selector.SlideBar(1);
    Invalidate();
  }
  CWnd::OnLButtonDown(nFlags, point);
}

私のテストダイアログアプリには、次のものがあります。

BEGIN_MESSAGE_MAP(CTestRangeSelectorCtrlDlg, CDialogEx)
  ...
  ON_WM_PARENTNOTIFY()
  ...
END_MESSAGE_MAP()
...
BOOL CTestRangeSelectorCtrlDlg::OnInitDialog()
{
  CDialogEx::OnInitDialog();
  ...
  m_range_selector_ctrl.ModifyStyleEx(WS_EX_NOPARENTNOTIFY, 0);
   ...
}
...
void CTestRangeSelectorCtrlDlg::OnParentNotify(UINT message, LPARAM lParam)
{
  CDialogEx::OnParentNotify(message, lParam);
  if (message == WM_LBUTTONDOWN)
  {
    updateEditBoxes();
  } 
}

これはほとんど機能しますが、問題はOnParentNotify、左クリックに応答して子が更新される前にダイアログの get が呼び出されるため、値がすべてワンクリックで遅れることです。

OnParentNotify子の終了後に親の別のメソッドを呼び出すにはどうすればよいOnLButtonDownですか? または、私が望むことを達成する別の方法はありますか?

親にメッセージに応答させようとしましたが、子WM_LBUTTONUPにメッセージハンドラーを追加WM_LBUTTONUPしてチェックインすると、それらは子で呼び出されますが、親には伝達されません (これは、呼び出しOnParentNotify()をコメントアウトした場合でも当てはまります.CWnd::OnLButtonDownCWnd::OnLButtonDown(nFlags, point)

4

2 に答える 2

1

提案された答えは確かにうまくいくでしょう。ただし、カスタム コントロールからの更新を本当に制御したい場合は、カスタム コントロールから更新するダイアログ コントロールにポインターを渡す (そしてそれをメンバー変数に保存する) だけです。これは、カスタム コントロールのメソッドを通じて、またはインスタンス化されたときに行うことができます。

于 2013-10-02T12:52:10.367 に答える