Windows Forms substituições UserControl não sendo chamado
-
02-07-2019 - |
Pergunta
Estou criando um controle Windows Forms derivado de UserControl para ser incorporado em um aplicativo WPF. Eu geralmente seguido os procedimentos indicados no este link .
public ref class CTiledImgViewControl : public UserControl
{
...
virtual void OnPaint( PaintEventArgs^ e ) override;
...
};
E no meu arquivo CPP:
void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
UserControl::OnPaint(e);
// do something interesting...
}
compila tudo e corre, no entanto o método OnPaint nunca está sendo chamado.
Todas as idéias de coisas que procurar? Já fiz muito com C ++, mas sou muito novo para WinForms e WPF, por isso poderia muito bem ser algo óbvio ...
Solução
O OnPaint
irá normalmente não são chamados em um UserControl
menos que você defina o estilo apropriado quando é construído usando o método SetStyle
. Você precisa definir o estilo UserPaint
como true para a OnPaint
de ser chamado.
SetStyle(ControlStyles::UserPaint, true);
Atualização
Eu encontrei recentemente esta questão me e fui cavando para uma resposta. Eu queria fazer alguns cálculos durante uma pintura (para alavancar a manipulação única de mensagens de pintura), mas eu nem sempre estava recebendo uma chamada para OnPaint
.
Depois de cavar ao redor com refletor, descobri que OnPaint
só é chamado se o retângulo de recorte da mensagem WM_PAINT
correspondente não está vazio. Meu exemplo UserControl
tinha um controle filho que encheu sua região inteira do cliente e, portanto, cortada tudo. Isto significava que o retângulo de recorte estava vazio e assim nenhuma chamada OnPaint
.
Eu trabalhei em torno deste, substituindo WndProc
e adicionando um manipulador para WM_PAINT
diretamente como eu não poderia encontrar outra maneira de conseguir o que queria.
Outras dicas
Eu resolvi o problema, no caso de alguém está interessado. Foi por causa do meu controle WinForms foi incorporado em um ViewBox. Eu mudei para uma grade e imediatamente começou a receber eventos de pintura. Eu acho que quando a fazer perguntas sobre WPF, você sempre deve incluir o XAML na pergunta!