ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Shape avec coins arrondis ou autres   



L'auteur

DDU
France France
Membre Simple
# 0000000189
enregistré le 21/01/2005
48 ans
Didier
Fiche personnelle


Note des membres
pas de note

Contributions > 06 - VCX - Bibliothèque de classes visuelles

Shape avec coins arrondis ou autres
# 0000000722
ajouté le 01/10/2009 12:11:22 et modifié le 01/10/2009
consulté 4602 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0

Zoomer sur l'image

Télécharger le ZIP (7.02 Ko)
Description

Les Shape de Visual Foxpro permettent de faire des arrondis simples dans les coins avec Curvature.

On peut aussi faire des formes libres grâce à Polypoints.

 

La classe ShpCorners vous permet de faire différents types de coins :

     - l'arrondi classique (ou sortant)

     - l'arrondi rentrant

     - le coin bizauté ou diagonale

     - le coin rentrant

 

Le type peut être défini séparément pour chaque coin grâce aux propriétés cHGcorner, cHDcorner, cBDcorner, cBGcorner (haut gauche, haut droit, ...). On définit également le nombre de points ou le % (par rapport à largeur et hauteur) servant de base au coin.

(Chaine caractère de la forme nnn.nn%C ou nnnnC : Pourcentage ou Nombre de points pour coin + type coin (si vide coin normal, si pas de nn 10% par défaut / types : A = Arrondi sortant, R = Arrondi rentrant, D = coin diagonale, I = coin inversé)

 

Dans le zip, un fichier exemple pour illustrer l'utilisation.

Code source :
**************************************************
*-- Class:        shpcorners (c:\vfp\shapes\shpcorners.vcx)
*-- ParentClass:  shape
*-- BaseClass:    shape
*-- Time Stamp:   10/01/09 11:02:02 AM
*
DEFINE CLASS shpcorners AS shape


  Height = 17
  Width = 100
  WhatsThisHelpID = 0
  *-- Coin HG : Chaine caractère de la forme nnn.nn%C ou nnnnC : Pourcentage ou Nombre de points pour coin + type coin (si vide coin normal, si pas de nn 10% par défaut / types : A = Arrondi sortant, R = Arrondi rentrant, D = coin diagonale, I = coin inversé
  chgcorner = ""
  *-- Coin HD : Chaine caractère de la forme nnn.nn%C ou nnnnC : Pourcentage ou Nombre de points pour coin + type coin (si vide coin normal, si pas de nn 10% par défaut / types : A = Arrondi sortant, R = Arrondi rentrant, D = coin diagonale, I = coin inversé
  chdcorner = ""
  *-- Coin BD : Chaine caractère de la forme nnn.nn%C ou nnnnC : Pourcentage ou Nombre de points pour coin + type coin (si vide coin normal, si pas de nn 10% par défaut / types : A = Arrondi sortant, R = Arrondi rentrant, D = coin diagonale, I = coin inversé
  cbdcorner = ""
  *-- Coin BG : Chaine caractère de la forme nnn.nn%C ou nnnnC : Pourcentage ou Nombre de points pour coin + type coin (si vide coin normal, si pas de nn 10% par défaut / types : A = Arrondi sortant, R = Arrondi rentrant, D = coin diagonale, I = coin inversé
  cbgcorner = ""
  Name = "shpcorners"

  *-- Tableau de points utilisés pour périmètre Shape si angles spéciaux
  DIMENSION tbpoints[1,2]


  *-- Ajoute un point au tableau tbPoints (paramètres lpnX, lpnY)
  PROCEDURE _addpoint
    LPARAMETERS lpnX, lpnY

    *_addpoint()
    *-----------

    LOCAL lnNoPoint
    lnNoPoint = 1
    IF TYPE("This.tbPoints[m.lnNoPoint, 1]") = "N"
      *pour tester 1er élément
      lnNoPoint = ALEN(This.tbPoints, 1) + 1
    ENDIF
    DIMENSION This.tbPoints[m.lnNoPoint, 2]
    This.tbPoints[m.lnNoPoint, 1] = MIN(ROUND(m.lpnX, 4), 100)
    This.tbPoints[m.lnNoPoint, 2] = MIN(ROUND(m.lpnY, 4), 100)
    RELEASE lnNoPoint
  ENDPROC


  *-- Réinitialise tbpoints et dessine la forme souhaitée
  PROCEDURE drawshape
    *DrawShape()
    *-----------

    DIMENSION This.tbPoints[1,2]
    STORE .F. TO This.tbPoints    &&.F. néécessaire pour création 1er point

    IF NOT INLIST(TYPE("This.cHGCorner"), "C""N")
      This.cHGCorner = ""
    ENDIF
    IF NOT INLIST(TYPE("This.cHDCorner"), "C""N")
      This.cHDCorner = ""
    ENDIF
    IF NOT INLIST(TYPE("This.cBDCorner"), "C""N")
      This.cBDCorner = ""
    ENDIF
    IF NOT INLIST(TYPE("This.cBGCorner"), "C""N")
      This.cBGCorner = ""
    ENDIF

    IF EMPTY(This.cHGCorner)  AND EMPTY(This.cHDCorner) ;
    AND EMPTY(This.cBGCorner)  AND EMPTY(This.cBDCorner)
      *Shape Normal : pas de PolyPoints
      This.PolyPoints = ""

    ELSE

      LOCAL lcTypeNARDI, lnArrondiV, lnArrondiH
      lcTypeNARDI = "N"
      STORE 0 TO lnArrondiV, lnArrondiH

      *coin Haut gauche
      This._cCornerToVariables(This.cHGCorner, @m.lcTypeNARDI, @m.lnArrondiV, @m.lnArrondiH)
      DO CASE
        CASE m.lcTypeNARDI = "N"
          *coin normal
          This._addpoint(0, 0)

        CASE m.lcTypeNARDI = "D"
          *coin diagonale
          This._addpoint(0, m.lnArrondiH)
          This._addpoint(m.lnArrondiV, 0)

        CASE m.lcTypeNARDI = "I"
          *coin inversé
          This._addpoint(0, m.lnArrondiH)
          This._addpoint(m.lnArrondiV, m.lnArrondiH)
          This._addpoint(m.lnArrondiV, 0)

        CASE m.lcTypeNARDI = "A"
          *arrondi sortant
          This.Arc(m.lnArrondiV, m.lnArrondiH, m.lnArrondiV, m.lnArrondiH, 180, 270)

        CASE m.lcTypeNARDI = "R"
          *arrondi rentrant
          This.Arc(0, 0, m.lnArrondiV, m.lnArrondiH, 90, 0)

      ENDCASE

      *coin haut droit
      lcTypeNARDI = "N"
      STORE 0 TO lnArrondiV, lnArrondiH
      This._cCornerToVariables(This.cHDCorner, @m.lcTypeNARDI, @m.lnArrondiV, @m.lnArrondiH)
      DO CASE
        CASE m.lcTypeNARDI = "N"
          *coin normal
          This._addpoint(100, 0)

        CASE m.lcTypeNARDI = "D"
          *coin diagonale
          This._addpoint(100 - m.lnArrondiV, 0)
          This._addpoint(100, m.lnArrondiH)

        CASE m.lcTypeNARDI = "I"
          *coin inversé
          This._addpoint(100 - m.lnArrondiV, 0)
          This._addpoint(100 - m.lnArrondiV, m.lnArrondiH)
          This._addpoint(100, m.lnArrondiH)

        CASE m.lcTypeNARDI = "A"
          *arrondi sortant
          This.Arc(100 - m.lnArrondiV, m.lnArrondiH, m.lnArrondiV, m.lnArrondiH, 270, 360)

        CASE m.lcTypeNARDI = "R"
          *arrondi rentrant
          This.Arc(100, 0, m.lnArrondiV, m.lnArrondiH, 180, 90)

      ENDCASE

      *coin bas droit
      lcTypeNARDI = "N"
      STORE 0 TO lnArrondiV, lnArrondiH
      This._cCornerToVariables(This.cBDCorner, @m.lcTypeNARDI, @m.lnArrondiV, @m.lnArrondiH)
      DO CASE
        CASE m.lcTypeNARDI = "N"
          *coin normal
          This._addpoint(100, 100)

        CASE m.lcTypeNARDI = "D"
          *coin diagonale
          This._addpoint(100, 100 - m.lnArrondiH)
          This._addpoint(100 - m.lnArrondiV, 100)

        CASE m.lcTypeNARDI = "I"
          *coin inversé
          This._addpoint(100, 100 - m.lnArrondiH)
          This._addpoint(100 - m.lnArrondiV, 100 - m.lnArrondiH)
          This._addpoint(100 - m.lnArrondiV, 100)

        CASE m.lcTypeNARDI = "A"
          *arrondi sortant
          This.Arc(100 - m.lnArrondiV, 100 - m.lnArrondiH, m.lnArrondiV, m.lnArrondiH, 0, 90)

        CASE m.lcTypeNARDI = "R"
          *arrondi rentrant
          This.Arc(100, 100, m.lnArrondiV, m.lnArrondiH, 270, 180)

      ENDCASE

      *coin bas gauche
      lcTypeNARDI = "N"
      STORE 0 TO lnArrondiV, lnArrondiH
      This._cCornerToVariables(This.cBGCorner, @m.lcTypeNARDI, @m.lnArrondiV, @m.lnArrondiH)
      DO CASE
        CASE m.lcTypeNARDI = "N"
          *coin normal
          This._addpoint(0, 100)

        CASE m.lcTypeNARDI = "D"
          *coin diagonale
          This._addpoint(m.lnArrondiV, 100)
          This._addpoint(0, 100 - m.lnArrondiH)

        CASE m.lcTypeNARDI = "I"
          *coin inversé
          This._addpoint(m.lnArrondiV, 100)
          This._addpoint(m.lnArrondiV, 100 - m.lnArrondiH)
          This._addpoint(0, 100 - m.lnArrondiH)

        CASE m.lcTypeNARDI = "A"
          *arrondi sortant
          This.Arc(m.lnArrondiV, 100 - m.lnArrondiH, m.lnArrondiV, m.lnArrondiH, 90, 180)

        CASE m.lcTypeNARDI = "R"
          *arrondi rentrant
          This.Arc(0, 100, m.lnArrondiV, m.lnArrondiH, 360, 270)

      ENDCASE
      RELEASE lcTypeNARDI, lnArrondiV, lnArrondiH

      This.PolyPoints = "This.tbPoints"
    ENDIF
  ENDPROC


  *-- Ajoute les points d'un arc de cercle au tableau tbPoints (paramètres lpnVCentre, lpnHCentre, lpnVrayon, lpnHrayon, lpnAngledeb, lpnAngleFin[, lpnPas])
  PROCEDURE arc
    LPARAMETERS lpnVCentre, lpnHCentre, lpnVRayon, lpnHRayon, lpnAngleDeb, lpnAngleFin, lpnPas

    *arc()
    *-----

    IF TYPE("m.lpnPas") <> "N" OR m.lpnPas = 0
      *calcul automatique d'un pas
      LOCAL lnMaxRayon
      lnMaxRayon = ROUND((m.lpnVRayon * This.Width) / 100, 0)
      lnMaxRayon = MAX(m.lnMaxRayon, ROUND((m.lpnHRayon * This.Height) / 100, 0))
      lpnPas = ROUND(ABS(m.lpnAngleFin - m.lpnAngleDeb) / (m.lnMaxRayon * 2), 2)
      RELEASE lnMaxRayon
    ENDIF

    LOCAL lnAngle, lnX, lnY
    lnAngle = 0
    *Boucle de placement des points
    FOR lnAngle = m.lpnAngleDeb TO m.lpnAngleFin  STEP (m.lpnPas * IIF(m.lpnAngleDeb < m.lpnAngleFin, 1, -1))
      lnX = ROUND((m.lpnVRayon * COS(DTOR(m.lnAngle))) + m.lpnVCentre, 4)
      lnY = ROUND((m.lpnHRayon * SIN(DTOR(m.lnAngle))) + m.lpnHCentre, 4)

      This._addpoint(m.lnX, m.lnY)
    ENDFOR

    *sécurité pour point de sortie si le pas nous l'a fait sauter
    IF m.lnAngle <> m.lpnAngleFin
      lnAngle = m.lpnAngleFin
      lnX = ROUND((m.lpnVRayon * COS(DTOR(m.lnAngle))) + m.lpnVCentre, 4)
      lnY = ROUND((m.lpnHRayon * SIN(DTOR(m.lnAngle))) + m.lpnHCentre, 4)

      This._addpoint(m.lnX, m.lnY)
    ENDIF

    RELEASE lnAngle, lnX, lnY
  ENDPROC


  *-- convertit le cCorner en 3 variables : type, pourcentage V, pourcentage H (paramètres lpcCoin, rcTypeNARDI, rnPCV, rnPCH)
  PROCEDURE _ccornertovariables
    LPARAMETERS lpcCoin, rcTypeNARDI, rnPCV, rnPCH

    *_cCornerToVariables()
    *---------------------

    rcTypeNARDI = "N"
    rnPCV = 0
    rnPCH = 0

    DO CASE
      CASE EMPTY(m.lpcCoin)
        rcTypeNARDI = "N"
        rnPCV = 0
        rnPCH = 0

      CASE TYPE("m.lpcCoin") = "N"    &&c'est possible
        rcTypeNARDI = "A"
        rnPCV = m.lpcCoin
        rnPCH = m.rnPCV

      OTHERWISE
        m.lpcCoin = UPPER(ALLTRIM(m.lpcCoin))
        LOCAL lcChaine
        lcChaine = m.lpcCoin
        rcTypeNARDI = RIGHT(m.lcChaine, 1)
        IF AT(m.rcTypeNARDI, "NARDI") = 0
          *arrondi par défaut
          rcTypeNARDI = "A"
        ELSE
          lcChaine = LEFT(m.lcChaine, LEN(m.lcChaine)-1)
        ENDIF
        IF RIGHT(m.lcChaine, 1) = "%"
          rnPCV = VAL(LEFT(m.lcChaine, LEN(m.lcChaine)-1))
          rnPCH = m.rnPCV
        ELSE
          LOCAL lnNbPoints
          lnNbPoints = VAL(m.lcChaine)
          IF m.lnNbPoints = 0
            *10% par défaut
            STORE 10 TO rnPCV, rnPCH
          ELSE
            rnPCV = ROUND((m.lnNbPoints / This.Width) * 100, 2)
            rnPCH = ROUND((m.lnNbPoints / This.Height) * 100, 2)
          ENDIF
          RELEASE lnNbPoints
        ENDIF
        RELEASE lcChaine
    ENDCASE

    IF rcTypeNARDI = "N" ;
    OR (m.rnPCV = 0 AND m.rnPCH = 0)
      rcTypeNARDI = "N"
      rnPCV = 0
      rnPCH = 0
    ENDIF
  ENDPROC


  PROCEDURE Init
    *Init()
    *------

    LOCAL llOkInit
    llOkInit = DODEFAULT()
    IF m.llOkInit
      This.DrawShape()
    ENDIF
    RETURN m.llOkInit
  ENDPROC


ENDDEFINE
*
*-- EndDefine: shpcorners
**************************************************

Commentaires
Aucun commentaire enregistré ...

Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2019.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3