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 du Canvas d'une Form


Sujet :

C++Builder

  1. #1
    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 Impression du Canvas d'une Form
    Bonjours a tous et meilleurs voeux pour cette annee 2008.
    Je termine une petite base de donnees et je dois imprimer les resultats, j'ai fais des recherches et je n'ai rien trouve de convainquant, mais j'ai peut etre trouve une astuce permettant d'imprimer le Canvas d'une Form avec tous ce qu'il contient, il est necessaire de veiller a conserver la proportionnalite entre le Canvas de la Form et celui de Printer, dans l'exemple suivant je ne m'en suis pas occupe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    // ne pas oublier d'inclure  #include "QClipbrd.hpp" et #include "Printers.hpp"
    TRect rd;
            TPrinter *Prntr = Printer();
    rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
    Image1->Picture->Bitmap->Assign(Form1->GetFormImage());
            Prntr->BeginDoc();
            Prntr->Canvas->StretchDraw(rd, Image1->Picture->Bitmap);
            Prntr->EndDoc();
    }

  2. #2
    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
    Je viens de tester
    Une Form qui respecte le rapport Hauteur Largeur de la feuille sur laquelle on va imprimer, j'ai derive des GroupBox
    qui me permettent d'avoir des zones d'encadrement dans lesquelles je peu placer des TCheckBox, TEdit, TMemo, Tlabel, TImage, les cadres des TEdit et TMemo sont mis a None je peu ecrire dans les TEdit, TMemo ou cocher les TCheckBox, je n'utilise que des composants que je sais programmer

  3. #3
    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
    J'ai fais l'essai sur deux autres ordinateurs un equipe de XP l'autre de Window 2000, et la deception ca ne marche pas j'affiche une page blanche, j'ai donc cherche pourquoi chez moi ca fonctionne et pas ailleurs, et je crois avoir compris je travaille avec une resolution de 1680 x 1050 et sur les autres poste la resolution est nettement inferieure j'ai fais l'essai sur le poste XP avec une forme de 400 x 600 donc visible a l'ecran et la ca fonctionne je ferais l'essai demain sur le poste equipe de Window 2000

  4. #4
    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
    J'ai trouve sur le site de codes sources une solution qui permet d'imprimer sur Windows 2000, XP et quelque soit le type d'imprimante et de plus c'est relativement simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    TRect rd;
    TPrinter *Prntr = Printer();
    rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
    Image1->Picture->Bitmap->Assign(Form1->GetFormImage());
    // ligne a ajouter
    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();
    Avec ce code la ou je sortais une page blanche ca imprime apparament certaines imprimantes ou drivers ont besoin de cette information?

    Il me reste un probleme ma fonction de copie de la Form ne copie que ce qui est visible a l'ecran

  5. #5
    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 !

    Encore heureux qu'on imprime que ce qui est visible !
    Si tu cherches à imprimer également le boitier de l'écran avec le circuit imprimé, il te faudra passer par une option... celle en dessous de "No Smoke" !

    Par contre, il y a quand même (peut-être) un truc à rajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Printer()->Canvas->CopyMode = cmSrcCopy;
    Au cas où l'imprimante serait initialisée d'une manière différente (va savoir !) .

    Est-ce qu'il faut par contre passer par DeviceCapabilities et/ou GetDeviceCaps (API Windows) pour effectuer une analyse en profondeur ?

    Un autre truc, ce serait de réaliser le stretch sur un bitmap (ou ici sur ton image) au cas où l'imprimante ne saurait faire que du Draw.

    A plus !

  6. #6
    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
    Salut henderson
    Si tu cherches à imprimer également le boitier de l'écran avec le circuit imprimé, il te faudra passer par une option... celle en dessous de "No Smoke" !
    Je fume pas, meme pas la moquette , mais je m'enfous je bois
    Ma Form a suivant la resolution de l'ecran une dimension plus grande que ne le permet la resolution de l'ecran et je ne parvient a imprimer que ce qui se voit a l'ecran la partie masquee est ignoree, j'ai fais un essai de poser le contenu de ma Form sur un TPageControl de trois pages mais la je ne parviens pas a copier chaque page et a les coller sur un meme Canvas, je copie la premiere page mais pas les suivantes

  7. #7
    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 !

    L'option "No Smoke" est une autre histoire... (celle des hot-lines)

    En fait, il s'agit de déplacer la form sur l'écran et de la recontruire à partir d'une mosaïque.
    Quelque chose comme ça ( faut vérifier quand-même... parce que ... il est tard) :

    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
     
    int top;
    int left;
    Graphics::TBitmap *Image = new Graphics::TBitmap;
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
    Bitmap->Width = ClientWidth;
    Bitmap->Height = ClientHeight;
    for(top = 0; top < Form->Height; top = top + Screen->Height) //<<???
        {
        Top = top; //on déplace la form
        for(left = 0; left < Form->Width; left = left + Screen->Width) //<<???
            {
            Left = left; //idem
            Image->Assign( GetFormImage() ); //ca devrait le faire ???
            Bitmap->Canvas->Draw(left, top, Image);   
            }
        }
    delete Bitmap;
    delete Image;
    Normalement, ça devrait être coupé au couteau (mais je ne sais pas si les paramètres de Screen sont ceux qu'il faut utiliser...) !
    Qui plus est, il faut sans doute démarrer avec un offset à cause de la barre de titre ou alors la rendre invisible pendant le processus... ce qui serait le mieux ! Bref... !!!
    En définitive, la form ne fait que s'auto scanner !
    A plus !

  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
    Apres avoir bien galere je vais peut etre avoir une solution, ce n'est pas tout a fait ce que je cherche mais c'est un debut.
    Donc apres avoir lu des articles sur le sujet il semble judicieux de redefinir le Canvas du TImage, l'essai que j'ai fait recupere deux morceaux d'Image d'une Form cette Image rempli la Form par la fonction Stretch, je copie ces deux portions d'Image dans une autre Form (la fonction Stretch n'est pas activee), chose que je ne savais pas faire avant(une seule Image s'affichait)
    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
     
    TControlCanvas *pCn;
    TControlCanvas *pCn1;
    pCn = new TControlCanvas();
    pCn->Control = Form2->Image1;
    pCn1 = new TControlCanvas();
    pCn1->Control = Form1->Image1;
    // CopyRect(const TRect &Dest, TCanvas* CanvasSrc, const TRect &Source);
    TRect   DestRect, DestRect1, SrcRect, SrcRect1;
    DestRect = Rect(0,0,429,100);
    SrcRect = Rect(0,0,429, 100);
    DestRect1 = Rect(0,201,429,501);
    SrcRect1 = Rect(0,201,429, 501);
    Form2->Show();
    pCn->CopyRect(DestRect, pCn1, SrcRect);
    pCn->CopyRect(DestRect1, pCn1, SrcRect1);

Discussions similaires

  1. <canvas>Placer une forme géométrique dans une autre
    Par Hydre dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 14/05/2009, 00h42
  2. Dessin d'un cercle sur le canvas d'une form
    Par Mickey.jet dans le forum Delphi
    Réponses: 1
    Dernier message: 08/11/2006, 12h50
  3. Réponses: 5
    Dernier message: 23/09/2006, 13h40
  4. question sur le canvas d'une form?
    Par Mickey.jet dans le forum Delphi
    Réponses: 4
    Dernier message: 23/09/2006, 12h01
  5. Comment mettre le curseur d'un Memo sur le Canvas d'une Form ?
    Par julie20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/08/2003, 14h24

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