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

VB 6 et antérieur Discussion :

Dessin d'un rectangle arrondi dans une picturebox


Sujet :

VB 6 et antérieur

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut Dessin d'un rectangle arrondi dans une picturebox
    Bonjour,

    J'ai pu trouver dans le forum la dll et l'appel à celle-ci (merci à Babaotes)
    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
     
     
    Private Declare Function RoundRect Lib "gdi32" _
    (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
     ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
     
    ...
     
    Set q = Picture2
    'exemple de position bien sûr les paramètres peuvent changer
    q.ScaleMode = vbCentimeters
    q.ScaleTop = 100
    q.ScaleLeft = 27
    q.CurrentX = 120
    q.CurrentY = 120
    ep = 10
    q.ScaleWidth = 150
    q.ScaleHeight = 50
     
    lq = q.ScaleWidth: hq = q.ScaleHeight: tcoul = q.Point(2, 2): q.DrawWidth = 2 'grosseur du trait
     
     RoundRect q.hdc, (ep / 2) + 1, (ep / 2) + 1, lq - (ep / 2) - 1, _
                          hq - (ep / 2) - 1, (lq + hq) / 6, (lq + hq) / 6
     
    ...
    J'ai modifié les paramètres pour obtenir le dessin désiré, mais en
    changeant les valeurs servant à positionner la figure, rien n'y fait,
    celle-ci se positionne toujours dans le coin supérieur gauche de la picturebox.

    Comment la positionner à l'endroit désiré?

    Merci.

  2. #2
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Bonjour,

    c'est étonnant car en prenant des valeurs numériques,j'ai bien 3 rectangles différents, en taille, position, rayon de courbure.

    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
     
    Private Declare Function RoundRect Lib "gdi32" _
    (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
     ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
    Private Sub Command1_Click()
    Set q = Picture1
    'exemple de position bien sûr les paramètres peuvent changer
    q.ScaleMode = vbCentimeters
    q.ScaleTop = 100
    q.ScaleLeft = 27
    q.CurrentX = 120
    q.CurrentY = 120
    ep = 100
    q.ScaleWidth = 150
    q.ScaleHeight = 50
     
    q.Cls
    q.ForeColor = vbRed
    RoundRect q.hdc, 10, 10, 100, 100, 20, 20
    q.ForeColor = vbBlue
    RoundRect q.hdc, 50, 50, 120, 120, 20, 20
    q.ForeColor = vbGreen
    RoundRect q.hdc, 90, 90, 140, 140, 10, 10
    End Sub

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    salut

    ton problème commence ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    q.ScaleMode = vbCentimeters
    Cette fonction fonctionne en pixels
    Si tu veux utiliser une autre échelle, il te faut alors convertir toutes tes valeurs
    (et c'est du thé, que je mets dans mon baba )

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour,

    D'accord OhMonBato,ça je sais.

    Mais ce que je veux c'est garder la même forme (de rectangle arrondi) et la positionner à l'endroit de coordonnées x,y sur la picturebox.

    Le but est par exemple d'encadrer du texte pour une impression, la picturebox ne servant qu'à formater une impression avec l'objet printer.
    (plus facile de préparer sur une picture pour d'abord visualiser le résultat)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    q.ScaleMode = vbCentimeters
    babaothe, ceci intervient surtout quand je change l'objet picturebox en objet Printer

    A+

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Citation Envoyé par iclic Voir le message
    babaothe, ceci intervient surtout quand je change l'objet picturebox en objet Printer
    l'objet Printer se traite exactement comme une picturebox et possède également une propriété scalemode.

  6. #6
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Citation Envoyé par iclic Voir le message
    Bonjour,

    D'accord OhMonBato,ça je sais.
    Je suis content que tu le saches déjà mais je continue de m'étonner parce que si je fais ça, j'ai 2 rectangles pareils à 2 endroits différents (en reprenant auparavant bien sur le reste du code déjà présent dans les messages précédents) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    q.Cls
    q.ForeColor = vbRed
    RoundRect q.hdc, 10, 10, 100, 100, 20, 20
    q.ForeColor = vbBlue
    RoundRect q.hdc, 50, 50, 140, 140, 20, 20

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    l'objet Printer se traite exactement comme une picturebox et possède également une propriété scalemode.
    C'est pour cette raison que je travaille d'abord sur l'objet Picturebox...

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    relis ce que je t'ai déjà exposé plus haut :
    Cette fonction (RoundRect) calcule en pixels.
    Si tu utilises une autre échelle, il te faudra transposer toutes tes valeurs (utilisation de Scalex et Scaley)

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Donc OhMonBato (j'ai essayé tes valeurs),il faut augmenter proportionnellement les 4 premiers paramètres pour déplacer le rectangle?

    NB:Ma picturebox a une dimension A4 et sert d'abord à préparer l'impression

  10. #10
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Effectivement c'est bien ça. J'utilise l'utilitaire API-Guide (que tu peux télécharger ici) et dans les paramètres on peut y lire :

    · hdc
    Identifies the device context.
    · nLeftRect
    Specifies the x-coordinate of the upper-left corner of the rectangle.
    · nTopRect
    Specifies the y-coordinate of the upper-left corner of the rectangle.
    · nRightRect
    Specifies the x-coordinate of the lower-right corner of the rectangle.
    · nBottomRect
    Specifies the y-coordinate of the lower-right corner of the rectangle.
    · nWidth
    Specifies the width of the ellipse used to draw the rounded corners.
    · nHeight
    Specifies the height of the ellipse used to draw the rounded corners.
    C'est en anglais, désolé, mais cela veut dire qu'on définit d'abord les coordonnées du coin haut gauche, puis du coin bas droit, puis la largeur de l'axe horizontal de l'ellipse qui trace le coin, puis la hauteur de l'ellipse (on peut donc faire un angle "ovalisé").

    Ensuite, question coordonnées, n'oublie pas la remarque de Babaothe.

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut je suis néophyte en graphisme vb
    Merci OhMonBato pour les renseignements qui me manquaient.

    de babaothe
    relis ce que je t'ai déjà exposé plus haut :
    Cette fonction (RoundRect) calcule en pixels.
    Si tu utilises une autre échelle, il te faudra transposer toutes tes valeurs (utilisation de Scalex et Scaley)
    Celà ,je sais ce n'est pas le problème, mais quelle est la différence entre pixels et twips car dans la MSDN ( où l'on peut apprendre beaucoup et malheureusement les apprentis vb ne vont pas assez voir) 567 twips=1 cm
    mais rien sur les pixels .

    Et grand merci pour les remarques et renseignements.
    A+

  12. #12
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 112
    Points : 16 645
    Points
    16 645
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim MsG As String
    MsG = "1 pixel = " & ScaleX(1, vbPixels, vbTwips) & " twips" & vbCrLf
    MsG = MsG & "1 pixel = " & ScaleX(1, vbPixels, vbCentimeters) & " Centimetres" & vbCrLf
    MsG = MsG & "1 centimetre = " & ScaleX(1, vbCentimeters, vbMillimeters) & " Millimetres" & vbCrLf
    MsgBox MsG
    F2 ScaleModeConstants

  13. #13
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour,

    Donc si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Picture1.ScaleMode = vbMillimeters
    1cm = 567/15*10 pixels

    Merci ProgElecT

  14. #14
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Remarques

    1.D'abord correction bien sûr: 1mm = 567/15*10 pixels

    2.L'objet printer ne fonctionne quand même pas exactement comme l'objet Picture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    ...
    ' Mult = 1 - Posval1 =132 / pour l'objet Picturebox 
     Mult = 6 :Posval1 =156  'pour l'objet printer
     
    xx1 = q.ScaleX(q.CurrentX, vbMillimeters, vbPixels) + Posval1 'coin supérieur gauche
    yy1 = q.ScaleY(q.CurrentY, vbMillimeters, vbPixels)  'coin supérieur gauche
    xx2 = q.ScaleX(q.CurrentX, vbMillimeters, vbPixels) + Posval1 'coin inférieur droit
    yy2 = q.ScaleY(q.CurrentY, vbMillimeters, vbPixels)  'coin inférieur droit
     
    RoundRect q.hdc, 6 * Mult + xx1, 6 * Mult + yy1, 144 * Mult + xx2, 44 * Mult + yy2, 20 * Mult, 20 * Mult
    ...
    J'ai du ajouter un multiplicateur pour l'objet Printer (autrement le rectangle était tout petit alors que dans la picturebox la taille était normale) et une
    variable pour positionner le rectangle au même endroit .(suivant que l'objet était Printer ou Picture).

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    salut

    et postval1 : il est exprimé en quoi ?

  16. #16
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour,

    et postval1 : il est exprimé en quoi ?
    Je suppose certainement en pixel: il sert à positionner exactement le rectangle autour du texte car je dois rectifier la valeur du currentX.
    ( sa valeur est trouvée par essai )
    L'mpression du rectangle se fait à la ligne en-dessous du texte.

    Pour information, le texte est l'impression d'une facture:le formatage est enregistré dans un fichier texte qui est si on veut la photocopie de l'impression A4 (avec espaces,retour à la ligne etc..) sauf que dans un fichier texte on ne sait pas faire du graphisme.
    Le fichier texte est relu et chaque ligne est mise dans l'objet printer avec la propriété Print.

  17. #17
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 112
    Points : 16 645
    Points
    16 645
    Par défaut
    Salut
    Bien que déjà signalé par d'autre intervenant.
    Tu as assurément un problème d'unité différente (ScaleMode) entre ton objet Printer et la fonction RoundRect.
    Mets ton objet Printer.ScalMode = VBpixels puisque RoundRect ne sait travailler qu'avec cette unité.
    Citation Envoyé par MSDN
    CurrentX, CurrentY, propriétés

    Renvoient ou définissent les coordonnées horizontales (CurrentX) ou verticales (CurrentY) de la méthode d'impression ou de dessin suivante.
    .................
    Les coordonnées sont exprimées en twips ou dans l'unité de mesure en cours définie par les propriétés ScaleHeight, ScaleWidth, ScaleLeft, ScaleTop et ScaleMode.

  18. #18
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour,

    Ce qui est bizarre Progelec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    Set q = Picture2
     'Set q = Printer
    ...
     
    xx1 = q.ScaleX(q.CurrentX, vbMillimeters, vbPixels)  'coin supérieur gauche
    yy1 = q.ScaleY(q.CurrentY, vbMillimeters, vbPixels)  'coin supérieur gauche
    xx2 = q.ScaleX(q.CurrentX, vbMillimeters, vbPixels)   'coin inférieur droit
    yy2 = q.ScaleY(q.CurrentY, vbMillimeters, vbPixels)  'coin inférieur droit
     
    RoundRect q.hdc, 6 * Mult + xx1, 6 * Mult + yy1, 144 * Mult + xx2, 44 * Mult + yy2, 20 * Mul
    Avec l'objet Picture les valeurs de :
    CurrentX = 90,51468
    CurrentY = 8,00897
    xx1 = 30
    yy1= 353
    xx2 = 30
    yy2 = 353

    Si je fais uniquement ceci,sans rien changer d'autre dans le code ,ni dans les paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     'Set q = Picture2  mise en rem de l'objet Picture
     Set q = Printer    'enlever le rem de l'objet Printer
    Avec l'objet Printer les valeurs changent
    ici peu de changements
    CurrentX = 90,25829
    CurrentY = 9,008315

    par contre ici
    xx1 = 213
    yy1= 2085
    xx2 = 213
    yy2 = 2085

    Et voilà les paramètres définis pour les 2 objets avant l'impression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
         q.ScaleMode = vbMillimeters 
          q.ScaleTop = 0
          q.ScaleLeft = 27
          q.Font = "courier new"
          q.FontSize = 11
           q.CurrentX = 0
          q.CurrentY = 19
           q.DrawWidth = 2
          q.FillColor = 16
           q.FillStyle = 1
    Maintenant la picturebox à la dimension d'une feuille A4, mais ...
    définie en twips ( bien sûr une scrollbar permet de la visualiser entièrement)
    Serait-ce la raison d'une différence dans les valeurs?

  19. #19
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 112
    Points : 16 645
    Points
    16 645
    Par défaut
    Salut
    Ma dernière intervention puisque la discussion est taguée RESOLU.
    Pour mémo :
    A quelques exceptions prêtes,
    Left, Right, Top et Width ont pour unités celles définis suivant le ScaleMode du Parent conteneur du composant.
    ScaleLeft, ScaleRight, ScaleTop et ScaleWidth, Currentx et CurrerntY ont pour unités suivant le ScaleMode du composant.
    Maintenant la picturebox à la dimension d'une feuille A4, mais ...
    définie en twips
    Personnellement, je donnerai ScaleMode du Picture = vbMillimeters Idem pour l’objet Printer.
    Je convertirai (de vbMillimeters en VBPixels) toutes les dimensions et coordonnées à destination de la fonction RoundRect, comme tu le fais avec XX1, YY1, XX2 et YY2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RoundRect q.hdc, 6 * Mult + xx1, 6 * Mult + yy1, 144 * Mult + xx2, 44 * Mult + yy2, 20 * Mult
    Je ne comprends pas l’usage et à quoi te sert Mult, pas plus que 6*, 144*, 44* et 20*.

  20. #20
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut Pour information
    Bonjour,

    De ProgelEct

    Tu as assurément un problème d'unité différente (ScaleMode) entre ton objet Printer et la fonction RoundRect.
    Tu as raison, c'était un problème d'unité différente,il suffisait de faire ceci,
    d'insérer toutes les valeurs à transmettre à l'api dans des variables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    xx1 = q.ScaleX(1 + q.CurrentX, vbMillimeters, vbPixels)  'coin supérieur gauche
    yy1 = q.ScaleY(1 + q.CurrentY, vbMillimeters, vbPixels) 'coin supérieur gauche
    xx2 = q.ScaleX(40 + q.CurrentX, vbMillimeters, vbPixels) 'coin inférieur droit
    yy2 = q.ScaleY(12 + q.CurrentY, vbMillimeters, vbPixels) 'coin inférieur droit
    rd1 = q.ScaleX(4, vbMillimeters, vbPixels)
    rd2 = q.ScaleX(4, vbMillimeters, vbPixels)
     
    RoundRect q.hdc, xx1, yy1, xx2, yy2, rd1, rd2
    ...
    pour que l'objet Picture et l'objet Printer correspondent.

    A+

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

Discussions similaires

  1. Dessiner une grille dans une picturebox
    Par hamza.rezgui dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/03/2013, 10h24
  2. [Debutant] Dessiner dans une PictureBox.
    Par Fibus dans le forum Débuter
    Réponses: 13
    Dernier message: 19/04/2007, 18h23
  3. Dessiner dans une PictureBox
    Par pj69100 dans le forum MFC
    Réponses: 4
    Dernier message: 22/04/2006, 19h30
  4. Rendre le fond transparent dans une picturebox
    Par fun31 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/01/2005, 19h17
  5. VB6] imprimer le texte afficher dans une picturebox
    Par Persons dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/08/2004, 12h15

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