Question

Je crée un contrôle Windows Forms dérivé de UserControl qui doit être incorporé dans une application WPF. J'ai généralement suivi les procédures décrites dans ce lien .

public ref class CTiledImgViewControl : public UserControl
{
...

virtual void OnPaint( PaintEventArgs^ e ) override;

...
};

Et dans mon fichier CPP:

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

Tout est compilé et exécuté, mais la méthode OnPaint n'est jamais appelée.

Des idées de choses à rechercher? J'ai beaucoup travaillé avec C ++, mais je suis assez nouveau pour WinForms et WPF. Cela pourrait donc être quelque chose d'évident ...

Était-ce utile?

La solution

Le OnPaint ne sera normalement pas appelé dans un UserControl , sauf si vous définissez le style approprié lors de sa construction à l'aide de la méthode SetStyle . Vous devez définir le style UserPaint sur true pour que le OnPaint soit appelé.

SetStyle(ControlStyles::UserPaint, true);


Mettre à jour

J'ai récemment rencontré ce problème moi-même et je suis parti à la recherche d'une réponse. Je souhaitais effectuer des calculs lors de la mise en peinture (pour tirer parti du traitement unique des messages de mise en peinture), mais je ne recevais pas toujours un appel à OnPaint .

Après avoir fouillé dans Reflector, j'ai découvert que OnPaint n'était appelé que si le rectangle de découpage du message WM_PAINT correspondant n'était pas vide. Mon instance UserControl avait un contrôle enfant qui remplissait toute la région cliente et, par conséquent, tout découpé. Cela signifiait que le rectangle de découpage était vide et qu'il n'y avait donc pas d'appel OnPaint .

J'ai corrigé ce problème en remplaçant WndProc et en ajoutant directement un gestionnaire pour WM_PAINT , car je ne pouvais pas trouver d'autre moyen d'atteindre ce que je voulais.

Autres conseils

J'ai résolu le problème, au cas où quelqu'un serait intéressé. C'est parce que mon contrôle WinForms était incorporé dans un ViewBox. Je l'ai changé en une grille et immédiatement commencé à obtenir des événements de peinture. Je suppose que lorsque vous posez des questions sur WPF, vous devez toujours inclure le XAML dans la question!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top