Hello,
Voila, j'aimerais simplement savoir si vous connaissiez un "paint" facon windows ou un whiteboard open source qui utiliserais WxWidgets ?
meeeerci
Hello,
Voila, j'aimerais simplement savoir si vous connaissiez un "paint" facon windows ou un whiteboard open source qui utiliserais WxWidgets ?
meeeerci
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 ?
salut,
ouais domaage qune soit pas open source .
En faite nan, je voulais juste voir comment il avait construit leur "paint" avec wxWIdgets.Un composant qui servirait de tableau blanc pour plusieurs applis wxWidgets réparties sur un réseau ?
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..
hello,
voici comment je procede:
dans mon onPaint (j utilse un double buffer)
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 void MyCanvas::OnPaint(wxPaintEvent& event) { //Prepare Context for Buffered Draw wxPaintDC dcc(this); wxBufferedDC dc(&dcc, c_size ); DrawAll(dc); }
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(); }
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
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 ¢re, 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)); } } } } };
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...
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); }
Deux ou trois petites améliorations :
(1) : ça ne change pas dans la boucle. Donc pourquoi le faire à chaque itération ?
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) } }
(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 ?
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.
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
Prend en charge le wxEraseEvent, fait le wxDC::clear dans ce contexte et enlève le de DrawAll.
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.
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
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
Partager