Pregunta

Estoy creando un control de Windows Forms derivado de UserControl para incrustarlo en una aplicación WPF. En general, he seguido los procedimientos que se proporcionan en este enlace .

public ref class CTiledImgViewControl : public UserControl
{
...

virtual void OnPaint( PaintEventArgs^ e ) override;

...
};

Y en mi archivo CPP:

void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
    UserControl::OnPaint(e);
    // do something interesting...
}

Todo se compila y se ejecuta, sin embargo, nunca se llama al método OnPaint.

¿Alguna idea de cosas que buscar? He hecho mucho con C ++, pero soy bastante nuevo en WinForms y WPF, por lo que podría ser algo obvio ...

¿Fue útil?

Solución

El OnPaint normalmente no se llamará en un UserControl a menos que establezca el estilo apropiado cuando se construye utilizando el método SetStyle . Debe establecer el estilo UserPaint en true para que se llame al OnPaint .

SetStyle(ControlStyles::UserPaint, true);


Actualizar

Recientemente me encontré con este problema y busqué una respuesta. Quería realizar algunos cálculos durante una pintura (para aprovechar el manejo único de los mensajes de pintura) pero no siempre recibía una llamada a OnPaint .

Después de excavar con Reflector, descubrí que OnPaint solo se llama si el rectángulo de recorte del mensaje WM_PAINT correspondiente no está vacío. Mi instancia de UserControl tenía un control secundario que llenaba toda su región de cliente y, por lo tanto, lo recortaba todo. Esto significaba que el rectángulo de recorte estaba vacío y, por lo tanto, no se llamaba OnPaint .

Trabajé alrededor de esto anulando WndProc y agregando un controlador para WM_PAINT directamente, ya que no pude encontrar otra forma de lograr lo que quería.

Otros consejos

Resolví el problema, en caso de que alguien esté interesado. Fue porque mi control WinForms estaba incrustado en un ViewBox. Lo cambié a una cuadrícula e inmediatamente comencé a obtener eventos de pintura. ¡Supongo que al hacer preguntas sobre WPF, siempre debe incluir el XAML en la pregunta!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top