先说程序结构。。控件的类为CXXCtrl(alt生成的)CXXCtrl里创建了若干个CAxWinCAxWin是我写的,继承自CWindowImplCAxWin里又创建了一个CAxWindow(就是内嵌的控件)
(为啥不在CXXCtrl里创建若干个CAxWindow对象,答:要在CAxWin里显示其他东西)简单的的说,问题就是:如何在CWindowImpl里处理来自CAxWindow(控件)的事件下面是我的方法
首先给CAxWin加个父类
IDispEventImpl<100, CAxWin>
然后
BEGIN_SINK_MAP(CAxWin)
SINK_ENTRY(100, 1, OnXXX)
END_SINK_MAP()HRESULT __stdcall OnXXX();
控件的创建过程
CAxWindow.Create(m_hWnd, NULL, L"内嵌控件", WS_CHILD | WS_VISIBLE);
CAxWindow.SetDlgCtrlID(100);
现在内嵌控件可以正常显示,就是收不到事件

解决方案 »

  1.   

    悲剧
    STDMETHOD(Invoke)(DISPID dispidMember, REFIID /*riid*/,
    LCID lcid, WORD /*wFlags*/, DISPPARAMS* pdispparams, VARIANT* pvarResult,
    EXCEPINFO* /*pexcepinfo*/, UINT* /*puArgErr*/)
    {
    const _ATL_EVENT_ENTRY<T>* pMap = T::_GetSinkMap();
    const _ATL_EVENT_ENTRY<T>* pFound = NULL;
    while (pMap->piid != NULL)
    {
    if ((pMap->nControlID == nID) && (pMap->dispid == dispidMember) && 
    (IsEqualIID(*(pMap->piid), *pdiid)))
    {
    pFound = pMap;
    break;
    }
    pMap++;
    }
    if (pFound == NULL)
    return S_OK;
    _ATL_FUNC_INFO info;
    _ATL_FUNC_INFO* pInfo;
    if (pFound->pInfo != NULL)
    pInfo = pFound->pInfo;
    else
    {
    pInfo = &info;
    HRESULT hr = GetFuncInfoFromId(*pdiid, dispidMember, lcid, info);
    if (FAILED(hr))
    return S_OK;
    }
    return InvokeFromFuncInfo(pFound->pfn, *pInfo, pdispparams, pvarResult);
    }根本没 运行到。。
      

  2.   

    CAxWindow是否支持对外发送事件??
      

  3.   

    结果我孜孜不倦的百度,终于找到解决的方法了 CAxWindow.Create(m_hWnd, NULL, L"ff.ff", WS_CHILD | WS_VISIBLE);
    if(CAxWindow.IsWindow())
    {
    CAxWindow.QueryControl(IID_aaa, (void**)&m_xxx); // 确保COM对象对应的pUnk实现IProvideClassInfo2或是IPersist*
    // 当IDispEventImpl以两个参数形式被继承时,调用这个方法提取关于源类型库的信息
    AtlGetObjectSourceInterface( m_xxx, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum );
    DispEventAdvise(m_xxx, &m_iid);
    }