Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1782 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [MFC] problèmes d'impressions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MFC] problèmes d'impressions

n°1342529
Sojiro_Set​a
Posté le 09-04-2006 à 21:12:02  profilanswer
 

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:

mood
Publicité
Posté le 09-04-2006 à 21:12:02  profilanswer
 

n°1342648
slash33
Posté le 09-04-2006 à 23:16:42  profilanswer
 

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
n°1343628
Sojiro_Set​a
Posté le 10-04-2006 à 22:44:16  profilanswer
 

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:

n°1344020
slash33
Posté le 11-04-2006 à 12:56:33  profilanswer
 

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 ?

n°1433101
_darkalt3_
Proctopathe
Posté le 29-08-2006 à 15:00:25  profilanswer
 

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
n°1433133
straffo
Posté le 29-08-2006 à 15:53:13  profilanswer
 

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®©
 
;)

n°1435544
slash33
Posté le 02-09-2006 à 11:57:09  profilanswer
 

_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
n°1435559
_darkalt3_
Proctopathe
Posté le 02-09-2006 à 12:18:38  profilanswer
 

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
n°1435672
slash33
Posté le 02-09-2006 à 18:33:50  profilanswer
 

C'était un test ?

n°1435773
_darkalt3_
Proctopathe
Posté le 02-09-2006 à 22:36:41  profilanswer
 

:??:
 
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
mood
Publicité
Posté le 02-09-2006 à 22:36:41  profilanswer
 

n°1439605
slash33
Posté le 10-09-2006 à 00:47:13  profilanswer
 

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

n°1841236
apze
Posté le 21-01-2009 à 16:46:08  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [MFC] problèmes d'impressions

 

Sujets relatifs
Problemes sur excel : liste, liensMFC sur vsual c "comment faire 1 retour chariot dans un edit box?"
[MFC]Redimensionnement d'un controle pictureQuel logiciel petite base pour problèmes techniques?
Buffer image et MFC[MFC] Menu dynamique
[MFC]Deplacer dessinFormat d'une zone de texte : problèmes de caractères
[css html] Selection texte et roulette > problèmes sous IEproblème à la compilation MFC
Plus de sujets relatifs à : [MFC] problèmes d'impressions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR