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 d'une image (Fichier JPG) [Système/Fichiers/API]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 401
    Par défaut Impression d'une image (Fichier JPG)
    Bonjour,

    j'ai des problèmes pour imprimer un fichier JPG sur les machines XP (SP3).
    Sur toutes les machines Vista, ce code fonctionne sans problème.

    J'utilise le code suivant

    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
    //---------------------------------------------------------------------------
    //# Void TForm1::PrintFile(Filename)
    //   Print A File to default printer
    //---------------------------------------------------------------------------
    void __fastcall  TVisdrawForm1::PrintFile(String FileName)
    {
      SHELLEXECUTEINFO execinfo;      // Structure ShellExecute(Ex) info
     
      //typedef struct _SHELLEXECUTEINFO {
      //	DWORD cbSize;
      //	ULONG fMask;
      //	HWND hwnd;
      //	LPCTSTR lpVerb;
      //	LPCTSTR lpFile;
      //	LPCTSTR lpParameters;
      //	LPCTSTR lpDirectory;
      //	int nShow;
      //	HINSTANCE hInstApp;
      //	LPVOID lpIDList;
      //	LPCTSTR lpClass;
      //	HKEY hkeyClass;
      //	DWORD dwHotKey;
      //	union {
      //		HANDLE hIcon;
      //		HANDLE hMonitor;
      //	} DUMMYUNIONNAME;
      //	HANDLE hProcess;
      //} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
     
      String action;                                 // action to run
     
      String params = "";
      action =  "print";
      memset(&execinfo, 0, sizeof(execinfo));
      execinfo.lpFile = FileName.c_str();          // programme
      execinfo.cbSize = sizeof(execinfo);
      execinfo.lpVerb = action.c_str();             // Action = Open
      execinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
      execinfo.nShow = SW_SHOWDEFAULT;
      execinfo.lpParameters = params.c_str();   // Parms
    							  // Show Process or not
      execinfo.nShow = SW_SHOW;
     
      ShellExecuteEx(&execinfo);
    Sous Vista, ce code semble appeler WIA ou je peux alors m'occuper de de choisir l'imprimante, le format et puis confirmer. -> No problem

    Sous XP, ce code appelle le "Windows Pictures and fax Viewer", ou je peux également choisir l'imprimante et le format. Quand je confirme le print, le Windows Pictures and fax viewer tourne indéfiniment, jsuqu'à ce que je le tue.

    J'ai essayé en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      execinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      execinfo.fMask = SEE_MASK_INVOKEIDLIST;
    même résultat sous Vista.

    Sous XP, nouvelle fenêtre "Welcome to Photo printing Wizard" où le sablier est permanent et il est impossible de continuer.


    sans toucher à .fmask, c'est pareil à SEE_MASK_NOCLOSEPROCESS
    j'ai fouillé partout.
    J'ai trouvé cette technique dans la FAQ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	Variant wzd, vct;
    	wzd = Variant::CreateObject("WIA.CommonDialog");
    	vct = Variant::CreateObject("WIA.Vector");
    	vct.OleProcedure("Add", FileName.c_str());
    	wzd.OleProcedure("ShowPhotoPrintingWizard", vct);
    	wzd = Unassigned;
    	vct = Unassigned;
    Cela fonctionne parfaitement sous Vista, mais sous XP, le bouton d'appel produit un bong et plus rien d'autre après.

    Quelqu'un peut-il m'aider ?

    NB ; j'ai également trouvé et lu le guide "Impression Avec C++ Builder" traduit par Jean-Pierre Blondelle mais j'y perd un peu mon latin.

    En finalité, une autre technique que je voudrais essayer est celle ci-dessous trouvée sur le forum, mais mon fichier est un .jpg au lieu de .BMP et cela plante direct.

    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
    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();

  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
    Par défaut
    Salut Godzestla
    Pour imprimer avec WIA il y a ceci dans la FAQ le lien
    Pour utiliser "Impression Avec C++ Builder", il faut que tu charge ton fichier Jpeg et que tu le transforme en Bitmap
    Quelques liens sur le Forum

  3. #3
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 401
    Par défaut
    Salut Blondelle,

    merci pour ta réponse.
    Je teste tout cela demain.

    Pour WIA, j'ai, je pense, testé comme tu indiques, mais en XP ça calle.

    Je ne comprends quand même pas pourquoi le ShellExecute "Print" en XP me donne l'interface normale d'impression puis plante plus loin alors que sous Vista tout est normal.
    Quand je fais ShellExecute Open du fichier, tout marche Nickel, mais je me retrouve dans le programme d'Edit de mon JPG, d'où je peux imprimer. Le Hic c'est que mes fichiers Jpeg sont sur un folder libre d'accès en écriture et je ne veux prendre le risque de voir les 40.000 plans disparaître.
    Il y a toujours l'option de copier le Jpeg dans un folder temporaire et d'ouvrir celui-là quand il y a une demande d'impression, mais je garde cette solution en réserve.

    Je vais tester "Impression Avec C++ Builder" avec une adaptation du code que tu me conseilles ici pour directement charger le Jpeg dans un objet TJPEGImage.

    Merci pour ta doc "Impression Avec C++ Builder", je vais en faire un grand usage.

  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
    Par défaut
    La partie WIA a ete testee sous XP pack2 et BCB6, verifie que tu a bien " wiaaut.dll " regarde ce lien.
    Pour le Tuto C++ je n'en suis pas l'auteur je n'ai fait que traduire le Tuto Delphi.
    Pour tes images ne jamais travailler avec les originaux mais avec une copie

  5. #5
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 401
    Par défaut
    Bonjour,

    il me manque effectivement Wiaaut.dlkl sous XP sp3.

    Je ne me sens pas capable de le déployer moi-même sur tous les postes utilisateurs car mes compétences systèmes (sdk) ou gestion des ActveX en C++ Builder sont insuffisantes.
    J'ai regardé tes liens, mais je n'y trouve pas mon compte.

    Je teste d'abord avec le chargement de mon Jpeg dans un objet TJPEGImage.

    Merci encore pour ton aide.

  6. #6
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 401
    Par défaut
    Voilà,

    j'ai fait comme ceci, en ajoutant sur ma fiche un composant TPrinterSetupDialog pour choisir l'imprimante.

    Ca fonctionne en Vista et Xp.

    Merci pour ton aide Blondelle.

    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
    //---------------------------------------------------------------------------
    //# Void TForm1::PrintFile(Filename)
    //   Print A File to Selected printer
    //---------------------------------------------------------------------------
    void __fastcall  TVisdrawForm1::PrintFile(String FileName)
    {
     
    	TJPEGImage *jpg = new TJPEGImage();
    	// Execure PrinterSetupDialog
    	prntrstpdlg1->Execute();
    	jpg->LoadFromFile(FileName);
     
    	Printer()->BeginDoc();
    	Printer()->Canvas->StretchDraw(Rect(0, 0, Printer()->PageWidth, Printer()->PageHeight), jpg);
     
    	Printer()->EndDoc();
    	delete jpg;
    }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/03/2007, 19h41
  2. Réponses: 5
    Dernier message: 21/01/2007, 19h31
  3. Impression d'une image pleine page
    Par Cyrilh7 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 07/11/2005, 09h18
  4. Enlever le boutton impression sur une image !
    Par Gab-Gab dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/11/2004, 23h30
  5. [BPW] Impression d'une image BMP
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 21/08/2003, 14h34

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