Bonjour,

Je suis confronté à un bug étrange

J'ai une application graphique, qui dessine des rectangles de selection sur une image avec la technique bien connue NOT XOR PEN

Le rectangle n'est pas assez visible.
J'ai donc fait une petite modification pour en dessiner un plus épais :

Le code original :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
					if (selektion_vorhanden>1) {
						pDC->SetROP2(R2_NOTXORPEN);
						pDC->Rectangle(&m_rect);
					}
					selektion_vorhanden = 1;
					m_rect.top = y;
					m_rect.left = x;
Le code modifié :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
					if (selektion_vorhanden>1) {
						pDC->SetROP2(R2_NOTXORPEN);
						trace_rect_rect2(pDC); //pDC->Rectangle(&m_rect);
					}
					selektion_vorhanden = 1;
					m_rect.top = y;
					m_rect.left = x;
J'ai remplacé partout les appels de

Code : Sélectionner tout - Visualiser dans une fenêtre à part
pDC->Rectangle(&m_rect);
par

qui est une fonction que j'ai créé dont voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
void trace_rect_rect2(CDC* pDC) {
	m_rect2.CopyRect(m_rect);
	m_rect2.InflateRect(1, 1);
	pDC->Rectangle(&m_rect);
	pDC->Rectangle(&m_rect2);
}
Cette fonction est appelée par différentes procédures qui gèrent les évenements liés à la souris et à l'affichage :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
void CShiftNView::OnDraw(CDC* pDC)
void CShiftNView::OnLButtonDown(UINT nFlags, CPoint point) 
void CShiftNView::OnMouseMove(UINT nFlags, CPoint point) 
void CShiftNView::OnRButtonDown(UINT nFlags, CPoint point) 
void CShiftNView::OnLButtonUp(UINT nFlags, CPoint point)
void CShiftNView::OnRButtonUp(UINT nFlags, CPoint point)
Le bug est le suivant : quand je manipule la souris un peu vite, les rectangles précédents se sont pas bien effacés :

Nom : 2026_07_14_bug.jpg
Affichages : 88
Taille : 1,19 Mo

Le bug ne se produit pas si je trace pas m_rect tout seul :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
void trace_rect_rect2(CDC* pDC) {
	m_rect2.CopyRect(m_rect);
	m_rect2.InflateRect(1, 1);
	pDC->Rectangle(&m_rect); // affichage correct sans bug
	//pDC->Rectangle(&m_rect2);
}
mais le bug se produit aussi si je trace m_rect2 tout seul :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
void trace_rect_rect2(CDC* pDC) {
	m_rect2.CopyRect(m_rect);
	m_rect2.InflateRect(1, 1);
	//pDC->Rectangle(&m_rect);
	pDC->Rectangle(&m_rect2); // le bug se produit
}
C'est comme si m_rect était modifié par le reste du code pendant que la fonction trace_rect_rect2(CDC* pDC) était executée

Le bug est aussi présent si je déclare la fonction inline, même en ne traçant que m_rect2 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
inline void trace_rect_rect2(CDC* pDC) {
	m_rect2.CopyRect(m_rect);
	m_rect2.InflateRect(1, 1);
	//pDC->Rectangle(&m_rect);
	pDC->Rectangle(&m_rect2);
}
Le bug se produit aussi avec cette variante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
inline void trace_rect_rect2(CDC* pDC) {
	pDC->Rectangle(&m_rect);
	pDC->Rectangle(m_rect.left-1, m_rect.top-1, m_rect.right+1, m_rect.bottom+1);
}
Comme mon code ne fait qu'agrandir le rectangle, le problème n'est pas lié à un rectangle de taille nulle ou négative

A bientôt