2013-10-01 39 views
1

我已經創建了一個自定義控件作爲CWnd的派生類,用於從一個範圍中選擇一個子範圍。爲了測試,我在Visual Studio 2010中創建了一個MFC對話框應用程序,其中包含自定義類的成員實例和一些成員實例,以顯示自定義控件中當前選定的範圍。如何通知父CDialog子CWnd已更新,以便另一個子控件可以更新作爲響應?

在自定義類,我有:

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消息,但是當我在孩子OnParentNotify()添加消息處理程序WM_LBUTTONUP,並檢查他們,他們被稱爲孩子,但從未傳播到父(這是真的,即使我在CWnd::OnLButtonDown(nFlags, point)註釋掉CWnd::OnLButtonDown電話。

+0

在進一步的研究中,我意識到'OnParentNotify'僅在響應有限的不包含'WM_LBUTTONUP'的消息子集時被調用。請參閱http://msdn.microsoft.com/en-us/library/5fcz9fdd%28v=vs.100%29.aspx。 –

回答

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和喜歡的任何參數。我已經在上面顯示PostMessage,它將消息放入隊列並返回,所以處理將被延遲到控制函數返回到消息泵之後。您也可以使用SendMessage:該消息將在SendMessage呼叫期間處理。

+0

這肯定會工作,但不知何故它感覺錯了。對於所提出的問題,是不是會有事實上的標準方法(對話上的相互依賴的控制)?只是沉思... –

+0

我最終解決了類似的方法,除了我用'NM_CLICK'而不是自定義通知消息,並使用'SendNotifyMessage'而不是'PostMessage' –

1

建議的答案肯定會起作用。但是,如果您確實想要控制自定義控件的更新,則只需將指針(並將其保存到成員變量)傳遞給您想要從自定義控件更新的對話框控件。你可以通過自定義控件的方法來實現,或者當它被實例化時。

相關問題