Contextos de dispositivo de exibição privado
Um contexto de dispositivo privado permite que um aplicativo evite recuperar e inicializar um contexto de dispositivo de exibição sempre que o aplicativo precisar desenhar em uma janela. Contextos de dispositivo privado são úteis para janelas que exigem muitas alterações nos valores dos atributos do contexto do dispositivo para prepará-lo para desenho. Os contextos de dispositivo privado reduzem o tempo necessário para preparar o contexto do dispositivo e, portanto, o tempo necessário para realizar o desenho na janela.
Um aplicativo direciona o sistema para criar um contexto de dispositivo privado para uma janela especificando o estilo CS_OWNDC na classe de janela. O sistema cria um contexto de dispositivo privado exclusivo sempre que cria uma nova janela que pertence à classe . Inicialmente, o contexto do dispositivo privado tem os mesmos valores padrão para atributos que um contexto de dispositivo comum, mas o aplicativo pode modificá-los a qualquer momento. O sistema preserva as alterações no contexto do dispositivo durante a vida útil da janela ou até que o aplicativo faça alterações adicionais.
Um aplicativo pode recuperar um identificador para o contexto de dispositivo privado usando a função GetDC a qualquer momento após a criação da janela. O aplicativo deve recuperar o identificador apenas uma vez. Depois disso, ele pode manter e usar o identificador várias vezes. Como um contexto de dispositivo privado não faz parte do cache de contexto do dispositivo de exibição, um aplicativo nunca precisa liberar o contexto do dispositivo usando a função ReleaseDC .
O sistema ajusta automaticamente o contexto do dispositivo para refletir as alterações na janela, como movimentação ou dimensionamento. Isso garante que todas as janelas sobrepostas sejam sempre recortadas corretamente; ou seja, nenhuma ação é exigida pelo aplicativo para garantir o recorte. No entanto, o sistema não revisa o contexto do dispositivo para incluir a região de atualização. Portanto, ao processar uma mensagem de WM_PAINT , o aplicativo deve incorporar a região de atualização chamando BeginPaint ou recuperando a região de atualização e cruzando-a com a região de recorte atual. Se o aplicativo não chamar BeginPaint, ele deverá validar explicitamente a região de atualização usando a função ValidateRect ou ValidateRgn . Se o aplicativo não validar a região de atualização, a janela receberá uma série interminável de mensagens WM_PAINT .
Como BeginPaint oculta o cursor se uma janela o estiver mostrando, um aplicativo que chama BeginPaint também deve chamar a função EndPaint para restaurar o cursor. EndPaint não tem outro efeito em um contexto de dispositivo privado.
Embora um contexto de dispositivo privado seja conveniente de usar, ele faz uso intensivo de memória em termos de recursos do sistema, exigindo 800 ou mais bytes para armazenar. Contextos de dispositivo privado são recomendados quando considerações de desempenho superam os custos de armazenamento.
O sistema inclui o contexto do dispositivo privado ao enviar a mensagem WM_ERASEBKGND para o aplicativo. As seleções atuais do contexto do dispositivo privado, incluindo o modo de mapeamento, estão em vigor quando o aplicativo ou o sistema processa essas mensagens. Para evitar efeitos indesejáveis, o sistema usa coordenadas lógicas ao apagar a tela de fundo; por exemplo, ele usa a função GetClipBox para recuperar as coordenadas lógicas da área para apagar e passa essas coordenadas para a função FillRect . Os aplicativos que processam essas mensagens podem usar técnicas semelhantes.
Um aplicativo pode usar a função GetDCEx para forçar o sistema a retornar um contexto de dispositivo comum para a janela que tem um contexto de dispositivo privado. Isso é útil para realizar touch-ups rápidos em uma janela sem alterar os valores atuais dos atributos do contexto de dispositivo privado.