Warum sollen Sie nicht einen Griff während der Erstellung von Bauteilen oder Streaming verwenden?

StackOverflow https://stackoverflow.com/questions/582721

Frage

Ich mag ein benutzerdefiniertes VCL-Steuerelement machen, die eine SDL-Rendering Oberfläche über die SDL_CreateWindowFrom Funktion wickelt. SDL_CreateWindowFrom nimmt einen vorhandenen HWND Griff und stellt eine leistungsfähige Rendering-Kontext (es hat mehrere Backends zur Verfügung, einschließlich DirectX und OpenGL) auf sie.

Die Hilfe-Datei sagt: „Sie bezieht sich nicht auf die Handle-Eigenschaft während der Erstellung von Bauteilen oder Streaming.“ Aber es funktioniert nicht sagen, warum. Er sagt, dass das erste Mal, wenn Sie versuchen, die Eigenschaft Handle zugreifen, es wird HandleNeeded aufrufen, um sicherzustellen, dass ein gültiges Handle vorhanden ist.

So habe ich zwei Fragen. 1: Was ist der Grund, warum sollten Sie nicht die Eigenschaft Handle während die Erstellung von Bauteilen verweisen? 2. Wenn der gesamte Punkt der Steuerung ist eine Rendering-Oberfläche zu wickeln, die ein HWND erfordert initialisiert werden, wann ist es sicher, die Initialisierung durchzuführen, die (im Idealfall) sollten während der Erstellung / Streaming zu?

War es hilfreich?

Lösung

Bei ihrem Kern ist, ist es eine Leistung Sache. Es gibt möglicherweise andere „schlechte“ Nebenwirkungen, die auch da während des Streaming-Prozesses geschehen kann. Die Dinge sind in „Mitte der Konstruktion“ und alles, was normalerweise erwartet wird, gibt es wahrscheinlich nicht.

Wenn Sie den „Griff“ Eigenschaft verweisen, wird dies den Griff Erstellungsprozess einzuleiten. Dies liegt daran, Lese Handle GetHandle tatsächlich aufruft. Tun Sie dies auch bald in dem Streaming-Prozess, und Sie können mit allenfalls langsamer Streaming-Leistung, bei schlechter, ein teilweise konfigurierte am Ende „handelt.“

Wenn Sie den Griff beziehen müssen ordnungsgemäß innerhalb einer Eigenschaft Setter, sollten Sie prüfen, ob der Griff durch Überprüfung HandleAllocated erstellt worden ist, und erst dann kann es Sie verweisen. Wenn Sie müssen einige Flags Änderungen an den Griff machen wie der Aufruf SetWindowLong () oder etwas, dann sollten Sie „Cache“ dieser Zustand in der Komponenteninstanz und dann CreateWnd außer Kraft setzen und diese Einstellungen zu diesem Zeitpunkt gelten. Eine weitere Möglichkeit ist es, alle Griff Zugang zu verschieben, während Streaming (falls csLoading in Component dann), bis die geladenen virtuellen Methode aufgerufen wird.

Schließlich müssen Sie Fälle bekannt, wo Ihr Griff müssen neu erstellt werden. Dies kann passieren, wenn die umgebende Form oder den Griff der Stammkomponente ein recreate Prozess durchläuft. Bis neueren Versionen von Windows, die einzige Möglichkeit, einige Fenster Fahnen zu ändern war den Griff und neu mit neuen Fahnen im CreateWindowEx () Aufruf zu zerstören. Es gibt viele Komponenten, die immer noch das tun. Sie wissen, wenn Sie in einer Situation recreate sind durch Überprüfung (csRecreating in Control).

So direkt Ihre Frage zu beantworten, ist der beste Ort CreateWnd außer Kraft zu setzen und tun Sie Ihre Arbeit dort. CreateWnd wird nur aufgerufen werden, wenn der Griff erstellt wird. Ein richtig entworfenes Komponente sollte nur einen Anruf bekommt Recht auf CreateWnd, bevor sie gezeigt werden wird.

Andere Tipps

Ihre zweite Frage zu beantworten: Angenommen, Ihre Steuer a TCustomControl sollten Sie wahrscheinlich außer Kraft setzen Create () . Dies hat den Vorteil, dass alle Initialisierung richtig jedes Mal ein neuer Fenstergriff wiederholt wird, für die Steuerung erstellt. Auf diese Weise kann einige Fenster-Stil-Flags ändern, die nicht gesetzt oder zurückgesetzt werden kann, ohne das Fenster neu zu erstellen. Es erlaubt auch, Ressourcen zu schonen, indem Sie den Griff zu befreien, wenn es nicht benötigt wird, und später neu zu erstellen.

Siehe auch diese Frage was-the-Unterschied-zwischen-CreateWnd-und -createwindowhandle und noch mehr die detaillierten Antworten auf das, was zu tun ist und wann ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top