Bonjour @ tous les développeurs,
Sujet du jour : la création d'un custom controle pour permettre l'affichage d'une courbe.
Contraintes : Développement en MFC pour Windows CE, IDE eMbedded Visual C++ 4.0.
Détails :
- Pour les besoins d'une application de visualisation d'une acquisition, j'ai besoin d'afficher des points sur un graphique.
- Création d'un Custom Control OK
- Ajout du Custom Control dans le projet OK
- Affichage du Custom Control OK
- Implementation du Custom Control .... Pas OK --> KO.
Explications :
- J'ai défini plusieurs variable membres pour les paramètres (Unités, Echelle, Taille, Couleur)
- Ensuite j'ai défini 2 CDC, un pour la grille et les éléments de celle-ci (m_dcGrid), et l'autre pour la courbe (m_dcPlot).
Il est évident que le m_dcPlot est plus petit que le m_dcGrid.
- Quand je place la grille sur mon dcGrid elle s'affiche parfaitement, cependant les points du dcPlot disparraissent ... c'est génant.
- J'ai alors cherché du coté du BitBlt entre les valeurs SRCAND, SRCPAINT, SRCCOPY ... mais apparament ça ne vient pas de là (si je change rectangle noir apparait)
- J'ai beau cherché partout, je retombe toujours sur les memes explications floues, Je ne souhaite pas faire quelques choses de compliqué, juste afficher des pixels en guise de courbe ! (SetPixel)
- Un dessin de que je souhaite faire et du code vous feront surement mieu comprendre :
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 void CGraph::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, m_nClientWidth, m_nClientHeight) ; oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ; if (memDC.GetSafeHdc() != NULL) { memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcGrid, 0, 0, SRCCOPY) ; memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcPlot, 0, 0, SRCPAINT) ; dc.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &memDC, 0, 0, SRCCOPY) ; } memDC.SelectObject(oldBitmap) ; // Do not call CWnd::OnPaint() for painting messages }
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
50 void CGraph::InvalidateCtrl() { CClientDC dc(this) ; CPen *oldPen ; CPen solidPen(PS_SOLID, 0, m_crGridColor) ; if (m_dcGrid.GetSafeHdc() == NULL) { m_dcGrid.CreateCompatibleDC(&dc) ; m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ; m_bitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid) ; } m_dcGrid.SetBkColor (m_crBackColor) ; m_dcGrid.FillRect(m_rectClient, &m_brushBack) ; m_dcGrid.SetTextColor (m_crGridColor) ; oldPen = m_dcGrid.SelectObject (&solidPen) ; m_dcGrid.MoveTo (m_rectPlot.left-1, m_rectPlot.top-1) ; m_dcGrid.LineTo (m_rectPlot.right+1, m_rectPlot.top-1) ; m_dcGrid.LineTo (m_rectPlot.right+1, m_rectPlot.bottom+1) ; m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.bottom+1) ; m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.top-1) ; m_dcGrid.SelectObject (oldPen) ; //InvalidateRect(m_rectClient) ; if (m_dcPlot.GetSafeHdc() == NULL) { m_dcPlot.CreateCompatibleDC(&dc) ; m_bitmapPlot.CreateCompatibleBitmap(&dc, m_nPlotWidth, m_nPlotHeight) ; m_bitmapOldPlot = m_dcPlot.SelectObject(&m_bitmapPlot) ; } m_dcPlot.SetBkColor (m_crBackColor); //m_dcPlot.FillRect(m_rectPlot, &m_brushBack); //CPen solidPenPlot(PS_SOLID, 0, m_crPlotColor) ; //oldPen = m_dcPlot.SelectObject (&solidPenPlot); m_dcPlot.SetPixel(120,20,m_crGridColor); m_dcPlot.SetPixel(120,21,m_crGridColor); m_dcPlot.SetPixel(121,20,m_crGridColor); m_dcPlot.SetPixel(121,21,m_crGridColor); //m_dcPlot.SelectObject (oldPen) ; //InvalidateRect(m_rectPlot) ; }Pour ceux qui n'ont pas compris clairement ce que j'ai expliqué plus haut je reformule, avec le code ci-dessus, ça devrait etre plus facile.
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 void CGraph::DrawPlot(int x, int y, COLORREF color) { if (x >= this->m_XMax) { this->m_XMax = x+1; } if (y >= this->m_YMax) { this->m_YMax = y+1; } m_dcPlot.SetPixel(this->m_rectPlot.left+x, this->m_nPlotHeight-y, color); this->InvalidateCtrl(); }
J'ai 2 zones d'affichages, la partie grille dcGrid et la partie courbe dcPlot.
La zone dcGrid d'affiche bien, par contre la zone dcPlot n'affiche rien (m_dcPlot.SetPixel() qui ne fait rien)
Qu'est ce que j'ai oublié de faire ?
Merci de vos réponses, quelles qu'elles soient !
Partager