2008-09-11 12 views
4

MSDN affiche les informations suivantes pour CreatePatternBrush:Win32 CreatePatternBrush

Vous pouvez supprimer une brosse de modèle sans affecter le bitmap associé par en utilisant la fonction DeleteObject. Par conséquent, vous pouvez ensuite utiliser cette bitmap pour créer un nombre quelconque de brosses de motif .

Ma question est le contraire. Si le HBRUSH a une longue durée de vie, puis-je supprimer le HBITMAP juste après avoir créé le pinceau? IE: le HBRUSH stocke-t-il sa propre copie du HBITMAP?

Dans ce cas, j'aimerais que le HBRUSH ait une portée d'objet alors que le HBITMAP aurait une portée de méthode (la méthode qui crée le HBRUSH).

Répondre

5

Les HBRUSH et HBITMAP sont entièrement indépendants. Les poignées peuvent être supprimées entièrement indépendantes l'une de l'autre, et, une fois créées, aucune modification de l'un ou l'autre objet n'aura d'effet sur l'autre.

1

Je pense que le bitmap doit survivre au pinceau: le pinceau fait juste référence au bitmap existant plutôt que de le copier.

Vous pouvez toujours l'essayer et voir ce qui s'est passé.

1

Je doute que le bitmap copies API CreatePatternBrush() que vous lui donnez, car un HBITMAP est:

  1. une poignée GDI, le nombre maximum est limité, et
  2. potentiellement importants.

Win32 et GDI ont tendance à être prudent sur la création des copies internes de vos données, si seulement parce que quand la plupart de leurs API ont été créés (CreatePatternBrush() date de Windows 95, et de nombreuses fonctions sont plus encore), la mémoire et Les poignées GDI étaient beaucoup plus limitées qu'elles ne le sont actuellement. (Par exemple, Windows 95 devait fonctionner correctement sur un système avec seulement 4 Mo de RAM.)

4

Le pinceau possède sa propre copie du bitmap. Cela se voit facilement en supprimant le bitmap après avoir créé le pinceau puis en utilisant le pinceau (fonctionne bien)

L'utilisation de GetObject pour remplir une structure LOGBRUSH renvoie le handle BITMAP d'origine dans le membre lbhatch, mais pas le handle de la copie, malheureusement. Et l'utilisation de GetObject sur le handle bitmap renvoyé échoue si le bitmap est supprimé.

Quelqu'un a-t-il une idée de la façon d'obtenir les dimensions bitmap d'origine de la brosse dans ce cas? Je souhaite créer une copie de la brosse de modèle même si le bitmap d'origine est supprimé. Je peux obtenir une copie du bitmap original simplement en peignant avec la brosse, mais je ne sais pas c'est la taille. J'ai essayé using SetbrushorgEx (hdc, -1, -1), en espérant que les -1 seraient modulo réduits ses dimensions quand le pinceau est choisi dans le contexte de dispositif et obtiens des valeurs quand je récupère avec GetBrushOrgEx. Ne fonctionne pas