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 bitmap + texte


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de bfespi69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Points : 72
    Points
    72
    Par défaut impression bitmap + texte
    Bonjour à tous,

    Je cherche à réaliser une impression particulière avec C++Builder 5.

    Je dois sur la feuille A4 qui sort de l'imprimante imprimer quelques infos texte dans la zone la plus en haut de la feuille, une image bitmap au centre ( qui prendra le + de place ) et peut être quelques infos texte en bas de la page.

    J'ai parcouru plusieurs tutoriels mais sans vraiment tout à fait arriver à mes fins.

    Mon problème est l'insertion du bitmap à la bonne taille et de facon complète. Donc évitons de parler de l'impression du texte, mon problème est ailleurs.

    Dans mon code j'ai tenté d'utiliser plusieurs méthodes sur le Canvas de l'imprimante.

    Ma 1ère solution :
    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
    { 
     
    Graphics::TBitmap* Bitmap = new Graphics::TBitmap(); 
     
    Bitmap->LoadFromFile("C:\\TestCCQ.bmp"); 
     
    Printer()->Orientation = poLandscape; 
     
    Printer()->BeginDoc(); 
     
    Printer()->Canvas->CopyRect(Printer()->Canvas->ClipRect,Bitmap->Canvas,Bitmap->Canvas->ClipRect); 
     
    Printer()->EndDoc(); 
     
    }
    Ce code lance une impression de mon Bitmap en paysage sur tout la partie imprimable de la feuille.

    Mon bitmap est donc étiré si la partie imprimable sur l'imprimante est supérieure au bitmap.

    Mon bitmap est donc rétréci si la partie impribale sur l'imprimante est inférieure au bitmap.

    Cette solution ne me convient pas car je veux pouvoir imprimer du texte sur la feuille en dessus et en dessous de limage.

    Ma 2ème solution :

    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
    { 
     
    Graphics::TBitmap* Bitmap = new Graphics::TBitmap(); 
     
    Bitmap->LoadFromFile("C:\\TestCCQ.bmp"); 
     
    Printer()->Orientation = poLandscape; 
     
    Printer()->BeginDoc(); 
     
    Printer()->Canvas->Draw(0,0,Bitmap);; 
     
    Printer()->EndDoc(); 
     
    }
    Ce code lance une impression de mon Bitmap en paysage sur une toute petite partie imprimable de la feuille.

    Mon Bitmap est imprimé en entier mais l'image sur la feuille est réduite.

    Sur les 21cm x 29.7cm de la feuille A4, mon image prend environ 4cm x 6cm

    Cette solution me convient un peu mieux mais l'image est encore trop petite.

    A ce niveau la il ya peut etre quelque chose à faire pour augmenter la taille ou déplacer l'image mais je n'ai pas réussi.

    Les zéros en parametre de la fonction Draw sont les coordonées de depart de l'impression de mon bitmap.

    (0,0) imprimera tout en haut a gauche , sur les bords de la feuille.

    (100,100) imprimera à partir de 100 pixels du bord haut et 100 pixels du bord gauche.


    J'ai ensuite essayé d'utiliser cette méthode pour redimensionner le canvas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    { 
     
    Bitmap->Canvas->StretchDraw(Printer()->Canvas->ClipRect, Bitmap); 
     
    }
    Mais en fonction de la position de l'appel à cette méthode dans le code :

    la zone imprimable de la feuille est réduite sans que l'image le soit;

    ou la zone imprimable de la feuille est au maximum mais le bitmap est aussi etiré de la meme facon aux mêmes proportions donc incomplet.



    Voilà je fais appel au savoir de tous ceux qui liront ce message.

    Pour récapituler, mon problème est que je suis incapable de dimensionner la taille et la position du mon Bitmap sur le canvas de l'imprimante.

    Si quelqu'un sait comment imprimer à sa guise un bitmap redimensionné et positionné sur la feuille A4, en ayant placé au dessus et en dessous de l'image du texte personnalisé , vous m'aideriez beaucoup.

    Merci d'avance .

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello,

    Est-ce que quelque chose comme ceci pourrait convenir ?
    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
    { 
    Graphics::TBitmap* Bitmap = new Graphics::TBitmap(); 
    Bitmap->LoadFromFile("C:\\TestCCQ.bmp"); 
    Printer()->Orientation = poLandscape; 
    Printer()->BeginDoc(); 
     
    TRect rect;
    // Calcul de la zone d'impression
    rect.Left = ...
    rect.Right = ...
    rect.Top = ...
    rect.Bottom = ...
     
    Printer()->Canvas->StretchDraw(rect, Bitmap); 
     
    Printer()->EndDoc(); 
    }
    A toi de calculer 'rect' en fonction de tes besoins... ;-)

    Tu trouveras des infos sur l'impression avec Builder sur cette page

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    En fait, je pense que la solution à ton problème est de fournir un TRect initialisé correctement en lieu et place du ClipRect de Printer !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int left = 40;
    int top = 40;
    int zoom = 2;
     
    TRect Dest = Rect(left, 
                      top,
                      left + (Bitmap->Width * zoom), 
                      top + (Bitmap->Height * zoom));
     
    Printer()->Canvas->StretchDraw(Dest, Bitmap);
    On devrait pouvoir centrer l'image avec un truc dans ce genre là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int zoom = 2;
    int we = Bitmap->Width * zoom;
    int he = Bitmap->Height * zoom;
    int left = (Printer()->PageWidth - we) / 2;
    int top = (Printer()->PageHeight - he) / 2;
     
     
    TRect Dest = Rect(left, 
                      top,
                      left + we, 
                      top + he;
     
    Printer()->Canvas->StretchDraw(Dest, Bitmap);
    A plus !

  4. #4
    Membre régulier Avatar de bfespi69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    Merci à tous les deux, j'essaye vos solutions proposées tout de suite.

    Je viens de tomber sur un autre problème, en fonction de l'imprimante par défaut de l'ordinateur, les zones d'impression ne sont pas les mêmes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int Width = Printer()->Canvas->ClipRect.Width();
    int Height = Printer()->Canvas->ClipRect.Height();
    Lorsque l'imprimante par défaut est mon EPSON AL-C1110, Height vaut 3388 et Width vaut 2360.

    Lorsque l'imprimante par défaut est PDFCreator (simulateur d'impression qui crée des PDF au lieu d'imprimer) , Height vaut 7016 et Width vaut 4958.

    Si un de vous sait à quoi correspondent ces valeurs (pour mes 2 imprimantes) , n'hésitez pas !

    Merci à tout de suite pour le résultat de mes tests!

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766

  6. #6
    Membre régulier Avatar de bfespi69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    Merci blondelle, Je n'ai pas encore pû tout lire des tutos que tu m'as fourni mais je t'en remercie déjà. Celui sur la conversion de pixels en mm me parait être la solution.

    Merci aussi à henderson et totoche pour leur réponse rapide et efficace.
    Elles sont toutes les 2 en phase avec mon besoin et fonctionnent déjà. J'ai encore quelques soucis avec les tailles en pixels des zones d'impressions mais le tuto désigné par blondelle pourrait finaliser le tout.

    Je pense avoir bientôt toutes les infos nécessaires. J'ai déja pû faire quelques essais et cela me parait très encourageant.

    Je vous tiens informés de la solution finale mise en place.

    Merci à tous!

  7. #7
    Membre régulier Avatar de bfespi69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    Voici ma solution finale :

    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
    31
    32
    33
     
     
        Graphics::TBitmap* Bitmap = new Graphics::TBitmap();
     
        Bitmap ->LoadFromFile("C:\\TestCCQ.bmp");
     
        Printer()->BeginDoc();
     
        int XPixelsParPouce = GetDeviceCaps(Printer()->Handle, LOGPIXELSX);
        int YPixelsParPouce = GetDeviceCaps(Printer()->Handle, LOGPIXELSY);
     
        int NomImprimableHorizPixels = GetDeviceCaps(Printer()->Handle, PHYSICALOFFSETX);
        int NomImprimableVertiPixels = GetDeviceCaps(Printer()->Handle, PHYSICALOFFSETY);
     
        int Marge_Gauche = 15;
        int Marge_Haute = 85;
        int Marge_Droite = 195;
        int Marge_Basse = 280;
     
        int Millimetres2PixelsGauche = Marge_Gauche / (25.4 / XPixelsParPouce);
        int Millimetres2PixelsHaute = Marge_Haute / (25.4 / YPixelsParPouce);
        int Millimetres2PixelsDroite = Marge_Droite / (25.4 / XPixelsParPouce);
        int Millimetres2PixelsBasse = Marge_Basse / (25.4 / YPixelsParPouce);
     
        TRect rect;
        rect.Top = Millimetres2PixelsHaute - NomImprimableVertiPixels;
        rect.Left = Millimetres2PixelsGauche - NomImprimableHorizPixels;
        rect.Right = Millimetres2PixelsDroite - NomImprimableHorizPixels;
        rect.Bottom = Millimetres2PixelsBasse - NomImprimableVertiPixels;
     
        Printer()->Canvas->StretchDraw(rect, Bitmap);
     
        Printer()->EndDoc();
    La valeur de Marge_Gauche est la position en millimètres du bord GAUCHE de mon Bitmap par rapport au bord GAUCHE de la feuille .

    La valeur de Marge_Haute est la position en millimètres du bord HAUT de mon Bitmap par rapport au bord HAUT de la feuille.

    La valeur de Marge_Droite est la position en millimètres du bord DROIT de mon Bitmap par rapport au bord GAUCHE de la feuille.

    La valeur de Marge_Basse est la position en millimètres du bord BAS de mon Bitmap par rapport au bord HAUT de la feuille.

    Donc mon bitmap aura sur la feuille imprimée :

    - une hauteur de Marge_Basse - Marge_Haute soit 280 - 85 = 195mm

    - une largeur de Marge_Droite - Marge_Gauche soit 195 - 15 = 180mm.

    Voila encore merci à tous et bonne continuation!

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Si ton code doit etre porte sur d'autres ordinateurs il se peut que l'impression sorte une page blanche, voici une solution
    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
     
    {
    TRect rd;
    TPrinter *Prntr = Printer();
    rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
    Image1->Picture->Bitmap->Assign(Form1->GetFormImage());
     
    // ligne a ajouter pour eviter une page blanche
    Image1->Picture->Bitmap->PixelFormat = pf24bit; // a adapter
    //TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom}
     
    Prntr->BeginDoc();
    Prntr->Canvas->StretchDraw(rd, Image1->Picture->Bitmap);
    Prntr->EndDoc();
    }
    il y a aussi ceci tire de l'aide en ligne BCB
    TBitmap::HandleType
    indique si le bitmap est un DDB (Device Dependent Bitmap : bitmap dépendant du périphérique) ou un DIB (Device Independent Bitmap : bitmap indépendant du périphérique).
    enum TBitmapHandleType {bmDIB, bmDDB};
    __property TBitmapHandleType HandleType = {read=GetHandleType, write=SetHandleType, nodefault};
    Description
    HandleType permet de connaître ou de modifier le type du bitmap. Les DDB se dessinent sans doute plus rapidement à l'écran, mais peuvent être stockés en mémoire dans un format propre au périphérique. Les DIB sont stockés en mémoire dans un format standard supporté par tous les périphériques (y compris les imprimantes).

  9. #9
    Membre régulier Avatar de bfespi69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    Bonjour,

    Merci encore blondelle!

    Je vais réaliser quelques tests dans la journée et je reposte ma solution finale si j'en ai une autre.

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

Discussions similaires

  1. Impression de text dans une CScrollView
    Par skalimer0 dans le forum MFC
    Réponses: 10
    Dernier message: 19/11/2007, 11h58
  2. Problème d'impression de texte verticalement
    Par m.nico dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/09/2007, 12h48
  3. Problème d'impression du texte
    Par tiyolx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/06/2007, 14h15
  4. Impression fichier texte.. encore !
    Par KeV31 dans le forum Langage
    Réponses: 11
    Dernier message: 29/05/2007, 09h58
  5. Impression de texte
    Par quarkz dans le forum Langage
    Réponses: 10
    Dernier message: 07/09/2005, 13h35

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