[英]How to notify a parent CDialog that a child CWnd has been updated so that another child control can update in response?
我已經創建了一個自定義控件作為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
會被調用,因此只需點擊一下就可以看到值。
在OnLButtonDown
完成后,如何在父級中調用OnParentNotify
或其他方法? 還是有另一種方法來實現我想要的東西?
我已經嘗試讓父級響應WM_LBUTTONUP
消息但是當我在子級中為WM_LBUTTONUP
添加消息處理程序並在OnParentNotify()
檢查它們時,它們在子級中被調用但從未傳播到父級(即使我注釋掉也是如此) CWnd::OnLButtonDown
的CWnd::OnLButtonDown
調用CWnd::OnLButtonDown(nFlags, point)
。
您可以制作自己的自定義消息,並使用它來通知父窗口您想要的任何內容。
#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
調用期間將處理該消息。
建議的答案肯定會奏效。 但是,如果您真的想要從自定義控件控制更新,那么您需要做的就是將指針(並將其保存到成員變量)傳遞給您想要從自定義控件更新的對話框控件。 您可以通過自定義控件的方法執行此操作,或者在實例化時執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.