Membres inscrits :596
Membres en ligne : 0
Invités en ligne : 2


|
| Conversation (Résolue) : onDraw |
yannp (Membre)
Inscrit le : 02-06-2010
Messages: 59
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour,
J'ai une fenetre fille sur laquelle il y a un wxBoxSizer, divisé en plusieurs parties. Sur l'une de ces parties il y a un wxScrolledWindow. Je souhaite dessiner sur ce wxScrolledWindow.
Ma première question : Quelle est le différence entre onDraw et onPaint ?
Ma seconde question: Déclaration ma fenetre fille :
Code: class winChild : public wxMDIChildFrame Lorsque je suis dans la méthode onDraw :
Code: void winChild ::OnDraw(wxDC &dc)
Comment puis-je faire pour "atteindre" ma wxScrolledWindow afin de dessiner dessus ?
Merci d'avance
Yann
| |
|
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne |
bonjour, -question 1: * OnDraw est utilisé pour les scrolled window. Ca permet de dessiner sans soucis ta fenêtre entière et ensuite c'est la scrolled window qui se débrouille pour afficher à l'écran la bonne partie en fonction de sa taille et évidement des scrollsbar. Par exemple: dans OnDraw tu dessines une image de 10000x10000px, à noter qu'il n'y a pas d'évenement à gérer, c'est juste une méthode à surcharger ( de mémoire ).
* OnPaint est la gestion de l'évenement EVT_PAINT ( par convention ) cela s'applique à n'importe quel wxWindow ou classe héritant de wxWindow. Dans le cas de la scrolledWindow, le EVT_PAINT est géré en fait en interne et utilise la méthode OnDraw : en gros ca doit ressembler à quelquechose comme ca :
Code wxWidgets: void OnPaint(wxPaintEvent &event) { wxMemoryDC memdc; ... OnDraw(memdc); // La est affiché l'image de 10000x1000px par exemple .. CalculBonnePosition(&x,&y); wxPaintDC dc(this); dc.Blit(0,0,GetSize().GetWidth(), GetSize().GetHeight(),&memdc, x, y); }
- question 2: wxMDIChildFrame n'a pas de OnDraw. wxMDIChildFrame est une fenêtre fille de wxMDIParentFrame. Que veux tu dessiner sur ta wxScrolledWindow ?
Sem
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1146
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Salut.
yannp a écrit:Ma première question : Quelle est le différence entre onDraw et onPaint ? Tu l'as prise où la méthode "OnDraw" ? Il me semble que normalement c'est l'événement "wxEVT_PAINT" que l'on connecte à une méthode de la frame (ou de tout autre contrôle) et prenant en paramètre un wxPaintEvent.
yannp a écrit:Comment puis-je faire pour "atteindre" ma wxScrolledWindow afin de dessiner dessus ? Dans le principe d'une méthode "OnPaint" :
Code wxWidgets:void winChild ::OnPaint(wxPaintEvent &event) { wxClientDC ScrolledWindowDC(The_wxScrolledWindow); // Tu peux maintenant te servir de la variable ScrolledWindowDC pour dessiner }
Ce code est destiné à pouvoir dessiner sur une fenêtre autre que celle recevant l'événement OnPaint. Dans le cas où tu utiliserais l'événement OnPaint de la wxScrolledWindow directement, il faut récupérer le wxPaintDC grâce au wxPaintEvent, et te servir de celui-ci pour dessinner.
Ça paraît un peu bizarre à comprendre, mais c'est la marche à suivre, alors, si tu as des doutes, n'hésites pas à redemander.
@+ Xav'
Edit : Grillé
Dernière modification par Xaviou (25-06-2010 19:01:52)
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
yannp (Membre)
Inscrit le : 02-06-2010
Messages: 59
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour,
Merci pour vos explications. Cela fonctionne, mais à l'exécution, j'ai l'impression qu'il passe tout le temps dans onPaint, à tel point qu'il faut faire ctrl alt supp pour l'arreter... ccl : j'ai dû faire une erreur. Voici ce que j'ai fait :
Code: EVT_PAINT(winChild::OnPaint) END_EVENT_TABLE()
Code: void winComposition::OnPaint(wxPaintEvent &event) { int i; wxClientDC ScrolledWindowDC(AffichagewxScrolledWindow); AffichagewxScrolledWindow.SetPen (*wxGREY_PEN); for (i=0;i<10;i+=1) AffichagewxScrolledWindow.DrawLine(1, i*2, 0, i*2);
Ce que je ne comprends pas non plus, c'est que si j'écris :
Code: void winComposition::OnPaint(wxPaintEvent &event) { wxPaintDC * MonDc = new wxPaintDC(this); } Ca n'a effectivement rien à voir avec ce que je veux faire, mais là il ne boucle plus ...
Merci pour votre aide.
Yann
Dernière modification par yannp (28-06-2010 11:34:44)
| |
|
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne |
bonjour, normalement, la règle est la suivante : wxPaintDC dans un OnPaint et seulement dans un OnPaint wxClientDC partout sauf dans OnPaint
donc dans ton cas, il vaudrait mieux :
Code wxWidgets:void winComposition::OnPaint(wxPaintEvent &event) { wxPaintDC ScrolledWindowDC(AffichagewxScrolledWindow); AffichagewxScrolledWindow.SetPen (*wxGREY_PEN); for (size_t i=0;i<10;++i) { AffichagewxScrolledWindow.DrawLine(1, i*2, 0, i*2); } }
Alors après, est-ce que AffichagewxScrolledWindow est parente ( fenêtre parente ou fille de winComposition) ? parcque cela pose peut-être des problèmes. Normalement, dans un OnPaint, on paint la fenêtre actuelle. Ce qui est dedans sera paint automatiquement. Tu voudrais faire quoi exactement ? Sem
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1146
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Hello
yannp a écrit:Ce que je ne comprends pas non plus, c'est que si j'écris :
Code: void winComposition::OnPaint(wxPaintEvent &event) { wxPaintDC * MonDc = new wxPaintDC(this); } Ca n'a effectivement rien à voir avec ce que je veux faire, mais là il ne boucle plus ... Effectivement, j'avais oublié celà : dans une méthode "OnPaint", il faut absolument créer une variable de type wxPaintDC même si tu ne l'utilises pas :
Doc wxWidgets a écrit:If you have an OnPaint handler, you must create a wxPaintDC object within it even if you don't actually use it. Ce qui donnerait, pour ta méthode OnPaint :
Code wxWidgets:void winComposition::OnPaint(wxPaintEvent &event) { // Le wxPaintDC obligatoire (et inutilisé) wxPaintDC pDC(this); int i; wxClientDC ScrolledWindowDC(AffichagewxScrolledWindow); AffichagewxScrolledWindow.SetPen (*wxGREY_PEN); for (i=0;i<10;i+=1) AffichagewxScrolledWindow.DrawLine(1, i*2, 0, i*2); }
Normalement, avec ça, ça ne devrait plus bloquer.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
yannp (Membre)
Inscrit le : 02-06-2010
Messages: 59
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour,
Effectivement ça ne bloque plus. Seulement lorsque je fais défiler le dessin (des droite et des courbes) à l'aide des scrollbar, quand je "reviens" il s'efface.. Mais lorsque je redimensionne la fenetre, le tout réapparait .. Je croyais que justement wxScrolledWindow gérait le défilement. Y a t il un évènement associé au scrolling ?
Merci
Yann
Dernière modification par yannp (29-06-2010 08:56:03)
| |
|
|