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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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