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

C++Builder Discussion :

[Impression] Probleme d'échelle/résolution


Sujet :

C++Builder

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 58
    Points : 86
    Points
    86
    Par défaut [Resolu][Impression] Probleme d'échelle/résolution
    Bonjour,

    J'ai cherché un peu partout mais je n'ai rien trouvé qui réponde ou qui me permette de régler mon problème...

    En fait je veux imprimer une TStringGrid (problème récurrent ) assez grande, et dont chaque cellule bénéficie d'une mise en page relativement complexe (multiligne, wordwrap etc...). Ma fonction marche plutôt bien, mais j'ai un problème avec la taille de ce que j'imprime. En effet, j'imprime les cases proprement dites avec la méthode Rectangle() du canvas de mon object TPrinter, et le texte qui va dans ce rectangle avec la méthode TextRect(). En reprenant strictement les mêmes valeurs pour la taille des polices et la taille de mes rectangles que celles de ma StringGrid d'origine, j'imprime le texte à la bonne taille, mais les cases de ma grille sont ridiculement petites.

    Me basant sur un post de ce forum sur le meme sujet, j'ai appliqué un facteur en dur sur la taille de mon rectangle, mais j'aimerais pouvoir déterminer ce facteur au moment de l'exécution, car j'imagine qu'il dépend de la résolution de l'imprimante.

    J'ai essayé de récupérer les infos de résolution via la méthode TPrinter::GetPrinter() mais je ne vois pas comment utiliser les valeurs obtenues...

    Quelqu'un aurait il une suggestion sur le calcul exact de ce coef, afin d'être sûr que la mise en page de ma grille soit concervée? (j'ai déjà assez lutté pour la réaliser )

    Par avance merci

    Arnaud



    [EDIT: Merci ovh et Pasqualini, ca marche tout bien, meme si je ne comprend tjrs pas pourquoi ma solution ne marchait pas... enfin... ]
    Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    La fonction
    int GetDeviceCaps( HDC hdc, int nIndex); de L'API Windows
    donnent toutes les informations sur l'imprimante.
    Par exemple pour avoir les pixels /pouce suivant la largeur :
    int PixelsParInch=GetDeviceCaps(Printer()->Handle, LOGPIXELSX);
    Gilbert PASQUALINI

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 58
    Points : 86
    Points
    86
    Par défaut
    Bonjour!

    Tout d'abord, merci pour la réponse

    Alors, en fait c'est plus ou moins ce que j'avais fait... pour calculer le coef entre la largeur "physique" d'un pixel sur l'ecran et d'un pixel sur l'imprimante, je voulais tout simplement diviser les 2 dpi (celui de l'ecran et celui de l'imprimante)

    J'ai utilisé ce code pour récuperer les infos de mon imprimante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char *ADevice, *APort, *ADriver;
    ADevice = new char[255];
    APort = new char[255];
    ADriver = new char[255];
    THandle ADeviceMode;
    LPDEVMODE pMode;
    Prntr->GetPrinterA(ADevice, ADriver, APort, ADeviceMode);
     
    pMode =(LPDEVMODE)GlobalLock((HGLOBAL)ADeviceMode);
    Pour récuperer les informations de l'ecran, j'utilise la fonction dont tu viens de parler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int dpiScreen = GetDeviceCaps( this->Canvas->Handle, LOGPIXELSY);
    où "this" est ici ma form principale.

    Ensuite je voulais faire qqch du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int rapport_dpi = pMode->dmYResolution / dpiScreen;
    Mon souçi (j'imagine que c'est un truc trop trop idiot, mais j'avoue que je ne vois pas du tout d'où vient le probleme) c'est que mon entier dpiScreen a une valeur completement démente. J'ai exactement le même probleme avec "pMode->dmYResolution": si je passe la souris dessus apres avoir placé un point d'arret dans le code, il me donne bien la bonne valeur de dpi de l'imprimante (par exemple: 600). Par contre, si j'essaye d'assigner cette valeur a une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int dpi_Imprimante = pMode->dmYResolution
    , alors dpi_Imprimante a une valeur complètement fantaisiste...

    Quelqu'un voit où je fais une erreur?


    -Arnaud
    Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.

  4. #4
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Voici un code que j'avais écrit lors de ma dernière manip de l'imprimante avec C++Builder. Le canvas passé en paramètre peut être soit le canvas d'écran, soit le canvas d'imprimante. Les seules valeurs physiques dont je me sers sont les résolutions horizontales et verticales, je n'ai pas eu besoin du reste. Grâce à ça, mon "dessin" (en fait il s'agit d'une carte de membre = une image + quelques lignes de texte et un cadre) apparaît parfaitement à la bonne échelle que ce soit à l'écran ou à l'impression. Je t'ai mis un extrait où tu vois comment je calcule mon facteur d'échelle.
    En espérant que tu y trouves de l'inspiration...

    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
     
    //---------------------------------------------------------------------------
    // Fonction d'affichage de la carte
    // Convention: toutes les coord. sont en pixels d'écran à 96 dpi. Convertis suivant la résolution
    // du canvas de sortie (imprimante)
    //---------------------------------------------------------------------------
    void __fastcall TFormCard::Draw(TCanvas* canvas)
    {
      LabelResolution->Visible = false;
      LabelPrintRes->Visible = false;
     
      int resX=96, resY=96;   // 96 dpi = résolution d'écran sous Windows (72 sous Mac)
      // Détecte la résolution du canvas:
      try {
        resX = GetDeviceCaps(canvas->Handle, LOGPIXELSX);
        resY = GetDeviceCaps(canvas->Handle, LOGPIXELSY);
        if (resX != 96) {      // affiche la résolution de l'imprimante
          LabelResolution->Caption = AnsiString(resX)+" x "+AnsiString(resY)+" dpi";
          LabelResolution->Visible = true;
          LabelPrintRes->Visible = true;
        }
      }
      catch (...) {
        Application->MessageBox("Impossible de déterminer la résolution du canvas (dpi).",
          "Erreur", MB_OK | MB_ICONWARNING);
      }
     
      // MargeG et MargeH = point d'origine où commencer à écrire, en coord. absolue
      // (par rapport au canvas, donc)
      int MargeG=10*(float)(resX/96), MargeH=10*(float)(resY/96);

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

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

Discussions similaires

  1. Probleme d'impression (probleme de droit ?)
    Par RonanSUNmode dans le forum Unix
    Réponses: 1
    Dernier message: 14/11/2008, 08h40
  2. Objet OLE - pdf - probleme de taille/résolution
    Par Flamby38 dans le forum Word
    Réponses: 6
    Dernier message: 20/07/2008, 00h49
  3. impression probleme word
    Par guismoman33 dans le forum Word
    Réponses: 0
    Dernier message: 11/10/2007, 11h29
  4. [Impression] Probleme classes Book et PrintJob
    Par Cedric L. dans le forum Documents
    Réponses: 3
    Dernier message: 08/08/2007, 11h26
  5. [Impression]Problème avec Laser
    Par Cyborg289 dans le forum Général Java
    Réponses: 4
    Dernier message: 01/12/2005, 14h55

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