先说程序结构。。控件的类为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);
现在内嵌控件可以正常显示,就是收不到事件
(为啥不在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);
现在内嵌控件可以正常显示,就是收不到事件
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);
}根本没 运行到。。
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);
}