ich habe ein kleines Problemchen mit QAxWidget und Maus-Events.
Das Problem:
Ich möchte in meine Anwendung ein ActiveX-Control einfügen, welches lediglich zur Anzeige von VideoStreams dienen soll. Das ActiveX-Control bietet sehr viele Optionen, die ich dem Benutzer aber nicht zur Verfügung stellen möchte, außerdem brauche ich weiterhin in meinem Teil der Anwendung volle Kontrolle über Maus- und Drag/Drop-Events, die auf der Zeichnungsebene des Controls geschehen, um z.B. einen anderen Videostream per Dran&Drop anzuzeigen. Als Drag&Drop-Source dient ein Kamerabaum in meiner Anwendung.
Bisher hatte ich immer nur Video-APIs verwendet, die mir die Kontrolle über alle Events gelassen haben (diese haben einfach auf einem Window-Handle gezeichnet das ich der API übergeben habe). Nun muss ich (leider) auf ein ActiveX-Control zurückgreifen, um einen gewissen Kameratyp einzubinden. Dieses Control "verschluckt" leider alle Events.
Lösungsansatz:
Ich habe versucht den Eventhandler des ActiveX-Controls auszutauschen gegen meinen eigenen, leider war ich dabei nicht sonderlich erfolgreich. Eventuell hat jemand hier im Forum eine Idee, was ich falsch gemacht habe.
Ich habe QAxWidget abgeleitet (MyQAxWidget) und dort die winEvent-Funktion eingefügt, das selbe in der Klasse, die diesen Code ausführt. Diese protokolliert im Moment lediglich welche Events ankommen. Die üblichen Verdächtigen wie mouseEvent(...) und mouseDoubleClickEvent(...) erzeugen ebenfalls Debugausgaben.
Der Code sieht im Moment so aus. Zum Test habe ich einfach das ActiveX-COntrol von Acrobar
Code: Alles auswählen
// QAxWidget erzeugen und auf GUI setzen
this->ax = new MyQAxWidget(this->ui.centralWidget);
this->ax->setGeometry(10,10,200,200);
// Control laden und ein PDF darstellen
this->ax->setControl("{CA8A9780-280D-11CF-A24D-444553540000}");
QVariantList params;
params.append(QDir::currentPath() + "/test.pdf");
bool result = this->ax->dynamicCall("LoadFile(QString)", params).toBool();
this->ax->show();
// Ersetzen des Eventhandlers und Umleiten der Events auf eigene Routine
IOleWindow* oleWnd = NULL;
QUuid id = IID_IOleWindow;
this->ax->queryInterface(id,(void **)&oleWnd);
HWND hwndParent;
oleWnd->GetWindow(&hwndParent);
LONG_PTR proc = GetWindowLongPtr(this->winId(),GWLP_WNDPROC);
LONG_PTR procold = SetWindowLongPtr(hwndParent,GWLP_WNDPROC,proc);
Danke,
Sephral