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();
  } 
}

这几乎可行,但问题是对话框的OnParentNotifyget 是在子级响应左键单击更新之前调用的,因此所有值都在一次单击之后。

在孩子完成后,如何OnParentNotify在父母中调用或调用其他方法OnLButtonDown?还是有另一种方法来完成我想要的?

我尝试让父级响应WM_LBUTTONUP消息,但是当我在子级中添加消息处理程序WM_LBUTTONUP并检查它们时,它们在子级中被调用OnParentNotify()但从不传播给父级(即使我注释掉.CWnd::OnLButtonDownCWnd::OnLButtonDown(nFlags, point)

4

2 回答 2

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)
{

}

wParam在和中传递您喜欢的任何参数lParam。我已经在PostMessage上面展示了,它将消息放入队列并返回,因此处理将延迟到您的控制函数返回到消息泵之后。您还可以使用SendMessage:消息将在SendMessage通话期间进行处理。

于 2013-10-02T02:38:12.467 回答
1

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

于 2013-10-02T12:52:10.367 回答