IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC][IHM] lignes "cliquables"


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut [MFC][IHM] lignes "cliquables"
    bonjour à tous,

    je dois faire un programme qui affiche une carte en image de fond. Sur cette carte, mon programme trace des lignes entre divers points de la carte (à partir d'une bdd). Mon problème est au niveau de l'affichage graphique: je ne sais pas comment faire. A vrai dire, je ne sais même pas si c'est faisable.

    Les droites qui relient les points doivent avoir les carractéristiques suivantes:

    1/ elles changent de couleur quand le curseur de la souris passe dessus
    2/ elles sont "cliquables", c'est à dire qu'une fonction doit être appelée quand l'utilisateur clique dessus.

    Comment procederiez-vous?

  2. #2
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    Perso je ferait in tableau de mes object... Une structure contenant la position des object dessiner ainsi que un pointeur sur l'object meme ca pourait ressembler a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
          MonObject* obj;
          RECT rect
    }mMap;
    std::vector<m_Map>m_map;
    ensuite tu teste la position de la souris et la position de tes object

    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
    CPoint mouse_pos;
     
    std::vector<m_Map>::iterator i
    for(int i=m_map.begin();i<m_map.end();i++)
    {
        if(mouse_pos.x > (*i).rect.left &&
           mouse_pos.x < (*i).rect.rigth &&
           mouse_pos.y>(*i).rect.top &&
           mouse_pos.y<(*i).rect.bottom)
        {
        return (*i).obj;
        }
     
    }
    ...
    si tu na pas trop d'object ca devrait aller

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    erf, cette solution ne peut fonctionner car je peux avoir des lignes qui se croisent, ou même qui passent dans le même rectangle.

    Sinon, mon problème est surtout au niveau graphique. Je ne sais pas comment créer des objets "lignes" cliquables.

  4. #4
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    Ben il te faut récupérer le clic souris, ensuite, récupérer toutes les polylignes de ta BDD, tu les passent en coordonées écran, et pour chaque ligne de tes polylignes tu calcul la distance de ta ligne au point de clic et si elle est infèrieure à 2 ou 3 pixel (c'est à toi de voir la tolérance que tu veut donner à ton clic) tu l'a trouvée, et tu lui change son attribut couleur....

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    c'est donc la seule solution tu crois?

    Je pensais qu'il serait possible de créer un objet avec une partie graphique (un bmp par ex), une partie récupération d'event (appel d'une fonction quand on clique sur le bmp), et une partie data+fonctions. Cela eût été fort pratique

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    je viens de penser à une solution, je voulais vous demander votre avis avnat de me lancer dans con implémentation:

    Je créé un bitmap de 600x600 px, avec une palette de, allez, 16 couleurs. Sur ce bitmap, j'ai des points et des lignes. La feinte est la suivante: j'ai une matrice 2D de la taille de ma bitmap, càd 600x600. Et par exemple, les lignes sont de couleur rouge. Du coup, j'ai juste à tester une case de ma matrice (si c'est une case rouge->ok, le curseur est sur ma ligne) à chaque clic de souris -> super rapide.

    Cependant, il me reste le problème du changement de couleur de la ligne quand le curseur de la souris est dessus...

    Et, est-ce que ça ne va pas me prendre trop de mémoire?

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    bon... j'ai un peu de temps alors je vais essayer d'implémenter ça. Mais j'ai un premier soucis:

    Je vais faire un projet basé sur une boite de dialogue. Je vais donc y placer une bitmap.
    1ere question: comment récupérer les coordonnées du curseur de la souris?

  8. #8
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Ton problème m'a rappelé le livre de Visual C++ 6 de Ivor Horton

    Si tu l'as, il donne un très bon exmple de sélection des objets dessinés sur la vue. Lorsque la souris passe sur un objet il prend automatiquement la couleur de sélection et dès que la souris s'éloigne il reprend sa couleur.

    Je te le conseille vivement.
    Il faudra implémenté les fonctions de gestion de la souris comme OnMouseMove, etc

    Gabrielly

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    oui je l'ai (enfin, au bureau). Mais j'utilise visual7, tu crois que ça va marcher?

  10. #10
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Ce ne sera pas un problème de version mais ça va t'inspirer

  11. #11
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    tu sais la méthode de test peut être très rapide, en effet , tu doit d'abord faire dans un premier test si le clic souris est dans la BoundingBox de ta Polyligne. Ce test ce résume à 4 if et tu va éliminer 90 % des cas, ensuite seulement tu fais le tests pour toutes les lignes de tes polylignes...

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    okay, je suis en train de tester ça, je te tiendrais au courant au fur et à mesure.

    Le problème c'est que je bosse aussi sur une 01101101 01100101011100100110010001100101 en javascript qui est plus urgente et qui me 01100011 01100001011100110111001101100101 00100000011011000110010101110011 00100000011000110110111101110101 01101001011011000110110001100101 01110011 ^^

  13. #13
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    je sais pas quel est ton niveau et ton domaine, mais ta problématique est un problématique de SIG (Systeme d'Inormation Géographique), y'as pas mal de doc sur internet la-dessus...

Discussions similaires

  1. [MFC] selection ligne CListCtrl
    Par abignon dans le forum MFC
    Réponses: 3
    Dernier message: 25/06/2004, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo