non ?Code:
1
2 void CGraphMotoman::DrawLine(CDC &dcplot,int x1, int x2, int y1, int y2, COLORREF color)
la fonction drawline est bien appelée uniquement de l'endroit ou est créé le dc ?
sinon ça ne vas pas pb de conception.
Version imprimable
non ?Code:
1
2 void CGraphMotoman::DrawLine(CDC &dcplot,int x1, int x2, int y1, int y2, COLORREF color)
la fonction drawline est bien appelée uniquement de l'endroit ou est créé le dc ?
sinon ça ne vas pas pb de conception.
ah :?
Donc j'ai un problème de conception ...
Le but de ce controle graphique personnalisé est justement d'etre utiliser dans une CFormView.
Mon projet (version de base) se compose d'une CFormView sur laquelle est disposé un CButton et un CGraph (mon controle personnalisé)
Quand je clique sur mon CButton, je lance une acquisition de valeurs.
Selon les valeurs, j'affiche soit un pixel par valeur soit des lignes (bientot des courbes de bézier).
Donc à partir de ma CFormView je dois avoir accès aux fonctions de dessin de mon CGraph ...
Je ne voyais pas d'autres solutions ... surement parce que c'etait la plus simple.
[Edit] Je dois avouer que ma connaissance des MFC se fait par de l'auto-formation ... et donc je n'en connais pas toutes les subtilités.
Existe t-il des cours de formation pour les MFC ?
globalement ça va ,
ce qui ne vas pas c'est de créer un dc mémoire permanent (puisque c'est une donnée membre de ta classe) , avec un dc local à une fonction .
ce dernier étant détruit quand tu sors de ta fonction.
le problème est plus C++ que MFC .
pour moi:
il doit y avoir une fonction draw général appelée en cas de repaint.
cette méthode doit etre capable de tout redessiner .
elle construit un dc général + 1 dc en mémoire .
toutes les fonctions appelées a partir de cette méthode utilisent ces dc (passage en référence du dc).
Ok jusque là je te suis,
En fait ma fonction Draw et mes fonctions de dessins utilisent le meme dc.
Ma fonction Draw n'est appelée que dans la classe CGraph --> dans les fonctions Set*().
Cette fonction telle que je l'ai conçue permet l'affichage global de mon contour, c'est à dire les lignes de contour du dessin, les noms des unités et les échelles.
Elle n'affiche aucun points de mon acquisition, ce sont les autres fonctions de dessin qui s'en charge.
Et j'appelle manuellement la fonction Invalidate() qui compose mon controle basé sur CWnd.
En gros actuellement voila ce que je fais :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 // create the control m_Graph.Create(WS_VISIBLE | WS_CHILD, rect, this, IDC_CUSTOM_GRAPH) ; // Création du controle m_Graph.SetBackColor(COLOR_FOND); // Changer la valeur + redessiner m_Graph.SetGridColor(COLOR_WHITE_ON); // Changer la valeur + redessiner m_Graph.SetTextColor(COLOR_WHITE_ON); // Changer la valeur + redessiner m_Graph.SetPlotColor(RGB(255,0,0)); // Changer la valeur + redessiner m_Graph.SetXRange(10,50); // Changer la valeur + redessiner m_Graph.SetYRange(10,100); // Changer la valeur + redessiner m_Graph.SetXUnit(L"Temps en seconde"); // Changer la valeur + redessiner m_Graph.SetYUnit(L"Couple en Nm"); // Changer la valeur + redessiner int i = 0; while (i < 0) { m_Graph.DrawPlot(i, i*10, RGB(255,255,255)); // Ajout d'un pixel i++; } UpdateWindow(); // Redessiner la fenetre CFormView m_Graph.Invalidate(); // Redessiner le controle
oui cela me semble correcte ...
si tu as réglé le problème évoqué sur le dc.
Comment peux t-on avoir un dc local alors qu'il doit etre utilisé dans plusieurs fonction --> Par exemple OnPaint !
Si dcPlot est local à la fonction Draw, comment je fais pour l'utiliser dans la fonction OnPaint ???Code:
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 /** @brief Fonction de demande d'affichage du dessin @param none. @return none. @endcode */ void CGraphMotoman::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CDC memDC; CBitmap memBitmap; CBitmap* oldBitmap; memDC.CreateCompatibleDC(&dc); memBitmap.CreateCompatibleBitmap(&dc, this->m_nClientWidth, this->m_nClientHeight); oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap); if (memDC.GetSafeHdc() != NULL) { memDC.BitBlt(0, 0, this->m_nClientWidth, this->m_nClientHeight, &dcPlot, 0, 0, SRCCOPY); dc.BitBlt (0, 0, this->m_nClientWidth, this->m_nClientHeight, &memDC, 0, 0, SRCCOPY); } memDC.SelectObject(oldBitmap) ; // Do not call CWnd::OnPaint() for painting messages }
Et comment j'accède à mon dc dans les fonctions de dessin ? il faut que j'en créé un local à chaque fois ? c'est pas propre ça ...
Draw n'est pas appelée par OnPaint ?
si ce n'est pas le cas tu as deux méthodes séparées alors c'est deux dc différents qui sont relâchés a chaque fois.
n'oublie pas que ton dessin doit pouvoir se reconstruire en cas de recouvrement....
Oui je suis en train de voir les gros problème de conception ...
Et je pense que ce n'est que le début :?
Aurais tu un exemple de controle personnalisé très propre au niveau de la conception ? que j'arrete de t'embeter avec mes questions ...
ça me servira de base pour que je refasse la conception
non ,mais je pense que ce genre d'article devrait te convenir:
http://www.codeguru.com/cpp/controls...cle.php/c2333/
C'est presque ça que je cherche à faire ! Mais sous WinCE et sans aspect temps réél !
Par contre le code ressemble étrangement à un autre article pour les graphiques en temps réél pour WindowsCE sur lequel je me suis basé pour faire mon propre controle : http://www.codeproject.com/KB/mobile/graph.aspx
Et le problème c'est que tous les dc sont des données membres ... or tu m'as dit que ce n'etait pas bien ...
Donc soit je fais comme dans le code de ces exemples ... soit je refait un controle très propre avec une conception différente ...
J’ai regardé le source en question
Si tu remarques bien chaque fonction de dessin est dans la classe pas en dehors et InvalidateCtrl Ou Invalide est appelé pour transférer le dc en mémoire sur la dc final dans OnPaint.
Ce que je ne pensais pas être possible c’est de créer un dc compatible en mémoire a partir d’un dc local qui est ensuite détruit, apparemment il n’y a pas de lien entre les deux autant pour moi.:?
Le dc en mémoire est permanent c’est son contenu qui est envoyé en cas de repaint.
J'avais peur que tu me dises cela ...
Bon alors je refait tout comme c'etait avant vu que ça fonctionnait bien.
Je te remercie quand meme pour m'avoir aider à comprendre ...
Je vais vérifier certaines choses concernant le recouvrement ;)
Merci pour tout farscape !