Pergunta

O MSDN exibe o seguinte para CreatePatternBrush:

Você pode excluir um pincel padrão sem afetando o bitmap associado por usando a função DeleteObject.Portanto, você pode usar isso bitmap para criar qualquer número de padrão Escovas.

Minha pergunta é o oposto.Se o HBRUSH tiver longa duração, posso excluir o HBITMAP logo após criar o pincel?Ou seja:o HBRUSH armazena sua própria cópia do HBITMAP?

Nesse caso, gostaria que o HBRUSH tivesse escopo de objeto enquanto o HBITMAP tivesse escopo de método (o método que cria o HBRUSH).

Foi útil?

Solução

O HBRUSH e o HBITMAP são totalmente independentes.Os identificadores podem ser excluídos de forma totalmente independente um do outro e, uma vez criados, nenhuma alteração em qualquer objeto afetará o outro.

Outras dicas

O pincel possui sua própria cópia do bitmap.Isso é facilmente visto excluindo o bitmap após criar o pincel e depois usando o pincel (funciona bem)

Usar GetObject para preencher uma estrutura LOGBRUSH retornará o identificador BITMAP original no membro lbhatch, e não o identificador da cópia, infelizmente.E usar GetObject no identificador de bitmap retornado falhará se o bitmap for excluído.

Alguém tem ideia de como obter as dimensões originais do bitmap do pincel neste caso?Desejo criar uma cópia do pincel de padrão mesmo que o bitmap original seja excluído.Posso obter uma cópia do bitmap original simplesmente pintando com o pincel, mas não sei o tamanho.Tentei usar SetbrushorgEx (hdc, -1,-1), esperando que os -1 fossem reduzidos em módulo em suas dimensões quando o pincel fosse selecionado no contexto do dispositivo e obtivesse valores quando eu recuperasse com GetBrushOrgEx.Não funciona.

Acho que o bitmap deve sobreviver ao pincel:o pincel apenas faz referência ao bitmap existente em vez de copiá-lo.

Você sempre pode tentar e ver o que acontece.

Duvido que a API CreatePatternBrush() copie o bitmap que você forneceu, já que um HBITMAP é:

  1. um identificador GDI, cujo número máximo é limitado, e
  2. potencialmente muito grande.

Win32 e GDI tendem a ser conservadores na criação de cópias internas de seus dados, até porque quando a maioria de suas APIs foram criadas (CreatePatternBrush() data do Windows 95 e muitas funções são ainda mais antigas), a memória e os identificadores GDI estavam em muito mais oferta limitada do que são agora.(Por exemplo, o Windows 95 era necessário para funcionar bem em um sistema com apenas 4 MB de RAM.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top