Taille d'un CView pour impression A4

Résolu
universaliss Messages postés 5 Date d'inscription samedi 23 août 2008 Statut Membre Dernière intervention 17 mars 2011 - 15 mars 2011 à 17:23
universaliss Messages postés 5 Date d'inscription samedi 23 août 2008 Statut Membre Dernière intervention 17 mars 2011 - 17 mars 2011 à 10:56
Bonjour,
Je suis actuellement bloqué dans le développement d'un petit programme en mode SDI.

Je suis actuellement face à mon CView sur lequel je peux dessiner, une sorte d'ersatz de paint qui me permet de sauvegarder mes dessins et de les rouvrir.

Au moment de l'imprimer : SURPRISE !!!! le dessin est tout petit j'ai un problème de dimensionnement de mon CView surement dans le oninitialupdate() (peut être que je me trompe complètement...)

Je souhaiterai savoir qu'elle est la démarche pour pouvoir afficher un mon CView et avoir entièrement mais uniquement ma page a4 (voir a4 ou a5).

je pensais passer par une fonction du style :
GetParentFrame()->SetWindowPos(NULL,0,0,200,300,SWP_NOZORDER|SWP_NOMOVE);
mais d'une part les dimensions sont bien entendus mauvaises mais cela ne redimensionne que le frame "conteneur" qui en plus est étirable à volonté donc cela ne résout en rien le problème.

Pour simplifier je souhaiterai obtenir ma page à l'écran telle qu'elle sortira à l'imprimante.
Comment faire ? Quelles valeurs utiliser? quelle fonction?

Merci d'avance aux pro de la sdi ^^

4 réponses

ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
16 mars 2011 à 14:51
Bonjour,

Il est normal que ton dessin soit tout petit sur l'imprimante si tu raisonnes en pixels. Il faut dessiner en fonction de la résolution de ta page, résolution qui peut varier selon l'imprimante ou sa configuration. L'idéal étant d'avoir le même code pour dessiner et pour imprimer en tenant compte de la taille et de la résolution de la page ou de l'écran.

Tu peux regarder les fonctions :

SetWindowOrg
SetWindowExt
SetViewportOrg
SetViewportExt
SetMapMode

La classe CDC implémente la méthode IsPrinting() qui peut te servir pour savoir si ton code est en train de dessiner ou d'imprimer.
3
universaliss Messages postés 5 Date d'inscription samedi 23 août 2008 Statut Membre Dernière intervention 17 mars 2011
17 mars 2011 à 10:56
merci pour votre aide j'ai trouvé mon bonheur en tombant sur ce site :
Creating Single Document Interface Applications
ainsi que :
Printing With the Document/View Architecture, CDocument, CView
Ces sont tous les deux des tutoriaux bien détaillés qui mont permis de résoudre mes problèmes.
Si ça peut servir à quelqu'un d'autres....
3
universaliss Messages postés 5 Date d'inscription samedi 23 août 2008 Statut Membre Dernière intervention 17 mars 2011
16 mars 2011 à 16:50
merci pour ta réponse mais ces fonctions ne me permettent pas d'arriver au résultat voulu (peut être que je les utilisent mal mais c'est pas encore ça)
ces fonctions m'ont permis de modifier l'orientation et le positionnement des axes de référence mais j'ai toujours le même petit résultat en impression donc j'ai fais machine arrière.
peut être devrai-je m'orienté vers :
OnPreparePrinting, on begin et on end printing
des fonction qui sont encore dépourvues de code ... mais qu'en faire?

De plus je n'arrive toujours pas a restreindre mon cview à une certaine dimension (une page a4) il est toujours infini...
toujours dans l'impasse...
Si quelqu'un a ne serait ce qu'un morceau de code qui dessine un cadre d'un format a4 ça serait idéal pour comprendre tout ça...
D'avance merci !
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
17 mars 2011 à 09:51
Bonjour,
Il faut chercher de l'aide sur MSDN pour la fonction IsPrinting() qui 'il faut utiliser dasn la fonction OnDrw() de ta CView.
Voilà un morceau de code que j'ai dasn un de mes projet:
if (pDC->IsPrinting())
{
rect.left rect.top 0;
rect.right = pDC->GetDeviceCaps(HORZRES);
rect.bottom = pDC->GetDeviceCaps(VERTRES);
m_Graph.SetPrintScale(pDC->m_hDC, rect);
}
else
GetClientRect(rect);

Bon codage


louis
0
Rejoignez-nous