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 :

Impression : Orientation des pages


Sujet :

MFC

  1. #1
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut Impression : Orientation des pages
    Bonjour,

    J'ai juste une petite question.

    Je suis en train de jouer avec l'impression. Plus précisément, je joue avec l'orientation de la page ( Portrait, Paysage ) mais sans utiliser la boite de paramètrage de Windows. J'ai mon propre système de sélection de l'orientation.

    Donc là maintenant je suis dans les fonctions d'impression MFC mais je ne sais pas ou et comment signaler au système que l'on va utiliser du portrait ou du paysage.

    Si quelqu'un à une idée, voir la réponse tout simplement, je suis preneur.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    il faut obtenir et modifier un DEVMODE de l'imprimante ,ça correspond aux proprietés de l'imprimante ,ensuite le DC est crée avec le DEVMODE
    voir cet exemple de la faq:
    http://c.developpez.com/faq/vc/?page...PrintDialgoBox
    voir fonction PrintBmp.

  3. #3
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    Ha ba merci, j'avais regarder les paramètres de CPrintDialog mais DEVMOD

    C'est la bonne piste mais c'est bon directement.

    J'ai beau mettre l'orientation, rien ne change. J'ai fait une comparaison avec les paramètre de DEVMOD quand j'utilise l'API windows et ma partie.
    Et en fait l'orientation est bonne mais le seul truc qui change c'est "dmFields".

    J'ai l'impression qu'il faut donner à DEVMOD un paramètre qui spécifie les informations qu'on a modifier.

    Ba ouais, je suis en parmanence en Portrait et dès que je fixe en dur cette valeur avec celle récupération par l'API windows, mirage ça marche direct.

    Je vais donc creuser mais ce serait cool de connaitre les valeurs de chaque constante qui forme la valeur "dmFields"

    En tout cas merci

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    j'ai pas tout compris ,ça fonctionne oui ou non ?
    je suis sur que ça fonctionne, mais je ne t'ai pas trop suivi dans tes explications...

  5. #5
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    Désolé

    Alors juste avec tes indiquations ça ne marche pas, ça reste toujours en portrait.

    EnFait, j'ai fais une comparaison entre le DEVMOD que génére Windows et celui que je modifie. Et la seule différence, c'est le contenu de dmFields.

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    tu as mis :
    dmOrientation=DMORIENT_LANDSCAPE;
    et ça ne fonctionne pas ?
    tu crées bien le dc avec le DEVMODE modifié ? (non visible dans mon code ,ça depend de la maniere de proceder).

  7. #7
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    Alors j'ai avancé un peu.

    Alors l'histoire avec dmFields n'a pas l'air d'être le bon truc.

    En fait le DEVMOD vient d'une boite de dialogue dérivé de CPrintDialog ne contenant pas de sélection d'orientation. Il est donc comme avant sauf que l'orientation n'est pas renseigné.

    J'ai configuré le système pour qu'il imprime en permanence en Paysage.
    La première fois que j'affiche l'aperçu, il me l'affiche en Portrait ( avec dmFields = 25227091 ) et la seconde fois en Paysage ( avec dmFields = 25292627 ).

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ce n'est pas bon tout ça ,tu peux me montrer ton code ?

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    sur le principe de travailler avec un DEVMODE voici un exemple:
    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
    88
    89
    90
    91
    92
     
    // -------------------------------------------------------------
    int ReportPrint(const char *szPrinterName,const char *szDocumentName,int nCopy)
    {
        // 
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        if(!pDrawReport) return 0;
        if(!pDrawReport->OnInitReport())
        {
            delete pDrawReport;
            pDrawReport=NULL;
            return(0);
        }
        CDC *pDC;
        // lecture du m_choix imprimante
        char PrnStr[200],prn[256];
        GetProfileString("PrinterPorts",szPrinterName,NULL,PrnStr,sizeof(PrnStr)-1);
        strcpy(prn,szPrinterName);
        strcat(prn,",");
        strcat(prn,PrnStr);
     
        char *szDriver,         
             *szDevice,
             *szOutput;
     
        szDevice=strtok(prn,",");
        szDriver=strtok(NULL,",");
        szOutput=strtok(NULL,",");    
     
        // load printer driver
        HANDLE  hDriver;        
        if(!OpenPrinter(szDevice,&hDriver,NULL)) return 0;
        if(!hDriver) return 0;                
     
        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);
     
        if((lpDM->dmFields & DM_COPIES) && nCopy!=1)
                    lpDM->dmCopies=nCopy;
     
        ClosePrinter(hDriver);
     
     
        pDC = new CDC;
        pDC->CreateDC(szDriver,szDevice,szOutput,lpDM);
        pDC->m_bPrinting = TRUE;
     
        // Unlock memory handle.
        ::GlobalUnlock(hDevMode);
     
     
        DOCINFO    m_docInfo;
        memset(&m_docInfo, 0, sizeof(m_docInfo));
        m_docInfo.cbSize = sizeof(m_docInfo);
        m_docInfo.lpszDocName = szDocumentName;        
        m_docInfo.lpszOutput = NULL;
        BOOL bRet=TRUE;
        // start document printing process
        if (pDC->StartDoc(&m_docInfo)!= SP_ERROR)
        {
            pDrawReport->OnDrawReport(pDC);            
            pDC->EndPage(); // fin de page    
            pDC->EndDoc();
        }
        else bRet=FALSE;
        delete pDC;
        delete pDrawReport;
        pDrawReport=NULL;
        if(hDevMode != NULL) 
        {        
            DEVMODE FAR* pDevMode =(DEVMODE FAR*)GlobalLock(hDevMode);
            ::GlobalFree(hDevMode);
        }
       return bRet;
    }
    dans l'exemple je modifie le nombre de copie pour l'imprimante.
    pour le portrait ou paysage c'est le meme principe..
    et je persiste a dire que c'est la bonne méthode et que ça fonctionne .

  10. #10
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    Je suis convaincu que c'est la bonne manière mais l'orientation ne fonction pas la première fois.

  11. #11
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    A y est j'ai compris.

    Je me suis trompé d'endroit pour fixer la valeur. C'était trop tard.
    Maintenant il faut juste trouvé le bon moment pour le fixer.

    A suivre ...

  12. #12
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    C'était bien ça

    Alors merci car c'était effectivement le bon moyen de le faire.

    En fait lors du "OnPreparePrinting", je fais la modification de l'orientation puis je supprime le HDC actuel et je le recréé, avec la nouvelle orientation.

    Et maintenant, ça marche du premier coup

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par vanitom
    C'était bien ça

    Alors merci car c'était effectivement le bon moyen de le faire.

    En fait lors du "OnPreparePrinting", je fais la modification de l'orientation puis je supprime le HDC actuel et je le recréé, avec la nouvelle orientation.

    Et maintenant, ça marche du premier coup
    c'est pour ça que j'insistai sur la maniere de creer le dc ,si tu relis le post de la faq cité tu verras que je crée le dc differement .....
    en reference a cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        //dc.Attach(printDlg.GetPrinterDC()); sinon le mode paysage ne fonctionne pas

  14. #14
    Membre éclairé Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Par défaut
    Maintenant c'est bon c'est le bonheur.

    Par contre, j'ai juste une question pour savoir si c'est possible.

    J'ai ma boite de dialogue permettant de sélectionner l'imprimante et ses propriétés ainsi que l'orientation de la page.

    Mais il y a un petit détail un peu chiant. Par exemple, j'ai fixé ma page en Paysage. Et quand je vais dans les propriétés de l'imprimante, la page est en portrait et peut être modifié. Existe-t'il un moyen standard pour bloquer ce paramètre dans les propriétés de l'imprimante ?

    Je parle de moyen standard car ces propriétés change en fonction de l'imprimante.

    J'ai essayé de modifier le DEVMOD dès que je modifie l'orientation pour au moyen garder une cohérence dans les informations mais même ça, ça ne marche pas correctement.

Discussions similaires

  1. [CR 9] Orientation des pages VS fusion de rapport
    Par belfaigore dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 14/12/2009, 16h48
  2. Orientation des pages pour impression
    Par Momodedf dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 19/01/2009, 14h21
  3. Impression des pages JSP
    Par khattat dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 11/08/2008, 23h10
  4. Comment délimiter des pages pour l'impression ?
    Par pigpen dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 31/05/2007, 10h28
  5. Réponses: 3
    Dernier message: 07/12/2006, 21h35

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