<Slider name="alpha_controlor" min="20" max="255" value="255"/>
CSliderUI* pSilder = static_cast<CSliderUI*>(m_pm.FindControl(_T("alpha_controlor")));
if( pSilder ) pSilder->OnNotify += MakeDelegate(this, &CFrameWindowWnd::OnAlphaChanged);
CEventSource OnNotify;
template <class O, class T>
CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(void*))
{
return CDelegate<O, T>(pObject, pFn);
}
void CEventSource::operator+= (CDelegateBase& d)
{
for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
if( pObject && pObject->Equals(d) ) return;
}
m_aDelegates.Add(d.Copy());
}
case WM_LBUTTONDOWN:
{
pControl->SetFocus();
SendNotify(m_pFocus, _T("setfocus"));
Msg.pSender->OnNotify(&Msg);
bool CDelegateBase::operator() (void* param)
{
return Invoke(param);
virtual bool Invoke(void* param)
{
O* pObject = (O*) GetObject();
return (pObject->*m_pFn)(param);
}
bool OnAlphaChanged(void* param)
{
TNotifyUI* pMsg = (TNotifyUI*)param;
if( pMsg->sType == _T("valuechanged") )
m_pm.SetTransparent((static_cast<CSliderUI*>(pMsg->pSender))->GetValue());
return true;
}
}
/////////////////////////////////////////////////////////////////////////////////////
更简单的测试
CEventSource OnNotify;
OnNotify += MakeDelegate(this, &CTestDelegateDlg::Test);
template <class O, class T>
CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(void*))
{
return CDelegate<O, T>(pObject, pFn);
}
void CEventSource::operator+= (CDelegateBase& d) {
for( int i = 0; i < m_aDelegates.GetSize(); i++ )
{
CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
if( pObject && pObject->Equals(d) ) return;
}
m_aDelegates.Add(d.Copy()); }
//
OnNotify(this);
bool CEventSource::operator() (void* param)
{
for( int i = 0; i < m_aDelegates.GetSize(); i++ )
{
CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
if( pObject && !(*pObject)(param) ) return false;
}
return true;
}
// 结果 MessageBox被触发
bool CTestDelegateDlg::Test(void* p)
{
::MessageBox(0,0,0,0);
return 0;
}