我创建了一个自定义控件作为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)
来电也是如此。
答案 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)
{
}
在wParam
和lParam
中传递您喜欢的所有参数。我在上面显示了PostMessage
,它将消息放入队列并返回,因此处理将被延迟,直到您的控制功能返回到消息泵。您还可以使用SendMessage
:邮件将在SendMessage
来电期间处理。
答案 1 :(得分:1)
建议的答案肯定会奏效。但是,如果您真的想要从自定义控件控制更新,那么您需要做的就是将指针(并将其保存到成员变量)传递给您想要从自定义控件更新的对话框控件。您可以通过自定义控件的方法执行此操作,或者在实例化时执行此操作。