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).
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 é:
- um identificador GDI, cujo número máximo é limitado, e
- 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.)