Windows Forms UserControl anula no ser llamado
-
02-07-2019 - |
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 ...
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!