ActiveX: Message-Handler werden nicht ausgelöst



  • kann sich (oder besser noch: mir) jemand erklären woran es liegen kann, dass ich in folgender klasse keine der On...-methoden aufgerufen bekomme? Hab das ganze nach 'nem sample von msdn nachgebaut... im original gehts, i find aber net raus, was ich anders mach'

    meine version:

    [ object,
      uuid(E4ACBA6D-EEB2-4A7B-982D-90C00D874544),
      dual,
      helpstring("IAXOpenGLFrame Interface"),
      pointer_default(unique)
    ]
    __interface IAXOpenGLFrame : IDispatch
    {
    	[propput, id(DISPID_CAPTION)]
    	HRESULT Caption([in]BSTR pCaption);
    	[propget, id(DISPID_CAPTION)]
    	HRESULT Caption([out,retval]BSTR* ppCaption);
    //		HRESULT Refresh();
    };
    
    /////////////////////////////////////////////////////////////////////////////
    // OpenGL
    [ coclass,
      uuid(984B6A6B-1E70-4D00-B1AE-88D99EE139D7),
      helpstring("AXOpenGLFrame Attrib class"),
      default("IAXOpenGLFrame"),
      implements_category("CATID_Control"),
      registration_script("control.rgs"),
      progid("AXOpenGLFrame.AXOpenGLAttrib.1"),
      vi_progid("AXOpenGLFrame.AXOpenGLAttrib")
    ]
    class AXOpenGLFrame :
    	public CComControl<AXOpenGLFrame>,
    	public IAXOpenGLFrame,
    	public IPersistStreamInitImpl<AXOpenGLFrame>,
    	public IPersistStorageImpl<AXOpenGLFrame>,
    	public IOleControlImpl<AXOpenGLFrame>,
    	public IOleObjectImpl<AXOpenGLFrame>,
    	public IOleInPlaceActiveObjectImpl<AXOpenGLFrame>,
    	public IOleInPlaceObjectWindowlessImpl<AXOpenGLFrame>,
    	public IViewObjectExImpl<AXOpenGLFrame>,
    	public IObjectSafetyImpl<AXOpenGLFrame, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
    {
    public:
    	AXOpenGLFrame();
    	~AXOpenGLFrame();
    
    	void RedirectIO();
    
    BEGIN_MSG_MAP( AXOpenGLFrame )
    	MESSAGE_HANDLER( WM_CREATE, OnCreate )
    	MESSAGE_HANDLER( WM_DESTROY, OnDestroy )
    	MESSAGE_HANDLER( WM_SIZE, OnSize )
    	MESSAGE_HANDLER( WM_ERASEBKGND, OnEraseBackground )
    END_MSG_MAP()
    
    BEGIN_PROPERTY_MAP( AXOpenGLFrame )
    END_PROPERTY_MAP()
    
    //DECLARE_NOT_AGGREGATABLE(AXOpenGLFrame)
    DECLARE_GET_CONTROLLING_UNKNOWN()
    //DECLARE_CONTROL_INFO(CLSID_AXOpenGLFrame)
    
    private:
    	bool isConsoleAttached;
    	CComBSTR caption;
    	HGLRC hrc;
    
    // IAXOpenGLFrame
    public:
    	HRESULT OnDraw( ATL_DRAWINFO& di );
    	BOOL SetupPixelFormat( HDC hdc );
    	LRESULT OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
    	LRESULT OnDestroy( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
    	LRESULT OnSize( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
    	LRESULT OnEraseBackground( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
    
    	STDMETHODIMP put_Caption( BSTR pCaption );
    	STDMETHODIMP get_Caption( BSTR* ppCaption );
    	void CreateContext( HDC hdc, RECT& rc );
    	void CreateRGBPalette( HDC hdc );
    };
    

    msdn-version:

    [ object,
      uuid(E4ACBA6D-EEB2-4A7B-982D-90C00D874544),
      dual,
      helpstring("IOpenGLObj Interface"),
      pointer_default(unique)
    ]
    __interface IOpenGLObj : IDispatch
    {
    	[propput, id(DISPID_CAPTION)]
    	HRESULT Caption([in]BSTR pCaption);
    	[propget, id(DISPID_CAPTION)]
    	HRESULT Caption([out,retval]BSTR* ppCaption);
    //		HRESULT Refresh();
    };
    
    /////////////////////////////////////////////////////////////////////////////
    // OpenGL
    [ coclass,
      uuid(984B6A6B-1E70-4D00-B1AE-88D99EE139D7),
      helpstring("OpenGLObj Attrib class"),
      default("IOpenGLObj"),
      implements_category("CATID_Control"),
      registration_script("control.rgs"),
      progid("OpenGL.OpenGLAttrib.1"),
      vi_progid("OpenGL.OpenGLAttrib")
    ]
    class COpenGLObj :
    	public CComControl<COpenGLObj>,
    	public IOpenGLObj,
    	public IPersistStreamInitImpl<COpenGLObj>,
    	public IPersistStorageImpl<COpenGLObj>,
    	public IOleControlImpl<COpenGLObj>,
    	public IOleObjectImpl<COpenGLObj>,
    	public IOleInPlaceActiveObjectImpl<COpenGLObj>,
    	public IOleInPlaceObjectWindowlessImpl<COpenGLObj>,
    	public IViewObjectExImpl<COpenGLObj>,
    	public IObjectSafetyImpl<COpenGLObj, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
    {
    public:
    	COpenGLObj()
    	{
    		//...
    	}
    	~COpenGLObj()
    	{
    		//...
    	}
    
    BEGIN_MSG_MAP(COpenGLObj)
    	MESSAGE_HANDLER(WM_PAINT, OnPaint)
    	MESSAGE_HANDLER(WM_CREATE, OnCreate)
    	MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    	MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
    	MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
    	MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
    	MESSAGE_HANDLER(WM_TIMER, OnTimer)
    	MESSAGE_HANDLER(WM_SIZE, OnSize)
    	MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
    	MESSAGE_HANDLER(MM_JOY1MOVE, OnJoyMove)
    	MESSAGE_HANDLER(MM_JOY1ZMOVE, OnJoyZMove)
    END_MSG_MAP()
    
    BEGIN_PROPERTY_MAP(COpenGLObj)
    END_PROPERTY_MAP()
    
    //DECLARE_NOT_AGGREGATABLE(COpenGLObj)
    DECLARE_GET_CONTROLLING_UNKNOWN()
    //DECLARE_CONTROL_INFO(CLSID_COpenGLObj)
    
    	float m_fRadius;
    	BOOL m_bActive;
    	BOOL m_bMouseCaptured;
    	int m_xPos;
    	int m_yPos;
    	CComBSTR m_bstrCaption;
    	GLfloat  m_wAngleY;
    	GLfloat  m_wAngleX;
    	GLfloat  m_wAngleZ;
    	HGLRC m_hrc;
    	HPALETTE m_hPal;
    	LOGPALETTE *m_pPal;
    	WORD joyposX;
    	WORD joyposY;
    	WORD joyposZ;
    
    // IOpenGLObj
    public:
    	HRESULT OnDraw(ATL_DRAWINFO& di);
    	BOOL bSetupPixelFormat(HDC hdc);
    	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    	{
    		//...
    	}
    	LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    	{
    		//...
    	}
    	LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    	{
    		//...
    	}
    	LRESULT OnJoyMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    	{
    		//...
    	}
    	LRESULT OnJoyZMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    	{
    		//...
    	}
    
    	STDMETHODIMP put_Caption(BSTR pCaption)
    	{
    		//...
    	}
    	STDMETHODIMP get_Caption(BSTR* ppCaption)
    	{
    		//...
    	}
    
    	STDMETHOD(GetColorSet)(DWORD dwDrawAspect,LONG lindex, void* pvAspect, DVTARGETDEVICE* ptd, HDC hicTargetDev, LOGPALETTE** ppColorSet)
    	{
    		//...
    	}
    
    	void CreateContext(HDC hdc, RECT& rc);
    	void CreateRGBPalette(HDC hdc);
    	unsigned char ComponentFromIndex(int i, UINT nbits, UINT shift);
    };
    


  • Niemand?

    Okay, habs inzwischen ganz von vorne nochmal neu gemacht, jetzt gehts größtenteils (keine Ahnung was jetzt anders ist als vorher). Was allerdings trotzdem noch nicht funzt: Wenn ich manuell Message-Handler hinzufüge, klappt das nicht:

    [ coclass,
      uuid(984B6A6B-1E70-4D00-B1AE-88D99EE139D7),
      helpstring("RTSClient Attrib class"),
      default("IRTSClientObj"),
      implements_category("CATID_Control"),
      registration_script("control.rgs"),
      progid("RTSClient.RTSClientAttrib.1"),
      vi_progid("RTSClient.RTSClientAttrib")
    ]
    class CRTSClientObj :
    	public CComControl<CRTSClientObj>,
    	public IRTSClientObj,
    	public IPersistStreamInitImpl<CRTSClientObj>,
    	public IPersistStorageImpl<CRTSClientObj>,
    	public IOleControlImpl<CRTSClientObj>,
    	public IOleObjectImpl<CRTSClientObj>,
    	public IOleInPlaceActiveObjectImpl<CRTSClientObj>,
    	public IOleInPlaceObjectWindowlessImpl<CRTSClientObj>,
    	public IViewObjectExImpl<CRTSClientObj>,
    	public IObjectSafetyImpl<CRTSClientObj, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
    
    	private RTS::Input::InputDispatcher
    {
    private:
    	//...
    public:
    	CRTSClientObj();
    	~CRTSClientObj();
    
    	BEGIN_MSG_MAP(CRTSClientObj)
    		MESSAGE_HANDLER(WM_PAINT, OnPaint)
    		MESSAGE_HANDLER(WM_CREATE, OnCreate)
    		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    		MESSAGE_HANDLER(WM_LBUTTONDOWN, OnMouseButtonDown)
    		MESSAGE_HANDLER(WM_LBUTTONUP, OnMouseButtonUp)
    		MESSAGE_HANDLER(WM_RBUTTONDOWN, OnMouseButtonDown)
    		MESSAGE_HANDLER(WM_RBUTTONUP, OnMouseButtonUp)
    		MESSAGE_HANDLER(WM_MBUTTONDOWN, OnMouseButtonDown)
    		MESSAGE_HANDLER(WM_MBUTTONUP, OnMouseButtonUp)
    		MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
    		MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)
    		MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
    		MESSAGE_HANDLER(WM_TIMER, OnTimer)
    		MESSAGE_HANDLER(WM_SIZE, OnSize)
    		MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
    	END_MSG_MAP()
    
    	HRESULT OnDraw(ATL_DRAWINFO& di);
    	BOOL	bSetupPixelFormat(HDC hdc);
    	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnMouseButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnMouseButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnKeyUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    	LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    };
    

    hier werden OnKeyUp und OnKeyDown nicht ausgelöst. Warum? Muss ich denn sonst noch was machen, ausser die MESSAGE_HANDLER-Makros reinzutippen und die Methoden zu implementieren?



  • Okay. Wie geb' ich denn dem Ding den Focus? Ich hätte es so versucht, wie es Petzold demonstriert: In WM_SETFOCUS per Child-ID den Focus auf das Child-Objekt setzen.

    Folgendes hier funktioniert aber nicht:

    MESSAGE_HANDLER(WM_SETFOCUS, OnFocus)
    

    Wenn ich auf den Container (mshta.exe, IE) clicke (oder zum Container Alt-Tabbe), kommt diese Message nie an.


Anmelden zum Antworten