wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

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

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» onDraw
Conversation (Résolue) : onDraw
25-06-2010 17:01:57  onDraw #1
yannp (Membre)
Inscrit le : 02-06-2010
Messages: 61
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
25-06-2010 18:46:41  Re: onDraw #2
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
25-06-2010 18:54:38  Re: onDraw #3
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut.

yannp:
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:
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à...
28-06-2010 11:11:10  Re: onDraw #4
yannp (Membre)
Inscrit le : 02-06-2010
Messages: 61
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)

28-06-2010 17:42:34  Re: onDraw #5
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
28-06-2010 21:12:55  Re: onDraw #6
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1375
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Hello

yannp:
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:
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à...
29-06-2010 08:48:49  Re: onDraw #7
yannp (Membre)
Inscrit le : 02-06-2010
Messages: 61
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)

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» onDraw