Domanda

MSDN visualizza quanto segue per CreatePatternBrush:

È possibile eliminare un pennello a pattern senza influire sulla bitmap associata utilizzando la funzione ELETEObject.Pertanto, è quindi possibile utilizzare questa bitmap per creare un numero qualsiasi di pennelli.

La mia domanda è l'opposto.Se HBRUSH è di lunga durata, posso eliminare HBITMAP subito dopo aver creato il pennello?CIOÈ:HBRUSH memorizza la propria copia di HBITMAP?

In questo caso, vorrei che HBRUSH avesse un ambito oggetto mentre HBITMAP avrebbe un ambito metodo (il metodo che crea HBRUSH).

È stato utile?

Soluzione

HBRUSH e HBITMAP sono completamente indipendenti.Le maniglie possono essere eliminate in modo completamente indipendente l'una dall'altra e, una volta create, nessuna modifica a nessuno degli oggetti avrà effetto sull'altro.

Altri suggerimenti

Il pennello ha la propria copia della bitmap.Questo è facilmente visibile eliminando la bitmap dopo aver creato il pennello e quindi utilizzando il pennello (funziona bene)

Tuttavia, l'utilizzo di GetObject per riempire una struttura LOGBRUSH restituirà l'handle BITMAP originale nel membro lbhatch e sfortunatamente non l'handle della copia.E l'utilizzo di GetObject sull'handle della bitmap restituito non riesce se la bitmap viene eliminata.

Qualcuno ha idea di come ottenere le dimensioni bitmap originali dal pennello in questo caso?Desidero creare una copia del pennello pattern anche se la bitmap originale viene eliminata.Posso ottenere una copia della bitmap originale semplicemente dipingendo con il pennello, ma non ne conosco le dimensioni.Ho provato a utilizzare SetbrushorgEx (hdc, -1,-1), sperando che i -1 vengano ridotti modulo le sue dimensioni quando il pennello viene selezionato nel contesto del dispositivo e ottengo valori quando lo recupero con GetBrushOrgEx.Non funziona.

Penso che la bitmap debba sopravvivere al pennello:il pennello fa semplicemente riferimento alla bitmap esistente anziché copiarla.

Potresti sempre provarlo e vedere cosa è successo.

Dubito che l'API CreatePatternBrush() copi la bitmap che gli dai, poiché un HBITMAP è:

  1. un handle GDI, il cui numero massimo è limitato e
  2. potenzialmente abbastanza grande.

Win32 e GDI tendono ad essere conservatori riguardo alla creazione di copie interne dei dati, se non altro perché quando sono state create la maggior parte delle loro API (CreatePatternBrush() risale a Windows 95 e molte funzioni sono ancora più vecchie), la memoria e gli handle GDI erano molto più offerta limitata rispetto a quella attuale.(Ad esempio, era necessario che Windows 95 funzionasse bene su un sistema con solo 4 MB di RAM.)

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