Domanda

Sto creando un controllo Windows Form derivato da UserControl da incorporare in un'app WPF. In genere ho seguito le procedure riportate in questo link .

public ref class CTiledImgViewControl : public UserControl
{
...

virtual void OnPaint( PaintEventArgs^ e ) override;

...
};

E nel mio file CPP:

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

Tutto viene compilato ed eseguito, tuttavia il metodo OnPaint non viene mai chiamato.

Qualche idea sulle cose da cercare? Ho fatto molto con C ++, ma sono abbastanza nuovo per WinForms e WPF, quindi potrebbe essere qualcosa di ovvio ...

È stato utile?

Soluzione

Il OnPaint normalmente non viene chiamato in un UserControl a meno che tu non imposti lo stile appropriato quando viene costruito usando il metodo SetStyle . Devi essere impostato su UserPaint su true affinché OnPaint venga chiamato.

SetStyle(ControlStyles::UserPaint, true);

Aggiornamento

Di recente ho riscontrato questo problema da solo e sono andato alla ricerca di una risposta. Volevo eseguire alcuni calcoli durante un disegno (per sfruttare la gestione unica dei messaggi di disegno) ma non sempre ricevevo una chiamata a OnPaint .

Dopo aver cercato con Reflector, ho scoperto che OnPaint viene chiamato solo se il rettangolo di ritaglio del corrispondente messaggio WM_PAINT non è vuoto. La mia istanza UserControl aveva un controllo figlio che riempiva la sua intera area client e quindi tagliava tutto. Ciò significava che il rettangolo di ritaglio era vuoto e quindi nessuna chiamata OnPaint .

Ho risolto il problema sovrascrivendo WndProc e aggiungendo un gestore per WM_PAINT in quanto non riuscivo a trovare un altro modo per ottenere ciò che volevo.

Altri suggerimenti

Ho risolto il problema, nel caso qualcuno fosse interessato. È stato perché il mio controllo WinForms era incorporato in un ViewBox. L'ho cambiato in una griglia e ho subito iniziato a ricevere eventi di disegno. Immagino che quando fai domande su WPF, dovresti sempre includere XAML nella domanda!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top