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 ...

Foi útil?

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!

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