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 507
    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 507
    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 507
    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 507

  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