描述:
在ATL中除了创建自己的窗口接收消息以外,还有什么方法可以接收消息
解决方案1:
search DispSink in msdn
1. in header file
class ATL_NO_VTABLE CDispCtl :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IDispCtl, &IID_IDispCtl, &LIBID_DISPCLIENTLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public CComControl<CDispCtl>,
public IPersistStreamInitImpl<CDispCtl>,
public IOleControlImpl<CDispCtl>,
public IOleObjectImpl<CDispCtl>,
public IOleInPlaceActiveObjectImpl<CDispCtl>,
public IViewObjectExImpl<CDispCtl>,
public IOleInPlaceObjectWindowlessImpl<CDispCtl>,
public IPersistStorageImpl<CDispCtl>,
public ISpecifyPropertyPagesImpl<CDispCtl>,
public IQuickActivateImpl<CDispCtl>,
public IDataObjectImpl<CDispCtl>,
public IProvideClassInfo2Impl<&CLSID_DispCtl, NULL, &LIBID_DISPCLIENTLib>,
public CComCoClass<CDispCtl, &CLSID_DispCtl>,
public IDispEventImpl<1, CDispCtl, &DIID__IDispServEvents>
{
......................................
//Map used to sink events.
BEGIN_SINK_MAP(CDispCtl)
SINK_ENTRY_EX(1, DIID__IDispServEvents, 1, OnTransmit)
END_SINK_MAP()
};
2. in .cpp file
STDMETHODIMP CDispCtl::OnTransmit(VARIANT data)
{
if(data.vt == VT_BSTR)
{
VariantClear(&m_OutText);
VariantCopy(&m_OutText, &data);
}
FireViewChange();
return S_OK;
}
You will receive notification from interface whose IID is DIID__IDispServEvents
Refer to IDispEventImpl
解决方案3:看看发送消息的函数SendMessage,第一个参数就是窗体句柄
解决方案4: 消息都是通过窗体句柄传递的阿
如果你想自己传递可以通过回调函数