[MFC] problèmes d'impressions

problèmes d'impressions [MFC] - C++ - Programmation

Marsh Posté le 09-04-2006 à 21:12:02    

Bonjour,  
 
Ca fait plusieurs jours que je galère sur ce problème et je sais plus trop où donner de la tête...  
 
1) Je dessine un rectangle de dimensions fixes (x, y) dans une CScrollView.  
 
2) Je lance l'impression de la vue par la méthode conventionnelle (OnPreparePrinting, OnBeginPrinting, OnPrint ...)  
 
Au final, j'obtiens un résultat différent suivant les imprimantes sur lesquelles j'imprime.  
En effet, mon rectangle ne possède jamais les mêmes dimensions et je comprends pas du tout pourquoi  
 
En théorie, les propriétés du Printer ne doivent pas avoir une influence sur la taille de l'objet à imprimer ...  
 

Code :
  1. //Prepare Printing  
  2. BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
  3. {
  4. return DoPreparePrinting(pInfo);
  5. }
  6. // DoPreparePrinting  
  7. BOOL CMyView::DoPreparePrinting(CPrintInfo* pInfo)
  8. {
  9. pInfo->m_nOffsetPage = 0;
  10. pInfo->SetMaxPage (1);
  11. return CView::DoPreparePrinting (pInfo);
  12. }
  13. // Print  
  14. void CMyView::OnPrint( CDC *pDC, CPrintInfo *pInfo )
  15. {
  16. pInfo->m_rectDraw.SetRect(0,0,   pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES));
  17. OnDrawImpression( pDC );
  18. }
  19. void CMyView::OnDrawImpression(CDC* pDC)
  20. {
  21. pDC->Rectangle (CRect (0, 0, 500, 500));
  22. }


 
Si vous avez une idée...
 
Merci  :ange:

Reply

Marsh Posté le 09-04-2006 à 21:12:02   

Reply

Marsh Posté le 09-04-2006 à 23:16:42    

Un classique en fait.
 
Lors de l'impression, le contexte de périphérique employé est celui de l'imprimante dont le mode de mapping est différent de celui de l'écran. En plus chaque imprimante possède sa résolution propre exprimée en DPI (Qu'est-ce que le DPI)
 
CDC::GetDeviceCaps fournit certaines métriques importantes, parmi lesquelles VERTRES, HORZRES, LOGPIXELSX, LOGPIXELSY (pas certain des noms)
 
Sur un DC (Device Context alias contexte périphérique) écran, VERTRES et HORZRES retourne la dimension en pixels. Sur un périphérique d'impression la résolution est différente (mais nettement plus grande que celle de l'écran d'où le dessin tout petit)
 
Après à toi de voir quel rendu tu attends de l'impression pour déterminer la façon de l'imprimer.
 
Quant à la ligne:

Code :
  1. pInfo->m_rectDraw.SetRect(0,0,   pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES));


En faisant cela tu bypass les capacités standard de windows en matière d'options de pagination. Le framework MFC fait le travail pour toi.
 
Une solution consiste à utiliser un mapping exact (non MM_TEXT) comme MM_LOMETRIC.
 
Enfin bref, la programmation avec GDI est subtile. Un lien pour avancer : http://www.functionx.com/visualc/gdi/gdicoord.htm

Message cité 1 fois
Message édité par slash33 le 09-04-2006 à 23:41:52
Reply

Marsh Posté le 10-04-2006 à 22:44:16    

Merci pour la réponse  :)  
 
J'ai intégré quelques calculs de conversions basés sur le rectangle d'impression et sur la méthode HMetricTo... du pDC, et ça semble marcher pas trop mal.
 
Je teste demain chez le client  :whistle:

Reply

Marsh Posté le 11-04-2006 à 12:56:33    

Sojiro_Seta a écrit :

Je teste demain chez le client  :whistle:


En quoi peut consister un produit professionnel qui affiche simplement un rectangle à l'écran et qui autorise son impression ?

Reply

Marsh Posté le 29-08-2006 à 15:00:25    

slash33 a écrit :

En faisant cela tu bypass les capacités standard de windows en matière d'options de pagination. Le framework MFC fait le travail pour toi.


 
Et quelle est donc la bonne manière pour ne pas passer outre le framework ?

Message cité 1 fois
Message édité par _darkalt3_ le 29-08-2006 à 15:00:37

---------------
Töp of the plöp
Reply

Marsh Posté le 29-08-2006 à 15:53:13    

slash33 a écrit :

En quoi peut consister un produit professionnel qui affiche simplement un rectangle à l'écran et qui autorise son impression ?


 
Rectangle Designer V1®©
 
;)

Reply

Marsh Posté le 02-09-2006 à 11:57:09    

_darkalt3_ a écrit :

Et quelle est donc la bonne manière pour ne pas passer outre le framework ?


pDC et pInfo->m_rectDraw sont déja initialisés par le framework. Tu n'as donc pas à changer les paramètres sauf à en avoir réellement besoin. Le DC est modifié dans OnPrepareDC si je ne m'abuse.

Message cité 1 fois
Message édité par slash33 le 02-09-2006 à 11:59:50
Reply

Marsh Posté le 02-09-2006 à 12:18:38    

slash33 a écrit :

pDC et pInfo->m_rectDraw sont déja initialisés par le framework. Tu n'as donc pas à changer les paramètres sauf à en avoir réellement besoin. Le DC est modifié dans OnPrepareDC si je ne m'abuse.


 
:jap:
 


---------------
Töp of the plöp
Reply

Marsh Posté le 02-09-2006 à 18:33:50    

C'était un test ?

Reply

Marsh Posté le 02-09-2006 à 22:36:41    

:??:
 
J'étais confronté à ce pb cette semaine, que j'ai résolu, et je te remercie d'avoir répondu :)


---------------
Töp of the plöp
Reply

Marsh Posté le 02-09-2006 à 22:36:41   

Reply

Marsh Posté le 10-09-2006 à 00:47:13    

Content d'avoir pu t'aider. Oublie l'histoire du test ; un peu parano

Reply

Marsh Posté le 21-01-2009 à 16:46:08    

Bonjour,

 

J'ai un petit pépin...
Je suis actuellement en train de programmer le processus d'impression pour une application professionnelle dans le cadre de mon stage. Après avoir assimilé quelques notions en Visual C++, je me suis documenté sur la démarche à suivre pour mener à bien la mission proposée.
Aujourd'hui je me suis attaqué aux fonctions OnPrepareDC et OnPrint du protocole.
Malheureusement le résultat n'a pas été celui espéré. Je m'en doutais bien, n'ayant pas tout à fait compris les différentes étapes.

 

J'ai donc plusieurs questions que j'empresse de vous poser :

 

- En quoi consiste la fonction OnPrepareDC exactement? et dans quel(s) cas vais-je être amené à devoir la surcharger?
- Mon document est entièrement constitué de texte. Celui-ci est soumis à un processus de colorisation syntaxique, est-ce un problème? vais-je devoir prendre cela en compte dans le développement de la méthode OnPrint? Dois-je au moins prendre en compte le fait que le document soit rempli de texte?

 

Je vais repartir de ma fonction OnPreparePrinting. Celle-ci fonctionne très bien et me renvoie le bon nombre de pages à imprimer pour le document visé.
Je pense vraiment que ça se gâte à partir de ma fonction OnPrepareDC.

 

Dans un premier j'aurais apprécié que vous répondiez à mes questions, en détaillant un peu... j'en ai besoin après plusieurs passés sur de la documentation anglaise.
Par la suite, si finalement il s'avère que j'avais un tant soit peu pigé le principe, je vous proposerai de voir mon code et de me conseiller.

 

D'avance merci :)


Message édité par apze le 21-01-2009 à 17:27:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed