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 :

Visual C++ 6 - MFC - GetPixel


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut Visual C++ 6 - MFC - GetPixel
    Bonjour,
    Je voudrais récupérer la couleur d'un point situé sur une ligne à l'aide de GetPixel() en utilisant un événement LBUTTONDOWN et les coordonnées de la souris.
    Le contexte est une boîte de dialogue contenant un contrôle Picture>Rectangle>Black. La ligne est dessinée en blanc sur fond noir dans ce contrôle.Je récupère toujours la couleur du fond.
    J'ai fait des essais en dessinant un triangle de surface blanche et en cliquant à l'intérieur. Il arrive que je récupère la couleur blanche vers le centre mais en me rapprochant des limites de la figure je perds la couleur blanche et retrouve la couleur du fond.
    Il y a donc un problème entre les coordonnées de la souris et celles du GetPixel().
    Pourriez-vous me donner la solution ? (J'ai essayé DPtoLP() sans résultat....)

    A l'avance merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455
    Par défaut
    Effectivement, les repères changent entre les coordonnées de la souris et le contexte graphique d'affichage des fenêtres. DPtoLP() est l'une des méthodes de changement de repères.

    Pouvez-vous donner un code complet illustrant votre problème ?

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    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
    void CDrawingView::LButtonDown(UINT nFlags, CPoint point) 
    {	
                COLORREF nColor;
    	char buff[100];
    	CDC* pdc=GetDC();
     
    	nColor= pdc->GetPixel( point.x, point.y );
     
    	wsprintf(buff,"%i ---  %i / %i",nColor, point.x,point.y);
     
    	pDXF->SetWindowText(buff);
     
                 SetCapture();
    	PrevMousePnt = point;
    	m_Pan = true;
    	CStatic::OnLButtonDown(nFlags, point);
     
    }
    pDXF est un pointeur sur la Classe CDXF qui dessine la boîte de dialogue .Il permet d'afficher la valeur de la couleur et les coordonnées de la souris dans la barre de titre de la boîte de dialogue pour tests.
    CDrawingView::LButtonDown (..)est appelé dans certains cas par une CView grâce à sa fonction OnLButtonDown(...)

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    Désolé pour l'oubli de la balise code.

    J'ai réussi à trouver une partie de solution à mon problème :
    Il faut enlever aux coordonnées du curseur les coordonnées du point haut gauche de la fenêtre du Contrôle Picture.

    Une question reste sans réponse pour moi: comment trouver ces coordonnées par programme? (l' inverse se SetWindowPos() en quelque sorte...)

    Ci dessous le code qui fonctionne (avec les balises...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void CDrawingView::LButtonDown(UINT nFlags, CPoint point) 
     
     COLORREF nColor;
    char buff[100];
    CDC* pdc=GetDC();
    //pdc->DPtoLP(&point,1);
    //Coordonnées souris du coin haut gauche du contrôle Picture : 22,45
    //Coordonnées du coin haut gauche du contrôle Picture trouvées dans fichier RC : 15,28
    //LTEXT           "",IDC_DRAWINGWINDOW,15,28,294,240,NOT WS_GROUP
     
    nColor= pdc->GetPixel( point.x-22, point.y-45 );  
    wsprintf(buff,"%i ---  %i / %i",nColor, point.x,point.y);
    pDXF->SetWindowText(buff);
    Pouvez-vous me donner la solution pour trouver ces coordonnées par programme ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455

  6. #6
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    ClientToScreen sur la boite puis ScreenToClient sur le controle picture
    ou alors MapWindowPoints

    @+

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    Encore une fois merci pour vos réponses, ça marche !!!

    Ci-dessous code qui marche avec utilisation de WINDOWPLACEMENT.

    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
    void CDrawingView::LButtonDown(UINT nFlags, CPoint point) 
    {	
        COLORREF nColor;
    	char buff[100];
    	CDC* pdc=GetDC();
    	WINDOWPLACEMENT wp;wp.length=sizeof(WINDOWPLACEMENT);
    	int xPicture,yPicture;
     
    	CWnd* pWnd= pDXF->GetDlgItem(IDC_DRAWINGWINDOW);
     
    	pWnd->GetWindowPlacement(&wp);
    	xPicture=wp.rcNormalPosition.left;
    	yPicture=wp.rcNormalPosition.top;
     
    	nColor= pdc->GetPixel( (point.x-xPicture), (point.y-yPicture));	
    	wsprintf(buff,"%i ---  %i / %i",nColor, point.x,point.y );
    	pDXF->SetWindowText(buff);
                 .........

  8. #8
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    ou est le ReleaseDC() qui correspond au GetDC() ?

    ce n'est pas une bonne pratique de tester un pixel directement à l'écran.

    tu n'es pas sur que la zone de dessin est à jour. sans compter qu'il peut y avoir une autre fenetre (une autre appli par exemple) à cet endroit ; bien que tu fais ton test sur le clic souris, donc dans ce cas précis, pas de soucis.

    la fonction MapWindowPoints aurait été beaucoup plus efficace, car elle tient compte de la zone non-cliente, ce qui n'est pas ton cas.

    @+

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 94
    Par défaut
    StephDim,
    Merci pour tes conseils. Je les apprécie particulièrement car je ne suis qu'un amateur.
    Quand tu dis" ce n'est pas une bonne pratique de tester un pixel directement à l'écran." penses-tu qu'il vaudrait mieux que je les teste dans un Bitmap ?

  10. #10
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    penses-tu qu'il vaudrait mieux que je les teste dans un Bitmap ?
    oui tout à fait, ou en utilisant un MetaFile (WMF ou EMF) si tu es en vectoriel.

    cette source là servira à dessiner sur l'écran.

    c'est ce qui a de plus "fiable".

    maintenant à toi de juger, si ta solution te convient bien, pourquoi pas, mais c'est pas fiable ...

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. visual studio 2005 MFC
    Par ninaa dans le forum MFC
    Réponses: 3
    Dernier message: 22/02/2009, 09h49
  2. Réponses: 5
    Dernier message: 18/11/2008, 11h12
  3. Réponses: 4
    Dernier message: 18/03/2006, 20h34
  4. visual c++ sans mfc ...
    Par fox1976 dans le forum MFC
    Réponses: 1
    Dernier message: 08/01/2006, 06h04
  5. Visual .NET et MFC 71
    Par romeo9423 dans le forum MFC
    Réponses: 5
    Dernier message: 13/06/2005, 11h02

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