在ATL中能像MFC中一样用PostMessage来响应消息函数吗?
先不说怎样添加消息映射,我在ATL中程序运行到这个函数就出错
问题是怎样在ATL中发出一个消息,然后怎样添加消息映射

解决方案 »

  1.   

    标准ATL没有msg map的概念,如果是做ActiveX,可以msg给window,ATL提供BEGIN_MESSAGE_MAP一类的宏。
      

  2.   

    ATL COM组件中你要自几创建个窗口
    来进行消息循环,ATL中有CWindow类
    用PostMessage即可
      

  3.   

    如果你的ATL class由CWindowImpl派生的话就可以,否则自己创建一个窗口,向那个窗口发消息。
      

  4.   

    我的ATL不需要创建窗口阿
    在接口的实现类中的头文件中有如下的定义
    class ATL_NO_VTABLE CMICCard 
    {
    public:
    BEGIN_MSG_MAP(CMICCard)
    CHAIN_MSG_MAP(CComControl<CMICCard>)
    DEFAULT_REFLECTION_HANDLER()
    // MESSAGE_HANDLER(WM_POSTMESSAGE,OnPostMessage)
    END_MSG_MAP()
    }
    是否说明不用创建窗口也能进行消息响应?
      

  5.   

    class ATL_NO_VTABLE CZa : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IZa, &IID_IZa, &LIBID_TESTV2Lib>,
    public CComControl<CZa>,
    public IPersistStreamInitImpl<CZa>,
    public IOleControlImpl<CZa>,
    public IOleObjectImpl<CZa>,
    public IOleInPlaceActiveObjectImpl<CZa>,
    public IViewObjectExImpl<CZa>,
    public IOleInPlaceObjectWindowlessImpl<CZa>,
    public IPersistStorageImpl<CZa>,
    public ISpecifyPropertyPagesImpl<CZa>,
    public IQuickActivateImpl<CZa>,
    public IDataObjectImpl<CZa>,
    public IProvideClassInfo2Impl<&CLSID_Za, NULL, &LIBID_TESTV2Lib>,
    public CComCoClass<CZa, &CLSID_Za>
    {
    public:
    CZa()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_ZA)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CZa)
    COM_INTERFACE_ENTRY(IZa)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IViewObjectEx)
    COM_INTERFACE_ENTRY(IViewObject2)
    COM_INTERFACE_ENTRY(IViewObject)
    COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceObject)
    COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
    COM_INTERFACE_ENTRY(IOleControl)
    COM_INTERFACE_ENTRY(IOleObject)
    COM_INTERFACE_ENTRY(IPersistStreamInit)
    COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
    COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
    COM_INTERFACE_ENTRY(IQuickActivate)
    COM_INTERFACE_ENTRY(IPersistStorage)
    COM_INTERFACE_ENTRY(IDataObject)
    COM_INTERFACE_ENTRY(IProvideClassInfo)
    COM_INTERFACE_ENTRY(IProvideClassInfo2)
    END_COM_MAP()BEGIN_PROP_MAP(CZa)
    PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
    PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
    // Example entries
    // PROP_ENTRY("Property Description", dispid, clsid)
    // PROP_PAGE(CLSID_StockColorPage)
    END_PROP_MAP()#define WM_SELFTMSG  WM_USER+100
    BEGIN_MSG_MAP(CZa)
    CHAIN_MSG_MAP(CComControl<CZa>)
    DEFAULT_REFLECTION_HANDLER()
    MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk)
    MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
    MESSAGE_HANDLER(WM_SELFTMSG, OnSelfDown)
    END_MSG_MAP()
    // Handler prototypes:
    //  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    //  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
    //  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);// IViewObjectEx
    DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)// IZa
    public: HRESULT OnDraw(ATL_DRAWINFO& di)
    {
    RECT& rc = *(RECT*)di.prcBounds;
    Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
    LPCTSTR pszText = _T("ATL 3.0 : Za");
    TextOut(di.hdcDraw, 
    (rc.left + rc.right) / 2, 
    (rc.top + rc.bottom) / 2, 
    pszText, 
    lstrlen(pszText)); return S_OK;
    }
    LRESULT OnLButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary.
    return 0;
    }
    LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary.
    return 0;
    }
    LRESULT OnSelfDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary.
    return 0;
    }
    };
      

  6.   

    窗口的消息,没窗口哪来消息响应。你是activex控件,你的创建方会给给你创建一个窗口的,不管是mfc还是atl.
      

  7.   

    class CSessionsWin :  public CWindowImpl<CSessionsWin, CWindow, CNullTraits>
    {
    public:
    CString ConvertErrorCode(int ErrorCode);
    CESessions *m_parent;
    CSessionsWin()
    {
    } BEGIN_MSG_MAP(CSessionsWin)
    // MESSAGE_HANDLER(WM_EtermEVENT, OnEtermEvent)
    MESSAGE_HANDLER(WM_OPTION,OnOption)
    MESSAGE_HANDLER(WM_DATA,OnData)
    MESSAGE_HANDLER(WM_CONNECTSTATUS,OnStatus)
    MESSAGE_HANDLER(WM_ERROR,OnERROR)
    MESSAGE_HANDLER(WM_ERRORMSG,OnERRORMSG)
    MESSAGE_HANDLER(WM_NEWS,OnNEWS)
    END_MSG_MAP()
       
    LRESULT OnOption(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnData(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnStatus(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnERROR(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnERRORMSG(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnNEWS(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    };CSessionsWin m_Msg;hwnd=m_Msg.Create(NULL,rect,NULL,0,0,0,NULL);
      

  8.   

    class CSessionsWin :  public CWindowImpl<CSessionsWin, CWindow, CNullTraits>
    {
    public:
    CString ConvertErrorCode(int ErrorCode);
    CESessions *m_parent;
    CSessionsWin()
    {
    } BEGIN_MSG_MAP(CSessionsWin)
    // MESSAGE_HANDLER(WM_EtermEVENT, OnEtermEvent)
    MESSAGE_HANDLER(WM_OPTION,OnOption)
    MESSAGE_HANDLER(WM_DATA,OnData)
    MESSAGE_HANDLER(WM_CONNECTSTATUS,OnStatus)
    MESSAGE_HANDLER(WM_ERROR,OnERROR)
    MESSAGE_HANDLER(WM_ERRORMSG,OnERRORMSG)
    MESSAGE_HANDLER(WM_NEWS,OnNEWS)
    END_MSG_MAP()
       
    LRESULT OnOption(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnData(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnStatus(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnERROR(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnERRORMSG(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    LRESULT OnNEWS(UINT nMsg, WPARAM wParam, 
       LPARAM lParam, BOOL& bHandled);
    };CSessionsWin m_Msg;hwnd=m_Msg.Create(NULL,rect,NULL,0,0,0,NULL);