IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

Logiciel de dessin réalisé avec wxWidgets


Sujet :

wxWidgets

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 20
    Points : 8
    Points
    8
    Par défaut Logiciel de dessin réalisé avec wxWidgets
    Hello,

    Voila, j'aimerais simplement savoir si vous connaissiez un "paint" facon windows ou un whiteboard open source qui utiliserais WxWidgets ?

    meeeerci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    La seule chose que je connaisse est BitWise mais je ne crois pas que ce soit open source.
    Tu cherches quoi ? Un composant qui servirait de tableau blanc pour plusieurs applis wxWidgets réparties sur un réseau ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    salut,

    ouais domaage qune soit pas open source .

    Un composant qui servirait de tableau blanc pour plusieurs applis wxWidgets réparties sur un réseau ?
    En faite nan, je voulais juste voir comment il avait construit leur "paint" avec wxWIdgets.

    Car je suis en train de dev un ptit whiteboard tout simple en c++ avec wxWidgets que lorsque je clique gauche sur la souris ca me dessine des traits (d'epesseur differentes) tout en stockant les coordoonees dans une liste.. mais plus je dessine de traits plus ca dessine a tooooout lentement et ca rame..

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par bibi9 Voir le message
    Car je suis en train de dev un ptit whiteboard tout simple en c++ avec wxWidgets que lorsque je clique gauche sur la souris ca me dessine des traits (d'epesseur differentes) tout en stockant les coordoonees dans une liste.. mais plus je dessine de traits plus ca dessine a tooooout lentement et ca rame..
    Bah. A ce moment, essaie d'isoler un peu de code et de le poster ici. Peut-être qu'on pourra t'aider.
    Quelques pistes de ma boule de cristal : des GDI non relachés ? De la fuite mémoire ? Une liste à la mano mal construite ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    hello,

    voici comment je procede:

    dans mon onPaint (j utilse un double buffer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void MyCanvas::OnPaint(wxPaintEvent& event)
     
    {
    	//Prepare Context for Buffered Draw
    	wxPaintDC dcc(this);
    	wxBufferedDC dc(&dcc, c_size );
    	DrawAll(dc);
    }
    j ai event "OnMotion" qui execute du code quand la souris fait du dragging

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (event.Dragging())
     
    	{
     
                           // pour peindre avec un carre de differente taille
                           this->GeneratePointsAccordingToBrush(event.GetPosition(),10);
                           this->Refresh();
                   }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    void MyCanvas::GeneratePointsAccordingToBrush (
        const wxPoint &centre, 
        unsigned int brushSize)
    {
     
     
            if (brushSize % 2 == 1) {
     
                unsigned int brushRadius = (brushSize - 1) / 2;
                for (int i = 0; i <= brushRadius; i++) {
     
                    for (int j = 0; j <= brushRadius; j++) {
     
                        if (i != 0 && j!= 0) {
                            mainPointList.push_back (wxPoint (centre.x + i, centre.y + j));
                            mainPointList.push_back (wxPoint (centre.x - i, centre.y - j));
                            mainPointList.push_back (wxPoint (centre.x + i, centre.y - j));
                            mainPointList.push_back (wxPoint (centre.x - i, centre.y + j));
     
                        } else if (j != 0) {
     
                            mainPointList.push_back (wxPoint (centre.x, centre.y + j));
                            mainPointList.push_back (wxPoint (centre.x, centre.y - j));
     
                        } else if (i != 0) {
     
                            mainPointList.push_back (wxPoint (centre.x + i, centre.y));
                            mainPointList.push_back (wxPoint (centre.x - i, centre.y));
                        }
                    }
                }
     
            } else {
                unsigned int offset = brushSize / 2 - 1;
                wxPoint lowerLeftCornerPoint = wxPoint (centre.x - offset, centre.y + offset);
     
                for (unsigned int i = 0; i < brushSize; i++) {
     
                    for (unsigned int j = 0; j < brushSize; j++) {
     
                        if (i != offset || j != offset) {
     
                            mainPointList.push_back (wxPoint (lowerLeftCornerPoint.x + i, lowerLeftCornerPoint.y - j));
                        }
                    }
                }
            }
    };
    Et la drawAll qui dessine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void MyCanvas::DrawAll(wxBufferedDC& bdc){
    bdc.Clear();
    PointList::iterator pointIt;
     
    for (pointIt = mainPointList.begin (); pointIt != mainPointList.end (); pointIt++) {
    wxPoint tempPoint = (*pointIt);
    	bdc.SetPen(*wxBLACK); 
    bdc.DrawPoint(tempPoint.x,tempPoint.y);
    }
    voici en gros comme je dessine, je met dans uen list tout le points que dessine et ensuite je boucle cette liste pour dessiner chaque points...

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Deux ou trois petites améliorations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void MyCanvas::DrawAll(wxBufferedDC& bdc){
       bdc.Clear();
       PointList::iterator pointIt;
     
       bdc.SetPen(*wxBLACK); // (1)
     
       for (
          pointIt = mainPointList.begin (); 
          pointIt != mainPointList.end (); 
          ++pointIt // (2)
       ) {
          bdc.DrawPoint(pointIt->x,(*pointIt).y); // (3)
       }
    }
    (1) : ça ne change pas dans la boucle. Donc pourquoi le faire à chaque itération ?
    (2) cf entrée de la F.A.Q.
    (3) Tu n'es pas obligé de créer un objet intermédiaire pour récupérer les valeurs. Un itérateur 'ressemble' à un pointeur. Tu le déréférences pour accéder aux membres. J'ai fais exprès de mettre les 2 écritures possibles.

    2 remarques :
    1/ Quelle est la taille de ton conteneur quand ça commence à ramer ?
    2/ Tu l'observes en debug ou en release ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    merci pour les ameliorations .

    et ca commence a ramer quand la taille de la liste est de 75 000 elements.
    je lance en mode debug.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par bibi9 Voir le message
    je lance en mode debug.
    Essaies en release. En mode debug, c'est possible que ça rame car il y a plus de verifs/moins d'optimisations.
    mainPointList c'est un std::vector ou un std::list ou autre chose ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    C'es un std::list.

    J'ai essayé en release et c'est pareil. mais je pense qu'il y a beacoup trop de point a afficher a chaque fois... mais je sais pas comment faire autrement

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Prend en charge le wxEraseEvent, fait le wxDC::clear dans ce contexte et enlève le de DrawAll.

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    J'ai pensé à autre chose. A chaque fois tu ne rajoutes qu'une poignée de points mais tu les redessines tous. Il serait plus profitable de se rappeler les points précédents qui n'ont pas changé et ne redessiner que les nouveaux. Pour cela, tu peux faire quelque chose comme ça :
    1/ Tu rajoutes un wxMemoryDC à la classe MyCanvas.
    2/ Dans le constructeur de MyCanvas, tu initialise correctement le memory DC
    3/ Tu rajoutes à MyCanvas une fonction AjouterPoint(ListeDePoints const&) qui dessine les points dans le mémory DC avec le pen/la brosse de ton choix.
    4/ (plus tard tu pourras rajouter une fonction SupprimerPoin(ListeDePoints const&) qui dessine les points dans le mémory DC avec le pen/la brosse d'arrière plan.
    5/ Dans MyCanvas::OnPaint tu n'as plus qu'à faire un blit entre le memory DC et le DC de la fenêtre.
    6/ Lorsque tu rajoutes des nouveaux points à mainPointList, tu appelles AjouterPoint sur les nouveaux points uniquement.
    Ceci n'est valable bien sur que si les points précédents ne bougent pas. A chaque étape, tu ne dessines ainsi que les nouveaux points (au pire 100 avec ta brosse 10x10) et le blit dans OnPaint devrait être plus rapide que de redessiner tous les points (~75 000 disais-tu).
    Je ne sais pas si j'ai été clair. N'hésites pas à demander des précisions.

  12. #12
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Hello,

    oui,oui c'est super claire !

    j'avais pensé utiliser le memoryDC mais je n'étais pas sur que que ca allait etre mieux que db

    je vais de ce pas essayer !

    merci

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ensuite, tu peux encore optimiser un peu en ne demandant le refresh (avec RefreshRect) que sur le rectangle englobant les points que tu ajoutes. Mais bon, pas sur que ça gagne vraiment.

    Tiens-nous au courant si ça marche

Discussions similaires

  1. Réponses: 50
    Dernier message: 26/04/2020, 21h44
  2. Réponses: 0
    Dernier message: 10/02/2011, 18h22
  3. Dessiner avec wxWidgets
    Par SuperPat dans le forum wxWidgets
    Réponses: 5
    Dernier message: 24/02/2009, 00h06
  4. Dessiner un graph avec wxwidget.
    Par EJekT4 dans le forum wxWidgets
    Réponses: 1
    Dernier message: 26/10/2006, 15h07
  5. dessiner avec wxWidgets
    Par [Hugo] dans le forum wxWidgets
    Réponses: 2
    Dernier message: 15/09/2006, 22h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo