Pregunta

MSDN muestra lo siguiente para CreatePatternBrush:

Puede eliminar un pincel de patrón sin afectar el mapa de bits asociado utilizando la función deleToObject.Por lo tanto, puede usar este mapa de bits para crear cualquier cantidad de cepillos de patrones.

Mi pregunta es la contraria.Si HBRUSH tiene una larga duración, ¿puedo eliminar HBITMAP inmediatamente después de crear el pincel?ES DECIR:¿El HBRUSH almacena su propia copia del HBITMAP?

En este caso, me gustaría que HBRUSH tuviera alcance de objeto mientras que HBITMAP tuviera alcance de método (el método que crea HBRUSH).

¿Fue útil?

Solución

HBRUSH y HBITMAP son completamente independientes.Los identificadores se pueden eliminar de forma totalmente independiente entre sí y, una vez creados, ningún cambio en ninguno de los objetos afectará al otro.

Otros consejos

El pincel tiene su propia copia del mapa de bits.Esto se ve fácilmente eliminando el mapa de bits después de crear el pincel y luego usándolo (funciona bien)

Sin embargo, el uso de GetObject para completar una estructura LOGBRUSH devolverá el identificador BITMAP original en el miembro lbhatch y, desafortunadamente, no el identificador de la copia.Y el uso de GetObject en el identificador del mapa de bits devuelto falla si se elimina el mapa de bits.

¿Alguien tiene alguna idea de cómo obtener las dimensiones del mapa de bits originales del pincel en este caso?Deseo crear una copia del pincel de patrón aunque se elimine el mapa de bits original.Puedo obtener una copia del mapa de bits original simplemente pintando con el pincel, pero no sé su tamaño.Intenté usar SetbrushorgEx (hdc, -1, -1), esperando que los -1 se redujeran en módulo de sus dimensiones cuando se selecciona el pincel en el contexto del dispositivo y obtengo valores cuando los recupero con GetBrushOrgEx.No funciona.

Creo que el mapa de bits debe sobrevivir al pincel:el pincel simplemente hace referencia al mapa de bits existente en lugar de copiarlo.

Siempre puedes intentarlo y ver qué pasó.

Dudo que la API CreatePatternBrush() copie el mapa de bits que le proporcionas, ya que un HBITMAP es:

  1. un identificador GDI, cuyo número máximo es limitado, y
  2. potencialmente bastante grande.

Win32 y GDI tienden a ser conservadores a la hora de crear copias internas de sus datos, aunque sólo sea porque cuando se crearon la mayoría de sus API (CreatePatternBrush() data de Windows 95, y muchas funciones son aún más antiguas), la memoria y los identificadores de GDI estaban en mucho más oferta limitada de lo que es ahora.(Por ejemplo, se requería que Windows 95 funcionara bien en un sistema con sólo 4 MB de RAM).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top