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

Langage Delphi Discussion :

[TBitmap] et impression positionnée


Sujet :

Langage Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 287
    Points : 1 934
    Points
    1 934
    Par défaut [TBitmap] et impression positionnée
    Title : [TBitmap] et impression positionnée


    Bonjour,

    Je cherche une façon simple de dimensionner un TBitmap, car le principe de la procédure ci-dessous donne une impression microscopique, malgré mon ajout des deux lignes bleues

    J'ai testé via la méthode Printer.Canvas.StretchDraw(); ce qui fonctionne impec, mais je ne souhaite pas passer via le TRect, car ensuite c'est pour extrapoler afin de placer un TBitmap en un point précis lors du printage...

    Je suis allé voir aussi sur la FAQ pour m'en inspirer :
    http://delphi.developpez.com/faq/?pa...dimensionimage

    Mais je souhaite comprendre comment faire pour ajouter une ou deux lignes dans la procédure ci-dessous afin que ce dimensionnement soit effectivement pris en compte.

    Car le tour de passe-passe de cette Q entre un TJpegImage et un TBitMap... je ne pige pas trop le fond de la manip.

    Voici ce principe simple de procédure... comment faire pour dimensionner ?

    procedure TForm1.BtnPrintClick(Sender: TObject);
    var
    B : TBitmap;
    begin
    B := TBitmap.Create;

    B.Width := 1000;
    B.Height:= 1000
    ;


    B.LoadFromFile('C:\Logo.bmp');
    Printer.BeginDoc;
    Printer.Canvas.Draw(20, 20, B);
    Printer.EndDoc;
    B.Free;
    end;
    Merci d'avance de vos idées

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Essaye ces modifications, ca devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.BtnPrintClick(Sender: TObject); 
    var 
    B : TBitmap; 
    begin 
    B := TBitmap.Create; 
    B.LoadFromFile('C:\Logo.bmp'); 
    Printer.BeginDoc; 
    //
    R.left:=20 ; R.Top:=20 ; R.Right:=20+1000-1; R.Bottom:=20+1000-1 ;
    Printer.Canvas.stretchdraw(R,B) ;
    //
    Printer.EndDoc; 
    B.Free; 
    end;

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 287
    Points : 1 934
    Points
    1 934
    Par défaut
    Bonjour,

    Graffito, merci de ta réponse, mais comme indiqué précédemment, j'avais abandonné cette recherche sur la méthode TRect, cela m'empêche de convertir les coordonées X et Y en millimètres que je saisis via deux édits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Printer.Canvas.StretchDraw(
       Millimetres2PixelsX(50) - NonImprimableHorizPixelsX,
       Millimetres2PixelsY(20) - NonImprimableVertiPixelsY, R, B);
    A chaque fois, j'ai l'erreur suivante ==> Types incompatibles : 'TRect' et 'Integer'

    C'est pour cette raison que je me tourne vers le Printer.Canvas.Draw(), mais peut-être que je me trompe.

    Je m'appuie pour ce faire, en extrapolant sur les pictures, via le super tuto à Jean-Luc :
    http://alphomega.developpez.com/coordprintermm/

    @+

  4. #4
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 287
    Points : 1 934
    Points
    1 934
    Par défaut
    Bonjour,

    Je viens de trouver un autre code qui fonctionne aussi impec, mais pôô moyen pour déplacer le TBitmap au printage, est-ce possible avec cette méthode TRect ?
    (je ne parle pas de l'étirer..., mais de le déplacer)

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    B := TBitMap.Create;
    B.LoadFromFile('C:\Logo.bmp');
    ...
     try
    ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
    ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
    R := Rect(0, 0, B.Width * ScaleX, B.Height * ScaleY);
    Canvas.StretchDraw(R, B);
    finally
    ...
    Comment faire pour placer à la demande un TBitmap au printage ?

    Merci de vos idées.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Je ne sais pas si je répons à la question, mais pour positionner le top/left du rectangle en position X,Y :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    R := Rect(X, Y, X+B.Width * ScaleX, Y+B.Height * ScaleY);
    Evidement, X et Y étant en pixels, il faut convertir les ajuster à partir de leur coordonées en mm.

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 287
    Points : 1 934
    Points
    1 934
    Par défaut
    Bonsoir,

    Citation Envoyé par Graffito
    Bonjour,

    Je ne sais pas si je répons à la question, mais pour positionner le top/left du rectangle en position X,Y :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    R := Rect(X, Y, X+B.Width * ScaleX, Y+B.Height * ScaleY);
    Evidement, X et Y étant en pixels, il faut convertir les ajuster à partir de leur coordonées en mm.
    Oui, ensuite la conversion, mais faut déjà que le principe fonctionne.

    Merci de ton aide, je viens de reprendre cette procédure, la printeuse démarre et s'arrête aussitôt, si tu vois des erreurs dans le code, ce serait fort possible, merci de me le dire

    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
    procedure TForm1.Button1Click(Sender: TObject);
       var
            R: TRect;
            B : TBitmap;
            ScaleX, ScaleY, X, Y: Integer;
          begin
             R.left:=20;
             R.Top:=20;
             R.Right:=20+1000-1;
             R.Bottom:=20+1000-1;
         X:= 20;
         Y:= 1500;
               B := TBitmap.Create;
               B.LoadFromFile('C:\Logo.bmp');
               Printer.BeginDoc;
               R := Rect(X, Y, X+B.Width * ScaleX, Y+B.Height * ScaleY);
             Printer.Canvas.stretchdraw(R,B) ;
          Printer.EndDoc;
       B.Free;
    end;
    @+


    ===============================================

    Je viens de trouver ceci, il parait que c'est THE solution lol :

    (Mais j'vois pas trop comment l'utiliser....)

    Oui j'ai effectivement trouvé la solution, il ne faut jamais utiliser StrechDraw avec le canvas d'une imprimante.

    Alors voici la fonction qui marche à tous les coups :
    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
    Procedure PrintBitmap(Canvas:  TCanvas; DestRect:  TRect;  Bitmap:  TBitmap);
    Var
      BitmapHeader:  pBitmapInfo;
      BitmapImage :  POINTER;
      HeaderSize  :  DWORD;    // Use DWORD for D3-D5 compatibility
      ImageSize   :  DWORD;
    BEGIN
      GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
      GetMem(BitmapHeader, HeaderSize);
      GetMem(BitmapImage,  ImageSize);
      Try
        GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
        StretchDIBits(Canvas.Handle,
                      DestRect.Left, DestRect.Top,     // Destination Origin
                      DestRect.Right  - DestRect.Left, // Destination Width
                      DestRect.Bottom - DestRect.Top,  // Destination Height
                      0, 0,                            // Source Origin
                      Bitmap.Width, Bitmap.Height,     // Source Width & Height
                      BitmapImage,
                      TBitmapInfo(BitmapHeader^),
                      DIB_RGB_COLORS,
                      SRCCOPY)
      Finally
        FreeMem(BitmapHeader);
        FreeMem(BitmapImage)
      End;
    END;

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    j'ai essayé le code en rajoutant les 2 instructions pour initialiser scaleX et scale Y, ca marche .

  8. #8
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 287
    Points : 1 934
    Points
    1 934
    Par défaut
    Bonsoir,

    Citation Envoyé par Graffito
    Bonjour,

    j'ai essayé le code en rajoutant les 2 instructions pour initialiser scaleX et scale Y, ca marche .

    Graffito, super, merci !

    Mais oui, j'avais oublié d'initialiser ces deux variables, ça m'apprendra de ne pas avoir séparé les tests aux maquettes d'essais, car avec les lignes : [Avertissement] ... Type non protégé 'point1: Pointer, etc. , un avertissement de plus ou de moins, je ne regarde pas souvent.

    Je ne pensais pas que ce soit possible de pouvoir déplacer un TBitmap avec cette fameuse méthode stretchdraw().

    Ci dessous le code en entier pour, grâce à toi, en démontrer le contraire :

    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
    ...
    var
            R: TRect;
            B : TBitmap;
            ScaleX, ScaleY, X, Y: Integer;
          begin
               B := TBitmap.Create;
               B.LoadFromFile('C:\Logo.bmp');
                 R.left:=20;
                 R.Top:=20;
                 R.Right:=20+1000-1;
                 R.Bottom:=20+1000-1;
    X:= 300; 
    Y:= 850;
    ScaleX := 5;
    ScaleY := 5;
               Printer.BeginDoc;
               R := Rect(X, Y, X+B.Width * ScaleX, Y+B.Height * ScaleY);
             Printer.Canvas.stretchdraw(R,B) ;
          Printer.EndDoc;
       B.Free;
    end;
    Ceci dit, je serais curieux avant de clôturer ce post de connaître comment faire afin d'éviter que le TBitmap du code ci-dessous ne soit réduit à un truc microscopique !
    A voir comme ça, ça ne parait pas le Pérou à trouver lol

    Ça m'arrangerait super, car je pourrais facilement extrapoler vers des réglages directs via des édits de saisie en millimètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.BtnPrintDosChqClick(Sender: TObject);
     var
        B : TBitmap;
      begin
        B := TBitmap.Create;
        B.LoadFromFile('C:\Logo.bmp');
        Printer.BeginDoc;
        Printer.Canvas.Draw(20, 20, B);
        Printer.EndDoc;
        B.Free;
    end;
    Encore merci @+

  9. #9
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 287
    Points : 1 934
    Points
    1 934
    Par défaut
    Bonsoir !

    Oupssss, mais je pense que je vais tenter de la parfaire cette procédure, dans la sens de la saisie en millimètres

    ...
    R.Right:=20+1000-1;
    R.Bottom:=20+1000-1;
    X:= 12 * 254; // ici par exemple 12 centimètres en X
    Y:= 15 * 254; // ici par exemple 15 centimètres en Y

    ScaleX := 5;
    ScaleY := 5;
    Printer.BeginDoc;
    R := Rect(X, Y, X+B.Width * ScaleX, Y+B.Height * ScaleY);
    Printer.Canvas.stretchdraw(R,B) ;
    ...
    Ci-dessus, j'ai ajouté le coëf multiplicateur de 254, mais reste encore à ajouter des bricoles afin de prendre en compte le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (GetDeviceCaps(Printer.Handle, LOGPIXELSY), 10 * Millims, 254);
    etc. afin de tenir compte des marges suivants les différentes printeuses.

    Je vais me replonger dans le tuto à Jean-Luc

    Le premier qui y arrive, poste...

    Merci !

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    [Edit] : il y a du post croisé dans l'air : le temps que je rédige ça tu as poster des trucs, donc ne fait pas attention à tout ce que j'ai raconté... LOL

    Je pense que ce que tu n'as pas compris, c'est :
    1) la taille du canvas de l'imprimante
    2) L'utilisation d'une zone définie par TRect

    Pour la taille du canvas de l'imprimante, tu peux l'obtenir avec printer.PageHeight et printer.PageWidth. Sur mon imprimante, j'ai (si je la met en mode portrait) PageHeith=3600 pixels et PageWith=2400 pixels.

    Donc à coté, ton bitmap de 100 par 100 (par exemple) qui te parait énorme, en fait il est tout petit

    Il va donc falloir l'agrandir, c'est sur... avec la méthode
    Printer.Canvas.StretchDraw(constRect:TRect;Graphic:TGraphic);
    ça le fera très, très bien !
    Pour Graphic, tu as compris qu'il s'agissait de ton Bitmap
    Reste à déterminer ce qu'est Rect et comment le définir.

    En fait, Rect est un rectangle défini par la position de son point en haut à gauche (Rect.Left et Rect.Top) et de son point en bas à droite (Rect.Bottom, Rect.Right) sur le canvas de ton imprimante.

    Bref c'est la zone du canvas qui va être occupé par ton bitmap.

    Si tu regarde les dimmensions de ton canvas d'imprimante (3600x2400 par exemple), ton coin supérieure gauche (coordonnées (20,20)) va vraiment se trouver tout près des bords. En effet, si tu compares l'ordre de grandeur entre 3600 et 20, ça fait un rapport de 0,5%. Bref tu ne tombera pas loin de l'origine (0,0).

    Si tu veux des marges un peu plus respectables, il te faudra donc écrire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonRect.Left:=200;
    TonRect.Top:=200;
    Ensuite, la dimension de ton bitmap sur ta page, tu peux lui mettre sa taille à 1000 par 1000 comme te l'a proposé graffito dans sa première réponse. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Rect.Right:=Rect.Left+1000;
    Rect.Bottom:=Rect.Top+1000;
    Printer.Canvas.stretchdraw(TonRect,B) ;
    Ensuite, comment veux tu faire utiliser StretchDraw comme ça : (???)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Printer.Canvas.StretchDraw(
       Millimetres2PixelsX(50) - NonImprimableHorizPixelsX,
       Millimetres2PixelsY(20) - NonImprimableVertiPixelsY, R, B);
    StretchDraw n'accepte que deux paramètres : ta zone rectangulaire et ton graphique, normal que Delphi râle à la compilation !
    Ce dernier s'attent à rencontrer en premier paramètre un TRect, et non pas Millimetres2PixelsX(50) - NonImprimableHorizPixelsX qui est effectivement un integer.

    En fait, il aurait plutôt fallu, que tu écrives :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    R.left:=Millimetres2PixelsX(50) - NonImprimableHorizPixelsX;
    R.top:=Millimetres2PixelsY(20) - NonImprimableVertiPixelsY;
    R.Right:=R.Left+1000;
    R.Bottom:=R.Top+1000;
    Printer.Canvas.stretchdraw(R,B) ;
    ..là, ça aurait compilé sans problème...

    Puis, quand tu essaies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
    ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
    R := Rect(0, 0, B.Width * ScaleX, B.Height * ScaleY);
    Canvas.StretchDraw(R, B);
    ...
    là non plus tu ne tombe pas loin !
    Tu dis que tu ne peux pas le déplacer, si tu peux ! Tu dois rajouter ton décalage (decaleX et decalY) dans les dimensions de ton TRect, comme ça par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
    ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
    DecaleX:=200;
    DecaleY:=400;
    R := Rect(DecaleX, DecaleY, B.Width * ScaleX+DecaleX, B.Height * ScaleY+DecaleY);
    Canvas.StretchDraw(R, B);
    ...
    Encore bingo pour Graffito !

    J'espère sincèrement t'avoir éclairé sur l'utilisation de la structure TRect, il faut vraiment que tu te penche dessus, c'est là la clé de ta solution.

    Après, pour avoir obtenir valeurs qui te conviennent pour Rect.left, rect.top, rect.right et rect.right. soit tu les initialise individuellement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    R.left:=x1;
    R.top:=y1;
    R.Right:=x2;
    R.Bottom:=y2;
    Soit toutes d'un coup, comme ça :
    Les deux méthodes aboutissent au même résultat, tout dépend de ce que tu vas mettre à la place de x1, x2, y1 et y2... (les formules mathématique ad'hoc en l'occurence)

    Bon courage et bon dev

  11. #11
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par J-P
    Bonsoir,

    Merci de ton aide, je viens de reprendre cette procédure, la printeuse démarre et s'arrête aussitôt, si tu vois des erreurs dans le code, ce serait fort possible, merci de me le dire

    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
    procedure TForm1.Button1Click(Sender: TObject);
       var
            R: TRect;
            B : TBitmap;
            ScaleX, ScaleY, X, Y: Integer;
          begin
             R.left:=20;
             R.Top:=20;
             R.Right:=20+1000-1;
             R.Bottom:=20+1000-1;
         X:= 20;
         Y:= 1500;
               B := TBitmap.Create;
               B.LoadFromFile('C:\Logo.bmp');
               Printer.BeginDoc;
               R := Rect(X, Y, X+B.Width * ScaleX, Y+B.Height * ScaleY);
             Printer.Canvas.stretchdraw(R,B) ;
          Printer.EndDoc;
       B.Free;
    end;
    Tu as oublié
    Pour StrtechDraw, ça pause effectivement problème avec certaines imprimante, celà dit, je n'ai jamais rencontré de problèmes jusqu'à présent... mais qui sait

  12. #12
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 287
    Points : 1 934
    Points
    1 934
    Par défaut


    Il y a des tirs croisés ce soir lol

    waskol, merci pour tous ces ajouts, je vais regarder cela demain à tête reposée et t'en remercie hautement.

    Je reviendrais pour les nouvelles.

    En attendant, voici ce que j'avais pondu tout frais :

    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
    procedure TForm1.Button1Click(Sender: TObject);
       var
            R: TRect;
            B : TBitmap;
            ScaleX, ScaleY, X, Y: Integer;
            Axe_X, Axe_Y: Integer;
          begin
               B := TBitmap.Create;
               B.LoadFromFile('C:\Logo.bmp');
                 R.left:=20;
                 R.Top:=20;
                 R.Right:=20+1000-1;
                 R.Bottom:=20+1000-1;
    X := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSX), 10 * 90, 254);
    Y := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSY), 10 * 150, 254);
    ScaleX := 5;
    ScaleY := 5;
               Printer.BeginDoc;
               R := Rect(X, Y, X+B.Width * ScaleX, Y+B.Height * ScaleY);
             Printer.Canvas.stretchdraw(R,B) ;
          Printer.EndDoc;
       B.Free;
    end;
    Code en entier de principe, manque plus d'ajouter des variables aux 90 en X et 150 en Y.

    Affaire résolue !



    PS : si vous trouvez encore des modifs pour améliorer le code, ne pas hésiter à poster, merci.

  13. #13
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    J'en ai

    Les voilà :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    implementation
    {$R *.dfm}
    uses printers;
    function Millimetres2PixelsX(Millims: integer): integer;
    var XPixelsParPouce:integer;
    begin
     XPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
     result := Trunc(Millims / (25.4 / XPixelsParPouce));
    end;
     
    function Millimetres2PixelsY(Millims: integer): integer;
    var YPixelsParPouce:integer;
    begin
     YPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
     result := Trunc(Millims / (25.4 / YPixelsParPouce));
    end;
     
    function NomImprimableHorizPixelsX: integer;
    begin
     result := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
    end;
     
    function NomImprimableVertiPixelsY: integer;
    begin
     result := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
    end;
     
     
    procedure PrintBitmap(ABitMap:TBitmap;X_mm,Y_mm,Largeur_mm,Hauteur_mm:integer);
    var X1,Y1,Largeurenpixels,HauteurEnPixels:Integer;
        R:TRect;
    begin
      X1:=Millimetres2PixelsX(50) - NomImprimableHorizPixelsX;
    	Y1:=Millimetres2PixelsY(120) - NomImprimableVertiPixelsY;
      Largeurenpixels:=Millimetres2PixelsX(Largeur_mm);
      HauteurEnPixels:=Millimetres2PixelsY(Hauteur_mm);
      R:=Rect(x1,y1,x1+Largeurenpixels,y1+HauteurEnPixels);
      Printer.BeginDoc;
      Printer.Canvas.StretchDraw(r,ABitMap);
      Printer.EndDoc;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var ABitmap:TBitmap;
    begin
      ABitmap:=TBitmap.Create;
      if OpenPictureDialog1.Execute then
      begin
        ABitmap.LoadFromFile(OpenPictureDialog1.FileName);
        if PrinterSetupDialog1.Execute then
           PrintBitmap(ABitmap,50,50,100,50);
      end;
      Application.ProcessMessages;
      ABitmap.Free;
    end;
     
    end.
    tu remarqueras qu'il y a une procedure PrintBitmap(), avec les valeurs que tu souhaites passer en millimètres...

    Bon dev et bonne nuit

  14. #14
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 287
    Points : 1 934
    Points
    1 934
    Par défaut
    Bonjour,

    waskol, là ce ne sont pas des tirs croisés, mais un véritable feu d'artifice haut en couleurs !

    Je cherchais une solution via un Printer.Canvas.Draw() , je ne l'ai pas trouvé, mais par contre via un Printer.Canvas.StretchDraw() , j'en ai eu au moins trois, je suis comblé.

    Pour la taille du canvas de l'imprimante et du TRect, grâce à toi, ça rentre un peu mieux désormais. Je pige mieux question du micro bitmap de 100 par 100 ; une sorte de dimension relative, ou virtuelle, non ?

    Avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    R.left:=Millimetres2PixelsX(50) - NonImprimableHorizPixelsX;
    R.top:=Millimetres2PixelsY(20) - NonImprimableVertiPixelsY;
    R.Right:=R.Left+1000;
    R.Bottom:=R.Top+1000;
    Printer.Canvas.stretchdraw(R,B) ;
    Je suis aux anges !

    J'espère sincèrement t'avoir éclairé sur l'utilisation de la structure TRect, il faut vraiment que tu te penche dessus, c'est là la clé de ta solution.
    Oui absolument, désormais à chaque fois que je vais tomber sur une proc avec des manips de TBitmap, je penserais à toi, ainsi qu'à Graffito.

    J'avais écrit au bas de mon précédent message:
    PS : si vous trouvez encore des modifs pour améliorer le code, ne pas hésiter à poster, merci.
    Alors avec ton complément posté à 0 heure 48, là tu vas faire de ce topic un objet culte, une sorte de passage obligatoire pour tous les développeurs à la recherche d'infos sur les manip de pictures.

    tu remarqueras qu'il y a une procedure PrintBitmap(), avec les valeurs que tu souhaites passer en millimètres...
    vi, vi ;o)

    Là, l'embarras du choix domine

    En un mot : merci à vous-deux : waskol et Graffito !


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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/09/2014, 08h12
  2. Problème de positionnement du contenu à l'impression
    Par simondll dans le forum Langage
    Réponses: 2
    Dernier message: 07/12/2013, 13h18
  3. Positionnement et taille du texte à l'impression
    Par electroremy dans le forum Vos contributions VB6
    Réponses: 2
    Dernier message: 12/01/2008, 19h55
  4. [CR][VB6] Impression d'un état depuis VB
    Par sda dans le forum SDK
    Réponses: 3
    Dernier message: 06/02/2007, 17h27
  5. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37

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