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 à 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 ...
????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...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.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 APIArrè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![]()
On va dire comme ça !![]()
PS: je te souhaite une journée plus ensoleillée que celle que nous avons eue ici !!!![]()
MerciEnvoyé par valdeub
![]()
Ici à Montréal le ciel est dégagé; par contre il doit faire -5 dehors![]()
salut,
un petit exemple d'impression independante du context doc/view:
la classe CFontEx est dans la faq on la trouve aussi dans :
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
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.
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Farscape c'est bien mais je crois que tu as lu trop vite : c'est pour une CDialog pas une CView![]()
Envoyé par mat.M
ben non c'est pour imprimer quelque chose a partir d'une fenetre quelconque
j'ai precisé:
un petit exemple d'impression independante du context doc/view:![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
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.
Partager