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:
1 2 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")
1 2 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 à :
1 2 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):
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
|
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:
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
|
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