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 :

zonne cliquable dans une fenêtre


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut zonne cliquable dans une fenêtre
    bonjours a tous

    voila ,ma question est tres simple :

    comment dois-je m'y prendre pour declencher un evenement au passage de la souris sur une region (un losange par exp) dans une simple fenêtre ?
    (nom des fonctions)

    quelqu'un pourrait-il m'eclairer svp ?

  2. #2
    Membre chevronné
    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
    Par défaut
    Il te faut capter l'evenement OnMouseMove, récupérer la position de la souris, eventuellement passer en coordonnées absolue, et tester par rapport à la position de ta forme...

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    tu interceptes le message WM_MOUSEMOVE sur la fenetre .
    tu obtiens un objet CPoint qui contient les coordonnées x,y du curseur .
    il te reste a voir si elles sont contenues dans la surface de ta region pour agir


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    merci pour vos reponses !

    WM_MOUSE ok pour l'evenement mais ça se passe comment pour definir la region ?
    je veux dire par la , est-ce qu'il n'y a pas de commande precise genre drawregion un truc comme ça ?

    je peut effectivement faire une correspondance entre l'endroit ou se trouve la souris et la zone de reaction ,sur un carré c'est simple ,mais pour un losange je vois pas du tout .

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ouai c'est une bonne question lol,
    présentement comme je connais pas la méthode, alors on va ruser ...

    j'essaierais la chose suivante :

    utiliser la classe CRgn (region).
    definir l'objet par :
    CRgn::CreatePolygonRgn
    BOOL CreatePolygonRgn( LPPOINT lpPoints, int nCount, int nMode );
    exemple MSDN:
    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 ptVertex[5];
     
    ptVertex[0].x = 180;
    ptVertex[0].y = 80;
    ptVertex[1].x = 100;
    ptVertex[1].y = 160;
    ptVertex[2].x = 120;
    ptVertex[2].y = 260;
    ptVertex[3].x = 240;
    ptVertex[3].y = 260;
    ptVertex[4].x = 260;
    ptVertex[4].y = 160;
     
    VERIFY(rgnA.CreatePolygonRgn( ptVertex, 5, ALTERNATE));
    au final vu que c'est un objet GDI je ferais la chose suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bool PointInLosange (CPoint pt,LPPOINT lpPtLosange)
    {
           CRgn rgn;
           VERIFY( rgn.CreatePolygonRgnt(lpPtLosange,4,ALTERNATE));
           return (rgn.PtInRegion(pt)?true:false);
    }
    pt c'est le point a tester ,lpPtLosange le tableau de quatre points definissant le losange.

    ps : si quelqu'un connait la methode pour savoir si un point
    est dans une region definie par un nombre de point ça me plairait bien
    (pur curiosité intellectuelle )



  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    oui pour un losange uniquement ,mais je souhaite pouvoir changer a volontée la forme (c'est pour des boutons personnalisés basé sur des images qui simulent une selection ,un clic et normal)

    eh bien comme les zones sont pas trop grande et que je fait que 2 buttons j'ai defini un boleen suivant:

    BOOL ButtonReg1(int Px,int Py)
    {
    if ((Py == 5) && (Px > 30) && Px < 68) return true;
    if ((Py == 6) && (Px > 31) && Px < 69) return true;
    if ((Py == 7) && (Px > 32) && Px < 70) return true;
    if ((Py == 8) && (Px > 33) && Px < 71) return true;
    if ((Py == 9) && (Px > 34) && Px < 72) return true;
    if ((Py == 10) && (Px > 35) && Px < 73) return true;
    if ((Py == 11) && (Px > 36) && Px < 74) return true;
    if ((Py == 12) && (Px > 37) && Px < 75) return true;
    if ((Py == 13) && (Px > 38) && Px < 76) return true;
    if ((Py == 14) && (Px > 39) && Px < 77) return true;
    if ((Py == 15) && (Px > 40) && Px < 78) return true;
    if ((Py == 16) && (Px > 41) && Px < 79) return true;
    if ((Py == 17) && (Px > 42) && Px < 80) return true;
    if ((Py == 18) && (Px > 43) && Px < 81) return true;
    if ((Py == 19) && (Px > 44) && Px < 82) return true;
    if ((Py == 20) && (Px > 45) && Px < 83) return true;
    if ((Py == 21) && (Px > 45) && Px < 84) return true;
    if ((Py == 22) && (Px > 46) && Px < 85) return true;
    if ((Py == 23) && (Px > 47) && Px < 86) return true;
    if ((Py == 24) && (Px > 48) && Px < 87) return true;
    if ((Py == 25) && (Px > 49) && Px < 88) return true;

    else return false;
    }


    dans l'evenement "WM_MOUSEMOVE" :

    if (ButtonReg1(LOWORD(lParam),HIWORD(lParam))) b1s();
    else bn();

    b1s c'est bouton 1 selectionné
    bn c'est bouton normal

    ça marche mais , quand on quitte trop vite la region en question "bn" ne marche pas

    pour y remedier je pense faire une boucle qui verrifie la presence de la souris dans la zone ,et mon probleme maintenant c'est de retrouver la position de la souris par rapport a la zone fenetre

    (tant que la souris est dans la zone :ne rien faire ,mais si la souris n'y es pas :faire une action)
    si quelqu'un connait ...

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    re,
    tu as demandé un losange j'ai fais une fonction PtInLosange ,maintenant le meme systeme peut etre adapté a toute forme de region:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bool PointInRgn (CPoint pt,int nsommet,LPPOINT lparPoint)
    {
           CRgn rgn;
           VERIFY( rgn.CreatePolygonRgnt(lparPoint,nsommet,ALTERNATE));
           return (rgn.PtInRegion(pt)?true:false);
    }
    pour la position de la souris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    POINT mousePosition;
    ::GetCursorPos( &mousePosition );
    this->ScreenToClient(&mousePosition);     // client coordinates of mouse position

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    ah ok merci

    donc ptVertex[0].x = 180; etc c'est tout les points de derivation de ligne qui sert a former la zone ok

    bien je vais tester tout ça ,encore merci

  9. #9
    Membre chevronné
    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
    Par défaut
    salut, j'ai pas tout lu mais en ce qui concerne l'inclusion d'un point dans un polygone tu peut déjà tester si il est dans le rectangle englobant (Bounding Box).

    En gros sa revient à faire un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(Pnt->X >= X0 && Pnt->X <= X1 && Pnt->Y >= Y0 && Pnt->Y <= Y1)
        { Inside = true;}
    Ou Pnt est un objet point avec X, et Y et ou X0, Y0 sont les coordonnées inférieure gauche et X1, Y1 les coordonées supérieur droite.

    Ensuite si ce test est vrai, il faut s'assurer que le point est dans le polygon, pour ça il suffit de tracer un segment entre le point en question et un point en dehors de la Bounding Box et compter le nombre d'intersections.
    Si c'est pair c'est à l'exterieur, si c'est impair c'est à l'interieur...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    aie !!!

    je debute quand même un peu dans la programmation alors je vais faire plus simple ,parce que "bounding box" est nouveau pour moi
    voila dons une partie du code:

    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
     
    case WM_MOUSEMOVE:
    {
    if (ButtonReg1(LOWORD(lParam),HIWORD(lParam)))
    {
    b1s(); //permet de changer l'image qui donne l'effet selectionné button 1
    RgnVerrify1();
    }
    if (ButtonReg2(LOWORD(lParam),HIWORD(lParam)))
    {
    b2s();//permet de changer l'image qui donne l'effet selectionné button 2
    RgnVerrify2();
    }
    }
    break;
    tout est dans une dll donc je me sert uniquement de la procedure CALLBACK
    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
     
    BOOL ButtonReg1(int Px,int Py)
    {
    	if ((Py == 5) && (Px > 30) && Px < 68) return true;
    	if ((Py == 6) && (Px > 31) && Px < 69) return true;
    	if ((Py == 7) && (Px > 32) && Px < 70) return true;
    	if ((Py == 8) && (Px > 33) && Px < 71) return true;
    	if ((Py == 9) && (Px > 34) && Px < 72) return true;
    	if ((Py == 10) && (Px > 35) && Px < 73) return true;
    	if ((Py == 11) && (Px > 36) && Px < 74) return true;
    	if ((Py == 12) && (Px > 37) && Px < 75) return true;
    	if ((Py == 13) && (Px > 38) && Px < 76) return true;
    	if ((Py == 14) && (Px > 39) && Px < 77) return true;
    	if ((Py == 15) && (Px > 40) && Px < 78) return true;
    	if ((Py == 16) && (Px > 41) && Px < 79) return true;
    	if ((Py == 17) && (Px > 42) && Px < 80) return true;
    	if ((Py == 18) && (Px > 43) && Px < 81) return true;
    	if ((Py == 19) && (Px > 44) && Px < 82) return true;
    	if ((Py == 20) && (Px > 45) && Px < 83) return true;
    	if ((Py == 21) && (Px > 45) && Px < 84) return true;
    	if ((Py == 22) && (Px > 46) && Px < 85) return true;
    	if ((Py == 23) && (Px > 47) && Px < 86) return true;
    	if ((Py == 24) && (Px > 48) && Px < 87) return true;
    	if ((Py == 25) && (Px > 49) && Px < 88) return true;
     
    	else return false;
    }
    la c'est pour definir ma zone

    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
     
    void RgnVerrify1()
    {
    	POINT pt;
    //	UINT nFlags = 0;
    	int infBulle = 0;
    loop:
    //	IBulle();
    	GetCursorPos(&pt);
        ScreenToClient(winHandle,&pt);
    	int PosX = pt.x;
        int PosY = pt.y;
    	if (ButtonReg1(PosX,PosY)) goto loop;
     
        ToolBarBackground();
    }
    void RgnVerrify2()
    {
    	POINT pt;
    loop:
    	GetCursorPos(&pt);
        ScreenToClient(winHandle,&pt);
    	int PosX = pt.x;
        int PosY = pt.y;
    	if (ButtonReg2(PosX,PosY)) goto loop;
        ToolBarBackground();
    }
    ça C'est pour verrifier si la souris esst encore dans la zone

    tout marche impecable sauf :

    l'evenement WM_LBUTTONDOWN j'ais donc pensé a continuer sur le void "RgnVerrify" et controler si le bouton gauche est enfoncé a chaques passages dans l'espece de boucle loop (j'y travaille en tout cas)

    il me manque encore le parametre qui permet de controler ça ,alors si quelqu'un a une idée !

    merci en tout cas a tous pour tout les renseignements c bien la premiere fois ou on m'aide aussi bien , c'est gentil de votre part

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    j'ai pas bien compris le passage sur WM_LBUTTONDOWN

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    pas grave je reexplique :

    pour donner l'aspect enfoncé de mon bouton de dois changer l'image donc
    intercepter l'evenement WM_LBUTTONDOWN ;mais ça marche pas a vrai dire ,je dois cliquer 2 fois dessus
    je prefere donc utiliser la boucle "loop" et controler a chaques passage si le bouton gauche est enfoncé ,je pense que c'est la meilleure solution

    tout ça se fait donc hors evement WM_MOUSEMOVE ,je ne peu pas utiliser les parametres originaux

    je sait qu'il me faut un pointeur , mais je ne sait pas comment faire

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    au cas ou :
    la classe CBitmapButton permet de faire un bouton avec des bitmaps.
    la fonction loadBitmaps permet d'avoir un bitmap specifique par evenements.
    Citation Envoyé par MSDN
    CBitmapButton::LoadBitmaps
    BOOL LoadBitmaps( LPCTSTR lpszBitmapResource, LPCTSTR lpszBitmapResourceSel = NULL, LPCTSTR lpszBitmapResourceFocus = NULL, LPCTSTR lpszBitmapResourceDisabled = NULL );

    BOOL LoadBitmaps( UINT nIDBitmapResource, UINT nIDBitmapResourceSel = 0, UINT nIDBitmapResourceFocus = 0, UINT nIDBitmapResourceDisabled = 0 );
    sinon si tu veux rester dans cette voie il est plus facile de surcharger la fonction DrawItem et de tester l'etat du bouton pour choisir le dessin a faire.
    le button doit avoir la proprieté BS_OWNERDRAW.
    pour tester l'etat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
     
     if (lpDrawItemStruct->itemState & ODS_SELECTED)
    {
    }
     
    if (lpDrawItemStruct->itemState & ODS_FOCUS)
    {
    }
    //....
    }

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Par défaut
    j'ai trouvé une solution j'espere qu'elle sera bien :

    http://www.developpez.net/forums/vie...51a524a19162ce

Discussions similaires

  1. [WD17] Champs inactifs dans la zonne interne d'une fenêtre mère mdi
    Par indefini dans le forum WinDev
    Réponses: 2
    Dernier message: 05/05/2015, 09h34
  2. Modification d'un label cliquable dans une même fenêtre
    Par simtim dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 29/04/2007, 13h07
  3. Perte de gestionnaire d'événements dans une fenêtre
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 15
    Dernier message: 23/08/2004, 20h14
  4. Supprimer la croix dans une fenêtre modale
    Par AnneOlga dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/01/2004, 14h52
  5. [JDialog] Modification dans une fenêtre
    Par cefabien dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 01/10/2003, 13h18

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