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;
}
} |
Partager