Enable/Disable ActiveX Control ?



  • Ah ok stimmt daran habe ich gar nicht gedacht.

    Hmm Dazu brauche ich dann eine Callbackfunktion WindowProc. Wie ich die behandle ist klar.
    Aber wie kann ich die, wo und wie muss ich die Implemntieren ? Also ich weiß jetzt gar nicht wonach ich da suchen soll. Ich wüsste wie ich es mit MFC machen würde bzw mit WinAPI.
    Mein ActiveX Control ist in ATL. Wenn ich nach ATL und WindowProc suche komme ich zu CWindowImpl::WindowProc.
    Was mich dann aber auch nicht viel weiter bringt.
    Das hat doch was mit "subclassing" zu tun oder ? Wie nennt man den das ?

    Grüße


  • Mod

    Dein COntrol hat doch eine message Map!

    BEGIN_MSG_MAP
    

    Dort kannst Du doch entsprechende Nachrichten eintragen?

    MESSAGE_HANDLER
    

    Evtl. solltest Du noch mal ein paar Basics lesen (Auch wenn das VC6+CE ist), es ist ein netter kompakter Artikel bzgl. ActiveX Controls.
    http://msdn.microsoft.com/en-us/library/ms834176.aspx#atlce_example



  • Hi

    Nö eben nicht, hatte eben keine message Map.

    Arrrrrrrrrrrg aber klar! hab viel zu kompliziert gedacht. 🙄 😃 Hab mir halt eine eingebaut. Klar geht das ... thx.

    Ja muss mir das noch mal durchlesen. Ich dachte immer die message Map gibt es nur bei "MFC". Und ich dachte ATL hat kaum Teile der MFC enthalten, daher auch keine message Map. Halt nur BEGIN_COM_MAP, etc ..

    Ist wohl doch nicht so. Die ATL hat dann wohl bloß nicht die typischen GUI Elemente enthalten. ? Gibt es wo eine schöne Übersicht wo ATL anfängt und wo aufhört bzw MFC anfängt und aufhört?
    Naja noch mal in Ruhe alles lesen ....

    Grüße Martin



  • ATL hat eine eigene Version der Message Map, und WTL wieder eine andere... schön, oder? 😃



  • Achso die haben beide eine Eigene und sind unabhängig?
    Ich versuche im Kopf nämlich ATL und MFC irgendwie zusammen zu führen bzw wo sie zusammen laufen.
    Aber laut Doku sind die ja doch irgendwie unabhängig. 😃



  • Hallo

    Habe gerade gemerkt, das ich hier unter Windows7 keine Meldung für WM_ENABLE bekomme.
    Woran kann das denn liegen ?
    Oder wie kann ich denn das am Besten untersuchen ?

    Grüße



  • Hab jetzt herausgefunden, das es mit 🙂

    m_Control.EnableWindow(..)
    

    unter Windows 7 nicht funktioniert. Auch unter XP SP3 geht es nicht ? 😕

    Wenn ich aber direkt mit

    SendMassge(...)
    

    arbeite, funktioniert es. 😮


  • Mod

    SendMessage ist für WM_EANABLE nicht erlaubt. Das ist eine Status Meldung, die nur Windows versendet.



  • Hmmm guter Einwand. Ja da hast du eigentlich Recht.
    Aber intern macht doch EnableWindow nicht anderes als ein SendMessage.
    Also Kapselt das ja nur ? Oder hab ich das falsch verstanden ?

    Also wenn ich jetzt rein ein Control mittels WinApi erzeugen würde müsste ich doch über
    SendMessage arbeiten um Eigenschafte zu meiner Controls zu verändern.

    Obwohl eigentlich würde ich ja dann mit SetWindowLong einen neuen "Style" setzten.
    Und das wird wohl eher intern gemacht werden. Genau das könnte ich auch mal probieren.

    Ich wollte eigentlich nur mal herausfinden warum ich unter Windows 7 die Message nicht bekomme.
    Bzw warum da EnableWindow nicht auf ein ActiveX-Control anwenden kann.


  • Mod

    martin_zi schrieb:

    Hmmm guter Einwand. Ja da hast du eigentlich Recht.
    Aber intern macht doch EnableWindow nicht anderes als ein SendMessage.
    Also Kapselt das ja nur ? Oder hab ich das falsch verstanden ?

    Ja! Das hast Du. EnableWindow setzt intern ein Flag in den Strukturen, so dass dieses Control auch keinen Focus mehr bekommt.
    Windows-Funktionen wie SetFocus, EnableWindow, ShowWndow sind mitnichten nur eine Kapselung für das Versenden von Fensternachrichten!

    martin_zi schrieb:

    Also wenn ich jetzt rein ein Control mittels WinApi erzeugen würde müsste ich doch über
    SendMessage arbeiten um Eigenschafte zu meiner Controls zu verändern.

    Nein! Du könntest ihm niemals den Focus geben durch senden von WM_SETFOCUS, Du könntest es nicht anziegne durch senden von WM_SHOW...

    API Funktionen haben ihr eigenes Leben und ihre eigene Berechtigung.

    martin_zi schrieb:

    Obwohl eigentlich würde ich ja dann mit SetWindowLong einen neuen "Style" setzten.
    Und das wird wohl eher intern gemacht werden. Genau das könnte ich auch mal probieren.

    Ich wollte eigentlich nur mal herausfinden warum ich unter Windows 7 die Message nicht bekomme.
    Bzw warum da EnableWindow nicht auf ein ActiveX-Control anwenden kann.

    Wenn Du das richtige Handle hast geht es sicherlich!



  • Ok ja ist klar. Muss zugeben da hatte ich doch bei ein paar Sachen eine falsche Vorstellung. Danke!

    Was ist den das richtige Handling ? Bzw was kann man den da alles falsch machen ?

    Ich erzeuge mit "CreateControl" mein Steuerelement.

    m_Window.CreateControl(...)
    

    direkt danach mache ich nichts ausser:

    m_Window.ShowWindow(...);
    m_Window.EnableWindow(...)
    

    Ich dachte das ich es so schon richtig mache.

    Komischerweise bekomme ich unter Windows XP SP2 auf der ActiveX-seite mein Event wie erwartet.
    Aber ab XP SP3 bzw Windows7 kommt es nicht mehr.

    Seltsamerweise wenn ich z.B es so Aufrufe

    ::EnableWindow(m_Window.m_hWnd,FALSE);
    

    Kommt es auch unter Windows7. Und ich dachte, das das doch das "selbe" ist wie der "obige" Aufruf.

    Oder habe ich da doch noch etwas vergessen ?

    Und das verstehe ich nicht weil mein Tool ist eigentlich recht überschaubar und klein.
    Eigentlich bräuchte ich dazu nicht mal ActiveX aber ich wollte es einfach mal ausprobieren.


Anmelden zum Antworten