簡體   English   中英

如何通知父CDialog已更新子CWnd,以便另一個子控件可以響應更新?

[英]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::OnLButtonDownCWnd::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)
{

}

wParamlParam傳遞您喜歡的任何參數。 我已經在上面顯示了PostMessage ,它將消息放入隊列並返回,因此處理將被延遲,直到您的控制功能返回到消息泵。 您還可以使用SendMessage :在SendMessage調用期間將處理該消息。

建議的答案肯定會奏效。 但是,如果您真的想要從自定義控件控制更新,那么您需要做的就是將指針(並將其保存到成員變量)傳遞給您想要從自定義控件更新的對話框控件。 您可以通過自定義控件的方法執行此操作,或者在實例化時執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM