Tout d'abord, pour simplifier les choses, on va stocker les données importantes au lieu de simplement les calculer.
Donc dans C...Dlg.h, juste après HICON m_hIcon;, ajoute:
	
	| 12
 3
 4
 5
 6
 7
 8
 
 |  
	int m_Largeur;	// largeur de la zone de dessin
	int m_Hauteur;	// sa longueur
 
	CPoint m_Centre;	// la position du centre de la zone de dessin
	CPoint m_Rond;		// la position courante du rond blanc
 
	bool m_bButtonDown;	// est ce que le bouton de la souris est enfoncé | 
 Et du coup, il faut donner une valeur initiale a ces variables, en rajoutant le code
suivant dans C...Dlg.cpp (juste après le commentaire "TODO: Add your specialized code here")
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 |  
BOOL CTestDlg::OnInitDialog()
{
	... code existant ...
 
	// recuperation des coordonnées de la zone de dessin
	CRect r;
	m_Dessin.GetWindowRect(&r);
 
	// infos sur la zone de dessin
	m_Largeur = r.right-r.left;
	m_Hauteur = r.bottom-r.top;
	m_Centre.x = m_Largeur/2;
	m_Centre.y = m_Hauteur/2;
 
	// le rond commence au centre
	m_Rond = m_Centre;
 
	... return TRUE déjà présent ...
} | 
 Du coup le code dans OnPaint() est allégé, il se limite à :
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 |  
	// device context
	CPaintDC dc(&m_Dessin);
 
	// le repere centré
	dc.MoveTo(m_Centre.x, 0);
	dc.LineTo(m_Centre.x, m_Hauteur);
	dc.MoveTo(0, m_Centre.y);
	dc.LineTo(m_Largeur, m_Centre.y);
 
	// afficher le rond blanc au bon endroit
dc.Ellipse(m_Rond.x-10,m_Rond.y-10,m_Rond.x+10,m_Rond.y+10); | 
 Et enfin on peut s'occuper du déplacement. Tu créés une fonction qui va tester ce déplacement et le traiter (ici, typiquement, faire bouger le robot)
Dans C...Dlg.h (à la suite des variables ajoutées toute à l'heure):
	
	void TestDeplacementMire(CPoint point);
 
Dans C...Dlg.cpp (à la fin du fichier):
	
	| 12
 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
 
 |  
void CTestDlg::TestDeplacementMire(CPoint point)
{
	// on récupere les coordonnées de la zone de dessin
	CRect r;
	m_Dessin.GetWindowRect(&r);
	ScreenToClient(&r);
 
	// on teste si la souris est dedans
	if (   point.x > r.left+10 && point.x < r.right-10
		&& point.y > r.top+10 && point.y < r.bottom-10 )
	{
		// calculer le nouvelle position du rond blanc
		m_Rond.x = point.x - r.left;
		m_Rond.y = point.y - r.top;
 
		// re-dessiner la fenetre
		// (a revoir -> marche pas très bien)
		Invalidate(FALSE);
 
		// les coordonnées du vecteur déplacement sont:
		//
		// ( m_RondX - m_CentreX ) / m_Largeur
		// ( m_RondY - m_CentreY ) / m_Hauteur
		//
		// faire avancer/tourner le robot
		// en fonction de ce vecteur
	}
} | 
 
Et enfin, il n'y a plus qu'à appeler cette fonction quand l'utilisateur bouge la souris ou clique.
Dans le Class-Wizard (Ctrl+W), vas dans "Message maps", et choisis "C...Dlg" dans la liste déroulante de droite.
Dans la liste en dessous, vers le milieu, tu devrais trouver WM_LBUTTONDOWN, WM_LBUTTONUP et WM_MOUSEMOVE. Ajoute une fonction pour chacun de ces messages, et mets-y le code suivant:
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 |  
void C...Dlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	m_bButtonDown = true;	// le bouton a été enfoncé
	TestDeplacementMire(point);	// et on teste le déplacement
 
	CDialog::OnLButtonDown(nFlags, point);
}
 
 
void C...Dlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// si le bouton est enfoncé
	if (m_bButtonDown)
		TestDeplacementMire(point);	// on teste le déplacement
 
	CDialog::OnMouseMove(nFlags, point);
}
 
 
void C...Dlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	m_bButtonDown = false;	// le bouton n'est plus enfoncé
 
	CDialog::OnLButtonUp(nFlags, point);
} | 
 
Et voilà, tu devrais obtenir quelquechose comme sur cette image...

Si quelqu'un pouvait juste éclaircir le point "rafraichissement de la fenetre" ça serait sympa 
Parceque l'effet obtenu est plutôt spécial  
						
					
Partager