Reparenting
-
Hallo zusammen,
kennt jemand eine gute Zusammenfassung, wie man mit Hilfe der MFC Fenster aus anderen Prozessen sauber re-parented? Also wie man es sauber detached/attached und welche Callbacks man dafür überschreibt.
Ich habe das HWND des Fensters, welches re-parented werden soll ist in beiden Klassen bekannt. Eine von CView abgeleitete Klasse nimmt das HWND auf und setzt sich als Parent.
Allerdings klappt das repainting noch nicht hunderprozentig. Vielleicht gibt es dazu ja eine nette Übersicht?
-
Und was ist Dein Problem?
Man muss weder subclassen noch sonst etwas machen...Hast Du im View WS_CLIPCHILDREN gesetzt? Damit verhindert wird, dass das Child durch den View überschrieben wird?
BTW: Du kannst nicht einen Callback überschreiben, da das Fenster in einem anderen Prozess liegt!
-
Hi,
welchen View meinst Du, dem ich
WS_CLIPCHILDREN
setzen soll? Den neuen Parent oder den eingebetteten?im Moment habe ich in meiner abgeleiteten CView-Klasse, die das externe HWND aufnimmt folgende Callbacks überschrieben:
OnDraw OnEraseBackground
Diese beiden machen jeweils nichts.
OnSize
schickt die Resize-Nachricht an das eingebettete Fenster weiter (SetWindowPos).
Die Frage ist nun: Geht das nicht auch eleganter? Sozusagen implizit?
Weiterhin ist das Problem wenn ich mit Spy++ das Fenster mit dem Sucher auswähle, dann verschwindet der eingebettete View und das Fenster wird weiß (Win 7). Erst nach einem resize zeichnet sich das Fenster wieder. Deshalb denke ich, dass irgendwas noch nicht rund läuft...
-
Lies doch mal die Doku zu WS_CLIPCHILDREN.
Du musst diesen Stil für Dein View setzen!Was sol da "implizierter" gehen?
Du braucht ein Parent, dass entsprechende vorbereitet ist. Das hast Du auch soweit ich das sehe korrekt gemacht. OnDraw/OnEraseBkgnd/OnSize ist das alles was hier zu beachten ist.Was Spy++ da machtmuss dich nicht stören. Der rechnet nicht unbedingt damit, dass Fenster in einer Beziehung zu unterschiedlichen Prozessen gehören.
Zudem kann das am fehlenden Stil WS_CLIPCHILDREN liegen.
-
Danke, das bestätigt mich schonmal
Der gleiche Effekt wie bei Spy++ tritt übrigens auch auf, wenn ich das Fenster mit
SetRedraw
locken möchte. Und dabei ist es natürlich nicht schön.
Der Hintergrund wird übrigens nicht weiß, sondern es schimmert das letzte aktive MDI Child durch. Gibt es hierfür eine Erklärung/Lösung?Mit einem kleinen Dummy-Projekt sehe ich den Effekt leider nicht.
-
Natürlich nicht:
Du sagst das das Child für sich sorgt (WS_CLIPCHILDREN). Das Parent darf in den Bereich also nichts zeichen. Du sagst dem Child es darf nichts zeichnen (SetRedraw(FALSE))
Folge: Du siehst Artifakte..., den es wird dort nichts gezeichnet... genau wie Du es willstWas versprichst Du Dir von SetRedraw(FALSE)? Viele Fenster und Fensterklassen machen eigentümliche Fehler, wenn Du es verwendest.
-
Es werden ein paar Sachen gezeichnet (unter anderen auch neue MDI Childs geöffnet), so dass SetRedraw(FALSE) das flackern unterdrücken soll.
Ich habe aber eben herausgefunden, dass das beschriebene Verhalten für alle Views, die OpenGL verwenden, auftritt.
Kann mir das einer erklären? Warum verschwindet der OpenGL-View unter Win7, wenn man das zeichnen unterdrückt?
-
Elgerton schrieb:
Es werden ein paar Sachen gezeichnet (unter anderen auch neue MDI Childs geöffnet), so dass SetRedraw(FALSE) das flackern unterdrücken soll.
Ich habe aber eben herausgefunden, dass das beschriebene Verhalten für alle Views, die OpenGL verwenden, auftritt.
Kann mir das einer erklären? Warum verschwindet der OpenGL-View unter Win7, wenn man das zeichnen unterdrückt?
Frag MS...
Im Ernst, wenn es fü Dich ein Problem ist öffne eine Support-Anfrage.
Ansonsten ist das für mich der falsche Weg... WM_SETREDRAW wird nicht von allen Fenstern behandelt! Wenn Du das Flackern beim Öffnen der MDI Fenster verhindern willst, warum setzt Du das MDI-Frame Window nicht auf SW_HIDE?