如何通知父CDialog已更新子CWnd,以便另一个子控件可以响应更新?

时间:2013-10-01 20:39:14

标签: c++ visual-studio-2010 mfc

我创建了一个自定义控件作为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已被调用以响应左键单击,因此只需点击一下,这些值就会全部落后

如何在OnParentNotify完成孩子后调用父母中的OnLButtonDown或其他方法?或者有另一种方法可以实现我想要的目标吗?

我已经尝试让父母回复WM_LBUTTONUP消息,但是当我在孩子中为WM_LBUTTONUP添加消息处理程序并在OnParentNotify()中检查它们时,他们会在孩子中调用但从不传播给父母(即使我在CWnd::OnLButtonDown中注释掉CWnd::OnLButtonDown(nFlags, point)来电也是如此。

2 个答案:

答案 0 :(得分:2)

您可以制作自己的自定义消息,并使用它来通知父窗口您想要的任何内容。

#define UWM_RANGE_CHANGE (WM_APP + 2) // a custom Windows message

GetParent()->PostMessage(UWM_RANGE_CHANGE, wParam, lParam);

To process the message the parent's message map needs:

ON_MESSAGE(UWM_RANGE_CHANGE, OnRangeChange)

and the message handler function must have this signature:

LRESULT Cxx:OnRangeChange(WPARAM w, LPARAM l)
{

}

wParamlParam中传递您喜欢的所有参数。我在上面显示了PostMessage,它将消息放入队列并返回,因此处理将被延迟,直到您的控制功能返回到消息泵。您还可以使用SendMessage:邮件将在SendMessage来电期间处理。

答案 1 :(得分:1)

建议的答案肯定会奏效。但是,如果您真的想要从自定义控件控制更新,那么您需要做的就是将指针(并将其保存到成员变量)传递给您想要从自定义控件更新的对话框控件。您可以通过自定义控件的方法执行此操作,或者在实例化时执行此操作。