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.