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 :

Problème d'impression MFC : échelle et résolution [FAQ]


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Problème d'impression MFC : échelle et résolution
    Bonjour,

    je suis confronté à un soucis assez embêtant. J'ai une application MFC (type document vues) en C++ qui a pour principe de représenter des circuits hydrauliques.

    Le plan de travail à imprimer est composé de texte, d'éléments spécifiques à MFC (traits faisant office de liaisons) et de bitmaps (les composants).

    Le soucis, c'est que lors de l'impression (ou de l'aperçu avant impression) la résolution ne convient pas. En effet, la taille de la police est convenable, mais les caractères sont rapprochés et se superposent. Aussi, les bitmaps et les liaisons sont réduit à une taille exagérée rendant l'identification des composants impossible.
    De plus, lors de l'aperçu, l'ensemble de mon plan de travail (1600x1200 pixels) se situe dans le coin supérieur gauche de la page et occupe moins d'un quart de celle-ci.

    Voici le code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void OnBeginPrinting(CDC *pDC, CPrintInfo* pInfo)
    {
        pInfo.m_rectDraw.SetRect(0,0, 
                                dc.GetDeviceCaps(HORZRES), 
                                dc.GetDeviceCaps(VERTRES));
     
        pDC->DLtoLP(&pInfo->m_rectDraw);
        POINT ptmargins;
        pDC->Escape(GETPRINTINGOFFSET, 0, NULL, &ptmargins);
     
        CScrollView::OnBeginPrinting(pDC, pInfo);
    }
    D'autres fonctions sont gérées automatiquement par MFC (OnPreparePrinting(...) et OnEndPrinting(...)).



    Auriez-vous des solutions ?
    Si oui, lesquelles ?

    Merci d'avance à tous ceux et toutes celles qui répondront

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    est ce que ton dessin tient bien compte de la surface de travaille (distinction entre le mode écran et impression) ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Si j'ai bien compris la question, je pense pouvoir y répondre par ceci :

    Lorsque je redimensionne mon espace de travail en 100x100 pixels, et que je tente d'imprimer un seul composant, la taille d'impression n'est pas modifiée et le rendu est toujours aussi petit.


    Sinon, peux-tu me reformuler la question afin que j'y apporte la réponse qui va bien

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    en génénal on prepare l'echelle d'impression dans OnPrepareDC
    http://c.developpez.com/faq/vc/?page...HowToPrintView
    exemple de traitement:
    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
     
    void CSampleView::OnPrepareDC(CDC *pDC,CPrintInfo *pInfo)
    {
          int nScale=1;
          CScrollView::OnPrepareDC(pDC,pInfo);
          CMyDoc *pDoc=GetDocument();
          pDC->SetMapMode(MM_ANISOTROPIC);
          CSize DocSize=pDoc->GetDocSize();// la taille de ton document 
         DocSize.cy=-DocSize.cy;
         pDC->SetWindowExt(DocSize); // dimension de la fenetre.
        // nb pixels par pouce
        int xlgPix= pDC->GetDeviceCaps(LOGPIXELSX);
        int ylgPix= pDC->GetDeviceCaps(LOGPIXELSY);
        // calcul du viewport
        long xExt=static_cast<long>(DocSize.cx*nScale*xlgPix/100L);
        long yExt=static_cast<long>(DocSize.cy*nScale*ylgPix/100L);
     
       // dimension viewport.
       pDC->SetViewPortExt(static_cast<int>(xExt),
                                     static_cast<int>(yExt));
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup, le code était ce qu'il me fallait et l'application fonctionne parfaitement.

    Seul bémol : le plan de travail n'est pas imprimé en totalité. On ne peut imprimer que le contenu de ce qui apparait, à taille d'impression, sur la premire page.

    Ce qui revient à dire que tout élément représenté au dela d'une certaine abscisse n'apparaitra pas au moment de l'impression.

    On pourrait corriger cela en permettant l'impression sur plusieurs pages. Mais l'idéal serait de réduire légèrement le rendu de l'impression. J'ai tenté d'apporter quelques modifications, mais sans réel succès (les composants ne peuvent plus être disposés sur le plan).

    Je vais continuer à chercher, mais si quelqu'un a une solution à me proposer, je suis preneur !!

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    dans ce cas GetDocSize() devrait renvoyer la taille totale du plan de travail et pas uniquement la taille de la fenêtre (GetTotalSize() dans la scrollview ?)...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Je viens de tenter en utilisant GetTotalSize, aucune amélioration.

    En fait, le soucis ne provient pas de la définition de la zone à imprimer, mais à priori de la taille de cette zone sur la feuille. En effet, un composant placé trop à droite n'apparaitra pas à l'impression, mais si l'on passe l'impression en mode paysage, s'il n'est pas trop sur la droite, il apparaitra.

    Il y'a donc selon moi 2 solutions à envisager :
    - permettre à l'impression de s'effectuer sur plusieurs pages
    - réduire la taille du document sur la feuille qui sera imprimée de telle façon qu'il s'y représente en totalité



    Si jamais aucune de ces solutions ne pouvait être envisagée, l'utilisation éventuelle du mode paysage pourrait être une issue de secours satisfaisante.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    le multi page pourrait être une bonne solution .

  9. #9
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    373
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 373
    Points : 512
    Points
    512
    Par défaut bug,...
    bonjour,
    j'ai un systeme d'impression multi pages qui fonctionne, sous visualC++6,
    et en regardant le code posté par farscape, je me suis dit que l'exemple onprepareDC posté par farscape pourrait me sortir d'une bizarrerie ponctuelle..
    hors, lors de la compilation, j'ai ce message d'erreur.
    'SetViewPortExt' : is not a member of 'CDC'
    C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE\afxwin.h(636) : see declaration of 'CDC'
    mais j'utilise le CDC partout dans le code d'impression, pour dessiner, creer des fonts GDI, etc.., sauf cette fameuse fonction 'SetViewPortExt' ,
    d'ou ma grosse interrogation, est-ce que je n'utilise pas depuis longtemps la mauvaise librairie ou les mauvais include.?

    mon soucis est que j'ai un GROS projet qui inclut des librairies comme libmysql, ENET, chilkatlib et autres, et j'ai envisagé de passer en visual 2005, mais le travail est monstrueux..
    donc, est-ce qu'il existe un moyen ou des resources centralisées pour avoir des includes et librairies à jour pour visualC++6 ??

    parceque sur ma machine de dev, bien sur, j'ai installée aussi le visual 2005 et 2008...
    donc je me demande aussi si ces installations n'ont pas pourries les includes..
    voila..
    Merci à tous ceux qui voudront bien reflechir à ce probleme,
    j'ai vraiment besoin d'aide sur ce coup la, j'arrive pas à trouver de solution..

  10. #10
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    alors pour visual 6.0 il faut le dernier service pack 6 (si je ne me trompe pas).
    après il faut installer le dernier sdk pour visual 6.0
    faq: http://cpp.developpez.com/faq/vc/ind...age=IDE#SDKVC6
    logiquement il n'y a pas de mélange possible en vc6 et visual 2005 ; j'ai travaillé comme ça pendant des années .
    si il y a mélange c'est qu'il y a eu un mauvais réglage manuel (intentionnel)

    mais bon c'est reculer pour mieux sauter:
    xp arrive en fin de support en juillet 2010 ,
    pour avoir fait l'essai visual6.0 ne tourne plus sous seven , ni sous le mode xp mode.
    Visual 2010 pointe son nez vers fin avril (j'ai d'ailleurs un article en cours sur le sujet ) ...
    il est temps de passer à autre que vc6.0
    si tu n'utilises pas trop la STL dans ses subtilités la transition est assez indolore : http://farscape.developpez.com/tutor...on-vc6-vc2005/

    @+

  11. #11
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    373
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 373
    Points : 512
    Points
    512
    Par défaut alors, avec un peu de recul
    ben en fait, je suis sous seven depuis un moment, et en fait, j'ai toujours visualC++6, oui je sais, masi probleme d'evolution des sources trop gigantesque.
    donc, le truc, c'est d'installer seven en 32 bits..
    la on peut installer tout.
    et en particulier visualc++6 .
    on pourrait croire que c'est limitatifs, mais je n'ai trouve aucun programme soi disant 64 bits qui ne puisse fonctionner.

    et au moins je conserve la compatibilite totale, meme pour des programmes susceptibles de devoir tourner sur des vieux windows3.1 comme sur les derniers seven.
    vala..

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

Discussions similaires

  1. [C#] Problème d'impression en échelle de gris
    Par ClaudeBg dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/04/2009, 12h56
  2. MFC : Problèmes d'impression...
    Par Sojiro dans le forum MFC
    Réponses: 3
    Dernier message: 10/04/2006, 22h47
  3. Réponses: 16
    Dernier message: 17/03/2005, 13h54
  4. [Rave] problème d'impression
    Par romstarr dans le forum Rave
    Réponses: 2
    Dernier message: 09/06/2004, 15h48
  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