<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;
}