我已經創建了一個自定義控件作爲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
電話。
在進一步的研究中,我意識到'OnParentNotify'僅在響應有限的不包含'WM_LBUTTONUP'的消息子集時被調用。請參閱http://msdn.microsoft.com/en-us/library/5fcz9fdd%28v=vs.100%29.aspx。 –