Domanda

Voglio fare un custom VCL di controllo che avvolge un SDL rendering di superficie tramite il SDL_CreateWindowFrom funzione.SDL_CreateWindowFrom prende esistente HWND e si mette ad alte prestazioni contesto di rendering (ha vari servizi disponibili, tra DirectX e OpenGL) su di esso.

Helpfile dice "non si riferiscono alla proprietà Handle durante la creazione del componente o in streaming." Ma non dice perché.Si dice che la prima volta che si tenta di accedere a Gestire la struttura, sarà chiamata HandleNeeded per garantire che un handle valido esiste.

Quindi ho due domande.1:Qual è il motivo per cui non dovresti riferimento la proprietà Handle durante la creazione del componente?2.Se il punto di controllo è a capo di un rendering di superficie che richiede un HWND essere inizializzato, quando è sicuro per eseguire l'inizializzazione che (in teoria) dovrebbero essere portati durante la creazione/streaming?

È stato utile?

Soluzione

Al suo centro, è una performance cosa.Ci sono potenzialmente altri "cattivi" e gli effetti collaterali che può accadere, in quanto durante il processo di streaming.Le cose sono in "mid-costruzione" e tutto ciò che normalmente ci si aspetta di essere probabilmente ci sono non.

Quando si fa riferimento a "Gestire" la struttura, in questo modo verrà avviata l'handle del processo di creazione.Questo è perché la lettura di Gestire effettivamente chiamate GetHandle.Farlo troppo presto nel processo di streaming, e si può finire con, nella migliore delle ipotesi, più lento le prestazioni di streaming, peggio, parzialmente configurato "gestire".

Se avete bisogno di fare riferimento a Gestire in modo corretto all'interno di un setter, si dovrebbe verificare se il manico è stato creato selezionando HandleAllocated, e solo allora si fa riferimento.Se avete bisogno di apportare alcune bandiera modifiche al manico, come le chiamate SetWindowLong() o qualcosa del genere, allora si dovrebbe "cache" che è stato l'istanza del componente e poi sovrascrivere CreateWnd e applica le impostazioni a quel punto.Un'altra opzione è quella di rinviare tutto di gestire l'accesso durante lo streaming (se csLoading in ComponentState poi) fino Caricato virtuale viene chiamato il metodo.

Infine, è necessario essere a conoscenza di casi in cui la maniglia può essere necessario per ottenere ricreato.Questo può accadere se l'circostante modulo o componente principale del manico passa attraverso una ricreare processo.Fino a versioni più recenti di Windows, l'unico modo per cambiare alcune bandiere finestrino era quello di distruggere la maniglia e ricreare con le nuove bandiere in CreateWindowEx() chiamata.Ci sono molti componenti che lo fanno ancora.Sapete se sei di ricreare la situazione di controllo (csRecreating in ControlState).

Quindi, per rispondere direttamente alla tua domanda, il posto migliore è ignorare CreateWnd e fare il vostro lavoro.CreateWnd sarà richiamato solo quando la maniglia viene creato.Correttamente progettato componente dovrebbe ottenere solo una chiamata a CreateWnd destra prima che si sta per essere mostrato.

Altri suggerimenti

Per rispondere alla tua seconda domanda: Assumendo che il controllo è un TCustomControl probabilmente si dovrebbe ignorare CreateWindowHandle () . Questo ha il vantaggio che tutta l'inizializzazione viene ripetuta correttamente ogni volta che un nuovo handle di finestra viene creata per il controllo. Questo permette di cambiare alcune bandiere stile finestra che non possono essere impostate o ripristinare senza ricreare la finestra. Lo fa anche permette di conservare le risorse liberando la maniglia quando non è necessario, e ricreando in un secondo momento.

Si veda anche questa domanda che cosa è-the-differenze-tra-createwnd-e -createwindowhandle e ancora di più le risposte dettagliate su cosa fare e quando ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top