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

Composants VCL Delphi Discussion :

Tracer un carré de X cm


Sujet :

Composants VCL Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Tracer un carré de X cm
    Bonjour, novice en delphi je souhaite utiliser le canvas pour déssiner des formes géométriques variées.
    Toutefois je me heurte à un pb que je n'avais pas sous VB :
    je souhaite créer une image qui respecte les dimensions.

    Par exemple je souhaite déssiner un carré de 5 cm de coté pour que lorsque je l'imprime je puisse bien avoir 5 cm.

    quelqu'un a t il la solution (actuellement je ne peux travailler qu'avec des pixels)

    Cordialement
    Mdel

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Regardes du côté de la fonction PixelsPerInch:

    (Aide delphi 6)
    Indique le nombre de pixels écran constituant un pouce logique dans la direction verticale
    En sachant qu'un pouce doit valoir 2.54 cm (je crois), tu devrais pouvoir t'y retrouver.

    Bon courage!

  3. #3
    adc
    adc est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 33
    Points : 25
    Points
    25
    Par défaut
    Il est difficile d'avoir des valeurs exactes car ça dépend également de la taille de l'écran.
    Avec des résolution identiques (par ex 1024x768, 96 dpi) la taille du
    résultat varie selon la taille de l'écran (15 ou 17 pouces)

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 098
    Points
    7 098
    Par défaut
    ClientToScreen et ScreenToClient peuvent aider, non ?


  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    J'ai regardé l'aide de clienttoscreen et screentoclient mais je ne comprends pas bien comment cela peut fonctionner.
    Aurais tu un exemple concret de son utilisation
    Merci d'avance

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 098
    Points
    7 098
    Par défaut
    Bin, AlainR et adc parlent de récupérer le nombre de pixels de l'écran.

    Donc, moi je te propose des fonctions qui permettent de convertir une position écran en position contrôle, et inversement. De mémoire (avec un TImage), ca doit donner ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    APoint: TPoint;
    APoint.x := 5;   APoint.y := 10;
     
    Image.ScreenToClient(APoint);
    Je prend l'exemple d'un TImage, parce qu'il a un Canvas.


  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 098
    Points
    7 098
    Par défaut
    Sinon, j'ai trouvé ce tutoriel (je ne me souviens plus qui en est l'auteur) :

    Travaillez en millimètres pour imprimer sur n'importe quelle imprimante

    Suite à question posée sur le forum nzn.fr.delphi, j'ai décidé de traduire ce petit article sur les calculs de position en millimètres sur le canvas des imprimantes.

    Il faut savoir que le canvas de l'objet TPrinter n'accepte (comme tous les TCanvas) que des coordonnées en pixels. L'être humain n'étant pas habitué à ce
    genre de mesure, il est difficile pour lui de se repérer dans une telle dimension. Le but de la manoeuvre est donc d'utiliser quelques petits calculs simples
    pour se repérer dans un système plus conventionnel (au terme humain de la chose).

    Pour réaliser cela, il va nous falloir des éléments de base. On a alors 2 solutions.

    L'objet Printer

    L'objet Printer est automatiquement créé par Delphi dès que le code le réclame. Il est nécessaire d'inclure dans les Uses l'unité Printers. Il n'est
    donc nul besoin de le créer explicitement. On pourra faire par exemple:

    LargeurCanvas := Printer.PageWidth; {ce qui nous donnera la largeur imprimable de la page pour l'imprimante en cours}

    Le seul problème est que, pour obtenir un résultat valable, il faut obligatoirement lancer une impression avec la procédure BeginDoc. Cela implique
    donc le démarrage d'une impression, l'obtention des valeurs, puis l'abandon de la procédure. Vous me direz que si on veut imprimer, on est bien
    obligé d'en passer par là. Mais on peut avoir besoin de connaître les dimensions de la page imprimable sans pour autant lancer une impression.
    Un prochain article sur "Comment réaliser un aperçu avant impression" montrera pourquoi. La procédure normale serait donc :

    Printer.BeginDoc;

    LargeurCanvas := Printer.PageWidth;

    Printer.Abort;

    L'autre solution consiste à utiliser l'API GetDeviceCaps qui nous fournit tous les renseignements nécessaires sans lancer d'impression.

    L'API GetDeviceCaps

    Cette fonction de windows nécessite un handle et une constante pour indiquer quel type de résultat on veut obtenir. Pour l'objet TPrinter, le handle
    sera Printer.Canvas.handle. Dans notre cas, nous utiliserains les constantes LOGPIXELSX et LOGPIXELSY qui permettent à GetDeviceCaps de
    renvoyer respectivement le nombre de pixels par pouce logique. On aura noté qu'il existe une constante pour les valeurs en X et une pour les
    valeurs en Y. En ce qui concerne l'écran, les 2 valeurs seront différentes, car physiquement, un pixel est plus haut que large. Sur une imprimante,
    les 2 valeurs seront (généralement) identiques, car dans ce cas, un pixel représente un point parfaitement rond. Aussi, l'une ou l'autre constante
    renverront le même résultat.

    Pour obtenir le nombre de pixels par pouce pour l'imprimante, nous écrirons donc :

    XPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSX);

    YPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSY);

    Ainsi, pour commencer l'impression d'un texte à 1 pouce du bord gauche de la feuille, et à 1 pouce du haut de la feuille, on écrira :

    Printer.Canvas.TextOut(XPixelsParPouce, YPixelsParPouce, 'Mon texte');

    Maintenant, si nous voulons travailler en millimètres pour plus de commodités, nous devons transformer nos coordonnées en millimètres. Comme
    vous le savez certainement, 1 pouce = 25.4 mm, donc 1 mm = 1 / 25.4 pouce. Nous pouvons donc calculer directement :

    XMillimetresParPouce := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSX), 10, 254);

    YMillimetresParPouce := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSY), 10, 254);



    L'utilisation de MulDiv évite les résultats avec virgules pour qu'elle renvoie un nombre entier. Ici, plutôt que de stocker cette valeur dans une valeur en début
    de code, nous allons les calculer 'à la volée' à chaque fois que cela sera nécessaire. Pourquoi faire cela ? Et bien, prenons par exemple un nombre de 360 pixels
    par pouce. Le résultat de la conversion en virgule flottante donne 14.17. Ce qui veut dire que lors de l'impression, avec une valeur arrondie à 14, on perdrait 1 pixel
    tous les 6 millimètres. Ca parait peu à première vue, mais pourrait provoquer de drôles de choses à la sortie. Nous conserverons donc cette valeur sous forme
    de renvoi de fonction.



    function Millimetres2PixelsX(Millims: integer): integer;
    begin
    result := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSX), 10 * Millims, 254);
    end;


    function Millimetres2PixelsY(Millims: integer): integer;
    begin
    result := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSY), 10 * Millims, 254);
    end;

    Ainsi, pour imprimer un texte à 50 millimètres du bord gauche de la feuille et 120 millimètres du bord haut, on écrira :

    Printer.Canvas.TextOut( Millimetres2PixelsX(50), Millimetres2PixelsY(120), 'Mon Texte à (50, 120)');

    ATTENTION: Ce code imprimera le texte avec un léger décalage supplémentaire. Il s'agit de la zone non imprimable définie par l'imprimante elle-même.
    Pour connaitre la taille de cette zone non imprimable, vous utiliserez les constantes PHYSICALOFFSETX et PHYSICALOFFSETY. Vous obtiendrez alors les
    valeurs en pixels que vous transformerez en millimètres de la même manière que précédemment.

    function NonImprimableHorizMM: integer; {arrondi}
    begin
    result := MulDiv(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX), 10, 254);
    end;

    Nous pouvons alors terminer ainsi pour imprimer notre texte à exactement 50 mm du bord gauche :

    Printer.Canvas.TextOut(Millimetres2PixelsX(50 - NomImprimableHorizMM), Millimetres2PixelsY(120), 'Mon Texte à (50, 120)');

    Le même calcul se faite sur la hauteur.

    Voilà ! Vous avez les éléments de base pour imprimer ou voulez, dans un repère connu.
    Si ca peut t'aider ...


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

Discussions similaires

  1. [Débutant] Tracer d'une fonction racine carrée
    Par ktolajumel dans le forum MATLAB
    Réponses: 5
    Dernier message: 30/06/2013, 17h39
  2. [FP]Tracer Une ligne avec Dev-pascal
    Par yffick dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 17/12/2003, 16h33
  3. [VB6] [Graphisme] Tracer un cercle avec pset
    Par bleuerouge dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/12/2002, 17h12
  4. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22
  5. Racine carrée
    Par SteelBox dans le forum Mathématiques
    Réponses: 5
    Dernier message: 23/11/2002, 17h15

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