Enable/Disable ActiveX Control ?
-
Hallo
Ich habe ein ATL ActiveX Control. Also
Dieses möchte ich im Container Enable/Disable schalten.
Also mitm_Control.EnableWindow(FALSE);
Auf meinem ActiveX Control befinden sich Windows Controls.
Diese kann man dann zwar nicht mehr benutzen aber sind nicht "grau" .
Also dachte ich das ich vielleicht an meinem Control das Event fürm_Control.EnableWindow(..)
abfangen kann und dann diese Controls dann alle auf "enable" bzw "disable" setzen kann.
Aber wie heißt die Schnittstelle dazu bzw wo liegt diese ? Was muss ich da überschreiben?Grüße Martin
-
Wenn Dein ActiveX Control ein eigenes vollständiges Fenster ist, dann bekommt es ein WM_ENABLE mit TRUE/FALSE.
http://msdn.microsoft.com/en-us/library/ms632621(VS.85).aspx
Du könntest also in bei dieser Nachricht entsprechend reagieren.
-
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
-
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.
-
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.
-
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.