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 tracer un Rectangle et le redimentionner avec la souris


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 146
    Par défaut MFc tracer un Rectangle et le redimentionner avec la souris
    bonjour a tous,
    mon objectif c de tracer un rectangle avec la souris et recuperer leurs coordonnées(left,top,bottom,right) puis le redimentionner en cas de besoin
    je vous demande s'il ya une personne qui a une idées ou bien s'il ya une piste qui me permet de le faire,
    et merci d'avance.

  2. #2
    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,
    peut être que CRectTracker pourrait te convenir.

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Super Farscape je ne connaissais pas cela !
    Je touche aux MFC depuis des mois et j'en découvre tous les jours.
    Tu sais comment cela se gère ?

  4. #4
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Tu as le très bon livre de Yvon Horton Visual C++ 6 qui parle d'un programme de dession Sketcher qui permet de tracer des lignes, des rectangles, des cercles et des courbes à la souris.

    En bref tu dois créer tes objets rectangles puis intercepter les messages souris. Voici quelques codes simples mais tous n'y est pas.

    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
     
    // CElement command target
     
    class CElement : public CObject
    {
    public:
    	virtual ~CElement();
     
    protected:
    	// les données membres communes à tous nos éléments (line, rect, circle, curve)
    	COLORREF m_Color;				// couleur
    	int m_nPenWidth;				// Epaisseur du crayon
    	CRect m_EnclosingRect;			// Rectanlge englobant un élément
     
    public:
    	virtual void Draw(CDC* pDC) const;//opération de dessin virtuelle
    	CRect GetBoundRect() const; //obtient un rectangle englobant d'un élément
     
    protected:
    	CElement();
    };
    c'est la classe de base des objets des figures géométriques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class CRectangle : public CElement
    {
    public:
    	CRectangle(const CPoint& Start, const CPoint& End, const COLORREF Color, const int PenWidth);
    	virtual ~CRectangle();
     
    	virtual void Draw(CDC* pDC) const;//opération de dessin virtuelle
    };
    C'est la classe qui représente ton objet rectangle à dessiner
    Maintenant dans le cpp
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    // Rectangle.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "Sketcher.h"
    #include "Rectangle.h"
     
     
    // CRectangle
     
    CRectangle::CRectangle(const CPoint& Start, const CPoint& End, const COLORREF Color, const int PenWidth)
    {
    	m_Color = Color;
    	m_nPenWidth = PenWidth;
    	m_EnclosingRect = CRect(Start, End);
    	m_EnclosingRect.NormalizeRect();
    }
     
    CRectangle::~CRectangle()
    {
    }
     
     
    // CRectangle member functions
    void CRectangle::Draw(CDC *pDC) const
    {
    	CPen aPen;
    	if (!aPen.CreatePen(PS_SOLID,m_nPenWidth, m_Color))
    	{
    		AfxMessageBox("Erreur du tracé d'un Rectangle", MB_OK);
    		AfxAbort();
    	}
    	CPen* pOldPen = pDC->SelectObject(&aPen);
    	CBrush* pOldBrush = static_cast<CBrush*>(pDC->SelectStockObject(NULL_BRUSH)); // Conversion de l'ojet en Brush
    	pDC->Rectangle(&m_EnclosingRect);
    	pDC->SelectObject(pOldPen);
    	pDC->SelectObject(pOldBrush);
     
    }
    Tu as la méthode CRectangle:raw() qui dessine le rectangle
    Maintenant passons dans la vue qui capte les messages souris

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    // quand le bouton gauche de la souris est enfoncé
    void CSketcherView::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	m_FirstPoint = point;
    	SetCapture();// la vue va capter tous les msg de la sourris même si la souris est en dehors de la vue.
     
    	CView::OnLButtonDown(nFlags, point);
    }
     
    // quand la souris est en déplacement on fait un tracé élastique
    void CSketcherView::OnMouseMove(UINT nFlags, CPoint point)
    {
    	CClientDC aDC(this);// Nous définissons le contexte de périphéri CDC de la zone Client de SketcherView 
    	aDC.SetROP2(R2_NOTXORPEN); //Définit le mode de dessin adéquat
     
                 if( (nFlags & MK_LBUTTON) && this == GetCapture())  // Vérifie si le bouton gauche de la souris est enfoncé.
    	{
    		m_SecondPoint = point;  // mise à jour continuelle du snd point
    		if (m_pTempElement)  // Vérifie si l'élément temporaire existait déjà
    		{
    			m_pTempElement->Draw(&aDC);  // L'élément se dessine pour s'éffacer à cause du mode de dessin choisit R2_NOTXORPEN
    			delete m_pTempElement; //destruction de l'élément
    			m_pTempElement = NULL; // réinitialisation de l'élément
    		}
    		m_pTempElement = CreateElement();	
    		m_pTempElement->Draw(&aDC);  // l'appel virtuel de Draw()
    	}
     
    	CView::OnMouseMove(nFlags, point);
    }
     
    // quand le bouton gauche de la souris est relaché
    void CSketcherView::OnLButtonUp(UINT nFlags, CPoint point)
    {
    	if( this == GetCapture()) 
    		ReleaseCapture();
     
    	if (m_pTempElement)  
    	{
    		delete m_pTempElement; //destruction de l'élément
    		m_pTempElement = NULL; // réinitialisation de l'élément
    	}
    	CView::OnLButtonUp(nFlags, point);
    }
     
    CElement* CSketcherView::CreateElement()
    {
    	CSketcherDoc* pDoc = GetDocument();//
    	ASSERT_VALID(pDoc); //
     
    	switch(pDoc->GetElementType())
    	{
    	case RECTANGLE:
    		return new CRectangle(m_FirstPoint,m_SecondPoint,pDoc->GetElementColor(), pDoc->GetPenWidth());
    	case CIRCLE :
    		return new CCircle(m_FirstPoint,m_SecondPoint,pDoc->GetElementColor(),pDoc->GetPenWidth());
    	case CURVE :
    		return new CCurve(pDoc->GetElementColor(),pDoc->GetPenWidth());
    	case LINE :
    		return new CLine(m_FirstPoint,m_SecondPoint,pDoc->GetElementColor(),pDoc->GetPenWidth());
     
    	default:
    		AfxMessageBox("Code incorrect", MB_OK);
    		AfxAbort();
    		return NULL;
    	}
    }
    Voilà, le code n'est pas complet mais tu as la base pour dessiner des objets rectangles ensuite tu utilise le fameux CRectTracker qui fournit des poignets de redimensionnement. Le CRectTracker est souvent utilisé dans la manipulation des objets OLE incorporer dans un document composite. Par exemple, une image jpeg colé dans Word fait ressortir ces poignets et donc l'objet CRectTracker associé à l'image.

Discussions similaires

  1. Tracer un rectangle avec Netbeans
    Par tpdm dans le forum NetBeans
    Réponses: 1
    Dernier message: 25/06/2009, 20h26
  2. Tracer des rectangles/ellipses avec la souris
    Par safizounet dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 27/01/2009, 17h09
  3. Réponses: 13
    Dernier message: 02/02/2005, 00h21
  4. [MFC]Ouverture d'une base de donnee avec DAO
    Par Wyatt dans le forum MFC
    Réponses: 7
    Dernier message: 24/01/2005, 10h06
  5. [VB.NET] Tracer un rectangle en pointillé
    Par Emcy dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/08/2004, 13h10

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