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

MFC Discussion :

[MFC] Impression enveloppe


Sujet :

MFC

  1. #1
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut [MFC] Impression enveloppe
    Bonjour,

    je suis assez une quiche la dessus
    j'essaye d'imprimer depuis une application Dialog based, des enveloppes.
    Je veux pouvoir choisir la fonte avec sa taille (pas en points, comme sous Word par ex. 16) , spécifier dynamiquement l'imprimante, placer le texte...

    j'ai consulté des posts précédents, mais avant qu'il ne soit trop tard, que je sois embourbé jusqu'au cou, si vous aviez une ptite indication sur la manière de faire...

    http://www.developpez.net/forums/showthread.php?t=92031
    + articles chez code project...

    merciiii

  2. #2
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    bon, j'arrive a écrire sur mon imprimante avec ce qu'il faut.
    maintenant, je dois choisir l'imprimante (sans action utilisateur), choisir l'orientation, et le bac...

    si vous avez des pistes... merci !

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    as-tu regardé la faq: http://c.developpez.com/faq/vc/?page...PrintDialgoBox ?

  4. #4
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    joie, bonheur...
    merci !

  5. #5
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    désolé, je ré ouvre...

    j'avais 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
     
      // Recherche imprimante par defaut
      CPrintDialog pd(FALSE);
      CDC dc;
     
      // selection de l'imprimante.
      if (pd.DoModal() == IDCANCEL)   return;
     
      DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(pd.GetDevMode());
     
      // set orientation to landscape
      pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
      pDevMode->dmPaperSize = DMPAPER_ENV_C5;
      pDevMode->dmDefaultSource = DMBIN_MIDDLE;
      ::GlobalUnlock(pd.GetDevMode());
     
      HDC hdc = pd.CreatePrinterDC();
     
      dc.Attach(hdc); // sinon le mode paysage ne fonctionne pas
      dc.m_bPrinting = TRUE; // dc d'impression.
     
      // Debut d'impression
      DOCINFO di; ::ZeroMemory (&di, sizeof (DOCINFO));
     
      di.cbSize = sizeof (DOCINFO);
      di.lpszDocName = "Carte personalisée";
      if ( dc.StartDoc (&di) )
      {
        dc.StartPage ();
     
        // Traitement perso
        ... 
     
        // Fin de document
        dc.EndPage (); 
        dc.EndDoc ();
      }
      else
      {
        dc.AbortDoc();
      }
      dc.Detach();        // liberation dc d'impression.
    Ca va pour utiliser l'imprimante par défaut, ca marche, c cool !
    Sauf que, j'ai besoin de choisir l'imprimante. En prenant le code donné dans le post : http://www.developpez.net/forums/sho...86#post1202986

    j'ai 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
      HANDLE  hDriver;        
        char * szDriver,         
             * szDevice,
             * szOutput;
      if(!::OpenPrinter(_T("HP LaserJet"),&hDriver,NULL)) {AfficheErreur(_T("OpenPrinter")); return ;}
      if(!hDriver) {AfficheErreur(_T("Tst HPrinter")); return ;}
     
      DWORD       dwBufSize = 0;       
      LPDEVMODE   lpDM;
     
      // get DEVMODE stuff from driver
      dwBufSize =::DocumentProperties( NULL, 
                                      (HANDLE)hDriver,
                                      (LPSTR)szDevice,
                                      (LPDEVMODE)NULL,
                                      (LPDEVMODE)NULL,
                                      (DWORD) 0); 
     
      // alloc space for devmode stuff
      HANDLE hDevMode= GlobalAlloc(GMEM_MOVEABLE, dwBufSize);
      lpDM = (LPDEVMODE)GlobalLock(hDevMode);    
      dwBufSize = ::DocumentProperties(NULL,
                                      (HANDLE)hDriver,
                                      (LPSTR)szDevice,
                                      (LPDEVMODE)lpDM, 
                                      (LPDEVMODE)NULL,
                                      (DWORD)DM_COPY);
     
      lpDM->dmOrientation = DMORIENT_LANDSCAPE;
      lpDM->dmPaperSize = DMPAPER_ENV_C5;
      lpDM->dmDefaultSource = DMBIN_MIDDLE;
      lpDM->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_DEFAULTSOURCE;
     
      dwBufSize = ::DocumentProperties(NULL,
                                      (HANDLE)hDriver,
                                      (LPSTR)szDevice,
                                      (LPDEVMODE)lpDM, 
                                      (LPDEVMODE)lpDM,
                                      (DWORD)DM_IN_BUFFER | DM_OUT_BUFFER);
      ClosePrinter(hDriver);
     
     
      CDC * pDC2 = new CDC;
      pDC2->CreateDC(szDriver,szDevice,szOutput,lpDM);
      pDC2->m_bPrinting = TRUE;
     
      // Unlock memory handle.
      ::GlobalUnlock(hDevMode);
     
     
      DOCINFO di; ::ZeroMemory (&di, sizeof (DOCINFO));
      di.cbSize = sizeof (DOCINFO);
      di.lpszDocName = "Carte personalisée";
      BOOL bRet=TRUE;
      // start document printing process
      if (pDC2->StartDoc(&di)!= SP_ERROR)
      {
        pDC2->StartPage ();
     
        // Traitement perso
        ... 
     
        pDC2->EndPage(); // fin de page    
        pDC2->EndDoc();
      }
      else
      {
        AfficheErreur(_T("Open Print")); 
      }
      delete pDC2;
      if(hDevMode != NULL) 
      {        
        DEVMODE FAR* pDevMode =(DEVMODE FAR*)GlobalLock(hDevMode);
        ::GlobalFree(hDevMode);
      }
    et la, marche pas, j'ai l'erreur "Descripteur invalide" lors de l'appel a StartDoc().
    ai je commis un impair ? ou est l'erreur ?

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Et si tu rajoutes:
    ?

  7. #7
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    rien, en meme temps, la structure est mise a 0 des le depart...
    eh galere !

    --- edit du matin : le createdc ne se passe pas correctement. je ne sais pas si c'est a cause des valeurs des chaines szDevice, szDriver et szOutput qui ne sont jamais initialisées...

  8. #8
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    Ca yest ! ca marche ! Pour ceux que ca interesse :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    HANDLE  hDriver;        
    if(!::OpenPrinter(_T("HP LaserJet"),&hDriver,NULL)) {AfficheErreur(_T("OpenPrinter")); return ;}
    if(!hDriver) {AfficheErreur(_T("Tst HPrinter")); return ;}
    
    PRINTER_INFO_2 * pPrnInfo;
    DWORD            ccBytes = 0;
    // Permet de connaitre la taille requise pour les données
    ::GetPrinter(hDriver, 2, NULL, 0, reinterpret_cast<LPDWORD>(&ccBytes));
    pPrnInfo = (PRINTER_INFO_2 *)malloc(ccBytes);
    if ( pPrnInfo != NULL )
    {
      if ( ::GetPrinter(hDriver, 2, reinterpret_cast<LPBYTE>(pPrnInfo), ccBytes, reinterpret_cast<LPDWORD>(&ccBytes)) == 0 )
      {
        AfficheErreur(_T("GetPrinter"));
        CString msg;
        msg.Format(_T("Needed : %d, Given %d"), ccBytes, sizeof(PRINTER_INFO_2));
        AfxMessageBox(msg);
        return;
      }
    }
    
    DWORD       dwBufSize = 0;       
    LPDEVMODE   lpDM;
    
    // get DEVMODE stuff from driver
    dwBufSize =::DocumentProperties( NULL, 
                                      (HANDLE)hDriver,
                                      (LPSTR)pPrnInfo->pDevMode->dmDeviceName,
                                      (LPDEVMODE)NULL,
                                      (LPDEVMODE)NULL,
                                      (DWORD) 0); 
      
    // alloc space for devmode stuff
    HANDLE hDevMode= GlobalAlloc(GMEM_MOVEABLE, dwBufSize);
    lpDM = (LPDEVMODE)GlobalLock(hDevMode);    
    dwBufSize = ::DocumentProperties(NULL,
                                      (HANDLE)hDriver,
                                      (LPSTR)pPrnInfo->pDevMode->dmDeviceName,
                                      (LPDEVMODE)lpDM, 
                                      (LPDEVMODE)NULL,
                                      (DWORD)DM_COPY);
     
    lpDM->dmOrientation = DMORIENT_LANDSCAPE;
    lpDM->dmPaperSize = DMPAPER_ENV_C5;
    lpDM->dmDefaultSource = DMBIN_MIDDLE;
    lpDM->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_DEFAULTSOURCE;
    
    dwBufSize = ::DocumentProperties(NULL,
                                      (HANDLE)hDriver,
                                      (LPSTR)pPrnInfo->pDevMode->dmDeviceName,
                                      (LPDEVMODE)lpDM, 
                                      (LPDEVMODE)lpDM,
                                      (DWORD)DM_IN_BUFFER | DM_OUT_BUFFER);
    
    ClosePrinter(hDriver);
    
    
    CDC pDC2;
    pDC2.CreateDC(pPrnInfo->pDriverName, (LPCTSTR)pPrnInfo->pDevMode->dmDeviceName,NULL,lpDM);
    pDC2.m_bPrinting = TRUE;
    free(pPrnInfo);
    // Unlock memory handle.
    ::GlobalUnlock(hDevMode);
    
    DOCINFO di; ::ZeroMemory (&di, sizeof (DOCINFO));
    di.cbSize = sizeof (DOCINFO);
    di.lpszDocName = "Carte personalisée";
    BOOL bRet=TRUE;
    // start document printing process
    if (pDC2.StartDoc(&di)!= SP_ERROR)
    {
      pDC2.StartPage ();
    
      pDC2.EndPage(); // fin de page    
      pDC2.EndDoc();
    }
    else
    {
      AfficheErreur(_T("Open Print")); 
    }
    
    if(hDevMode != NULL) 
    {        
      DEVMODE FAR* pDevMode =(DEVMODE FAR*)GlobalLock(hDevMode);
      ::GlobalFree(hDevMode);
    }
    merci à toi r0d d'avoir essayer de me tirer de ce mauvais pas ! thx thx thx

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Merci à toi d'avoir posté la solution

    Bonne continuation

  10. #10
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    je pense que c'est la moindre des choses...
    c'est mieux que de laisser les autres qui peuvent éventuellement s'etre interessés au sujet, sans avoir osé intervenir, ou pour une recherche ultérieure d'un autre galérien de l'impression...

    enfin, chacun fait comme il veut apres...
    bonne journée !

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

Discussions similaires

  1. [MFC] Impression enveloppe
    Par Rupella dans le forum Visual C++
    Réponses: 0
    Dernier message: 01/08/2006, 16h27
  2. Réponses: 3
    Dernier message: 14/03/2005, 19h02
  3. MFC Impression Direct: Problème d'échelle
    Par thealex321 dans le forum MFC
    Réponses: 8
    Dernier message: 17/11/2004, 22h54
  4. [MFC] Impression d'une boite dialogue
    Par mick74 dans le forum MFC
    Réponses: 5
    Dernier message: 03/06/2004, 10h02
  5. [MFC] Impression + Splitter
    Par Air'V dans le forum MFC
    Réponses: 3
    Dernier message: 14/12/2003, 21h42

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