Pergunta

Ou para perguntar de outra forma, como OnEraseBkgnd () funciona?

Eu estou construindo um controle personalizado e eu bati sobre este problema.
Childs são retângulos, como de costume. Eu tive que desativar OnEraseBkgnd () e eu uso apenas o OnPaint ().
o que eu preciso é de eficientemente limpar a área por trás da criança e sem cintilação. < br> Técnicas como usando buffers de volta não são uma opção.

Editar : Eu estou muito interessado no algoritmo que está sob o capô de OnEraseBkgnd (). Mas qualquer resposta útil também serão aceitos.

Foi útil?

Solução

Normalmente, no Windows, o meio de redução de cintilação mais fácil (mas não mais eficaz), é desligar o manuseio notificação WM_ERASEBKGND. Isso porque, se você apagar a fundo no manipulador de notificação, em seguida, pinte a janela no manipulador WM_PAINT, há um pequeno atraso entre os dois -. Este atraso é visto como uma cintilação

Em vez disso, se você fizer tudo o apagamento e desenho no manipulador WM_PAINT, você tenderá a ver muito menos flicker. Isto é porque o atraso entre os dois é reduzida. Você ainda vai ver alguns flicker, especialmente quando redimensionamento porque ainda há um pequeno atraso entre as duas ações, e você não pode ter sempre em todo o desenho antes da próxima ocorrência da interrupção do bloqueio vertical para o monitor. Se você não pode usar buffer duplo, então este é provavelmente o método mais eficaz você será capaz de usar.

Você pode obter melhor desenho desempenho, seguindo a maioria das recomendações habituais em torno da área cliente invalidação - não invalidam toda a janela a menos que você realmente precisa. Tentar invalidar apenas as áreas que foram alterados. Além disso, você deve usar as funções BeginDeferWindowPos se você estiver atualizando as posições de uma coleção de janelas filho ao mesmo tempo.

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