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::OnLButtonDown
CWnd::OnLButtonDown(nFlags, point)