Salut � tous,
Pour mon application qui se base sur une boite de dialogue, j'aimerais savoir commentt je peux faire une impression d'un document (par listing des diff�rentes donn�es de mon application).
Version imprimable
Salut � tous,
Pour mon application qui se base sur une boite de dialogue, j'aimerais savoir commentt je peux faire une impression d'un document (par listing des diff�rentes donn�es de mon application).
Salut,
Que veux-tu exactement imprimer ?
Veux-tu faire une mise en forme de certaines donn�es saisies via ton dialogue et les imprimer, ou bien imprimer l'image de ton dialogue ?
Imprimer des donn�es saisies dans ma boite de dialogue
Comme ton appli n'est pas bas�e sur une architecture Doc/View, tu ne peux pas compter sur les MFC pour g�rer l'impression. Il faut que tu fasses tout toi-m�me. Mais ce n'est pas (trop) compliqu�.
Tu peux aller voir l'article ci-dessous, son auteur est tr�s comp�tent et digne de confiance.
http://www.codeproject.com/printing/...wo_docview.asp
En t'inspirant du code pr�sent� dans l'article, il ne te reste qu'� impl�menter la m�thode OnPrint() dans laquelle tu vas simplement construire ton impression (cr�er ta mise en page, pr�senter tes donn�es).
Si tu as encore des questions, n'h�site pas !
Valdeub
A propos de mise en page, y a-t-il, une documentation assez correcte pour faire de la pr�sentation avec la classe CDC?
Je pense � la documentation MFC de MSDN
(http://msdn.microsoft.com/library/de...ss_members.asp),
aux bouquins sp�cialis�s MFC, et aux nombreux tutoriels qui doivent exister sur le sujet (� voir dans la partie Cours et Tutoriels peut �tre ...).
Ca d�pend de ce que tu veux faire. Les bases �tant :
- le texte: TextOut(), DrawText() ...
- les lignes: MoveTo(), LineTo() ...
- les rectangles, ellipses, ...
- les bitmaps,...
- ...
il y a de quoi faire ...
????Citation:
Envoy� par valdeub
Bien s�r que si !
Il suffit de g�rer le HDC de la boite de dialogue
Je n'ai peut �tre pas �t� tr�s clair...Citation:
Envoy� par mat.M
J'entends par "tu ne peux pas compter sur les MFC pour g�rer l'impression" le fait que tu ne puisses pas t'appuyer sur les m�thodes de la classe CView comme par exemple OnPreparePrinting(), OnBeginPrinting(), OnPrint(), et OnEndPrinting(), qui simplifient �norm�ment les choses !
Arr�te-moi si je me trompe, mais il me semble que pour imprimer, il faut utiliser le DC li� � l'imprimante ... donc je ne vois pas trop � quoi va te servir le DC de ta boite de dialogue si ce n'est � dessiner dans ton dialogue.Citation:
Envoy� par mat.M
A moins que le dialogue dont tu parles soit du type CPrintDialog ou bien le dialogue obtenu via un PrintDlg(); auquel cas cela revient exactement � la m�thode que j'ai indiqu�e � BigBeni.
Mais tu as sans doute raison, ma formulation �tait malhabile ... et ta r�ponse somme toute justifi�e ...
oui mais on peut l'obtenir par certaines API :wink:Citation:
Arr�te-moi si je me trompe, mais il me semble que pour imprimer, il faut utiliser le DC li� � l'imprimante .
oui c'est vrai c'est pas g�r� directement par MFC peut-�tre il faut passer par les API win32 mais MFC c'est API win32+ alors :D
On va dire comme �a ! :wink:
PS: je te souhaite une journ�e plus ensoleill�e que celle que nous avons eue ici !!! :cry:
Merci :DCitation:
Envoy� par valdeub
Ici � Montr�al le ciel est d�gag�; par contre il doit faire -5 dehors :lol:
salut,
un petit exemple d'impression independante du context doc/view:
la classe CFontEx est dans la faq on la trouve aussi dans :Code:
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 void CTestDlgDlg::PrintDoc() { CDC dc; CPrintDialog printDlg(FALSE); // selection de l'imprimante. if (printDlg.DoModal() == IDCANCEL) return; dc.Attach(printDlg.GetPrinterDC()); dc.m_bPrinting = TRUE; // dc d'impression. // titre du document = titre application CString strTitle="mon document"; DOCINFO di; ::ZeroMemory (&di, sizeof (DOCINFO)); di.cbSize = sizeof (DOCINFO); di.lpszDocName = strTitle; // debut d'impression if(dc.StartDoc( &di )<0) { MessageBox(_T("Erreur d'initialisation de l'imprimante")); return; } // demarre une page if (dc.StartPage()< 0) { MessageBox(_T("Impossible de demarrer la page")); dc.AbortDoc(); return; } // recuperation de la surface d'impression CRect rectDraw; rectDraw.SetRect(0, 0, dc.GetDeviceCaps(HORZRES), dc.GetDeviceCaps(VERTRES)); // recuperation eventuelle des marges d'impressions //static POINT ptmargins; //dc.Escape(GETPRINTINGOFFSET, 0, NULL, &ptmargins); CFontEx FontEx; FontEx.GetFont(13,"Arial Bold"); CFont* pOldFont = dc.SelectObject(&FontEx); CString strTxt=_T("Salut Bienvenue chez DVP !"); CSize size=dc.GetTextExtent( strTxt); dc.TextOut((rectDraw.Width()-size.cx)/2, (rectDraw.Height()-size.cy)/2,strTxt); dc.EndPage(); // fin de la page a repeter donc pour chage page. dc.EndDoc(); // fin du document dc.SelectObject(pOldFont); }
http://farscape.developpez.com/Sampl...tomListBox.zip
donc pour chaque page : StartPage / EndPage()
le reste etant de la manipulation de GDI sur une surface de travail.
:D
Farscape c'est bien mais je crois que tu as lu trop vite : c'est pour une CDialog pas une CView :D
:koi: ben non c'est pour imprimer quelque chose a partir d'une fenetre quelconqueCitation:
Envoy� par mat.M
j'ai precis�:
:DCitation:
un petit exemple d'impression independante du context doc/view:
Je me permets de faire remonter ce sujet, car j'ai une question subsidiaire.
Comment faire le d�coupage en pages ? En clair, faut il faire un ou plusieurs CDC et comment proc�de-t-on techniquement au niveau des appels it�ratifs � StartPage/EndPage ?
J'esp�re que ma question est assez claire :oops:
Merci d'avance.
Salut je reviens l�-dessus,
Oui absolument mais il suffit de faire une "copie d'�cran" de la CDialog ( un CDC en m�moire en fait ) et avec un StretchBlt copier le CDC de la CDialog vers le CDC qui repr�sente l'imprimante
Oui la question est claire mais c'est pour quel type d'application ?
Une appli qui dessine des graphismes ?
Pour ce qui est de cr�er un ou plusieurs HDC tout d�pend de ce que tu veux faire.
Tu n'en dis pas plus.
Un simple HDC peut suffire en d�limitant la zone que l'on veuille imprimer; mais il vaut mieux red�finir un HDC en m�moire par exemple de 100x100 qui repr�sente une zone de d�coupage et copier ce HDC en m�moire vers le HDC de l'imprimante avec un StretchBlt ou BitBlt.
Pour dessiner sur l'imprimante c'est plus complexe il faut obtenir la r�solution de l'imprimante en Dot Per Inches et l'adapter � son graphique
Merci pour ta r�ponse Mat.M.
Voici quelques pr�cisions :
Je cherche � imprimer des documents constitu�s de texte, mais ces derniers peuvent �tre sujet � une certaine mise en page (il peut �tre issu d'un CRichEdit => formatage RTF). Cette mise en page est diff�rente de la pr�sentation que je fais de ces m�mes document � l'�cran dans une CDialog.
Pour chaque impression je souhaite �ventuellement imprimer un cartouche d'ent�te en premi�re page.
Pour chaque document (et une impression peut en contenir plusieurs) je souhaite aussi que chacun dispose d'un cartouche.
�videmment je veux pouvoir imprimer � la suite plusieurs document de fa�on continue dans une seule impression (de plusieurs pages), et que les "raccords" entre les pages ne d�gradent pas le rendu global.
Bon je m'en suis � peu pr�t sorti au prix de maints efforts, il n'y a rien de pr�mach� dans ce domaine et il faut tout penser et r�aliser soi-m�me.
Si quelqu'un veut quelques pr�cisions, n'h�sitez pas � me demander.