Oki, merci bien, j'en prends bonne note. Je vais regarder un peu tout ça et te tiens en alerte. Aujourd'hui c'est repos donc à demain ^^.
Oki, merci bien, j'en prends bonne note. Je vais regarder un peu tout ça et te tiens en alerte. Aujourd'hui c'est repos donc à demain ^^.
J'ai finalement terminé le code d'impression avec colorisation syntaxique inclue. Maintenant j'ai une erreur lorsque je lance l'impression; Une boîte de dialogue s'ouvre et un message indique "Paramètres incorrects". Ca se passe lorsque je fais un changement de page au cours de l'impression (avec EndPage() et StartPage()).
Voici le code d'impression :
EDIT : Apparemment le problème apparait lorsque l'utilisateur (moi) s'amuse à rajouter des espaces à chaque fin de ligne.
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260 void CDonneesView::OnPrint(CDC * pDC, CPrintInfo * pInfo) { CDonneesView * pView; CDonneesDoc * pDoc = reinterpret_cast<CDonneesDoc*>(GetDocument()); int nMargins = 150; int iVerticalSize = (pDC->GetDeviceCaps(VERTRES)) - nMargins; CString str; CRect strRect(0,0,0,0); CRect rcCalcText(0,0,0,0); int nStringheight=0, nRowSpace=0; TEXTMETRIC tm; pDC->SetMapMode(MM_TEXT); int nPage=1; CStdioFile File; File.Open(pDoc->GetTitle(), CFile::modeNoTruncate | CFile::modeRead | CFile::typeText); int iY = 300; pDC->StartPage(); while(File.ReadString(str)) // Tant qu'on lit une chaïne de caractères dans le fichier { pDC->GetTextMetrics(&tm); CString text = str; // On déclare une variable tampon qui contient la ligne en lecture //MessageBox(text); nRowSpace = tm.tmExternalLeading; strRect.top=iY; strRect.left = 200; //strRect.bottom = (strRect.top + nStringheight); pInfo->m_rectDraw.SetRect(0,0,pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES)); pInfo->m_nCurPage = nPage; //Pour optimisation, déclarer une variable pour remplacer GetLength() int Length = text.GetLength(); if(Length == 0) { pDC->DrawText(text, rcCalcText, DT_CALCRECT); strRect.right = pDC->GetDeviceCaps(HORZRES); nStringheight = rcCalcText.Height(); strRect.bottom = (strRect.top + nStringheight); pDC->DrawText(text,strRect,DT_WORDBREAK | DT_EXPANDTABS); } //SI ** ou -> ON COLORISE EN ROUGE if((Length > 1) && ((text.Left(2) == "**") || (text.Left(2)=="->"))) { //toute la ligne en couleur de bloc for(int i=0; i<Length ; i++) { pDC->SetTextColor(RGB(255,0,0)); pDC->DrawText(text, rcCalcText, DT_CALCRECT); strRect.right = pDC->GetDeviceCaps(HORZRES); nStringheight = rcCalcText.Height(); strRect.bottom = (strRect.top + nStringheight); pDC->DrawText(text,strRect,DT_WORDBREAK | DT_EXPANDTABS); } } //FIN COLORATION ROUGE //TITRE COLORISATION EN ORANGE else if((Length > 0) && (text.Left(1) == "*") && !((Length > 1) && (text.Left(2) == "**"))) { //toute la ligne en couleur de titre for(int i=0; i<Length; i++) { pDC->SetTextColor(RGB(255,100,0)); pDC->DrawText(text, rcCalcText, DT_CALCRECT); strRect.right = pDC->GetDeviceCaps(HORZRES); nStringheight = rcCalcText.Height(); strRect.bottom = (strRect.top + nStringheight); pDC->DrawText(text,strRect,DT_WORDBREAK | DT_EXPANDTABS); } } //TITRE COLORISATION EN ORANGE //COMMENTAIRE COLORISATION EN VERT else if ((Length > 1) && (text.Left(2) == "c ") || (text.Left(2) == "C ") || (text.Left(1) == "!")) { //COULEUR DE COMMENTAIRE for(int i=0; i<Length; i++) { pDC->SetTextColor(RGB(0,180,0)); pDC->DrawText(text, rcCalcText, DT_CALCRECT); strRect.right = pDC->GetDeviceCaps(HORZRES); nStringheight = rcCalcText.Height(); strRect.bottom = (strRect.top + nStringheight); pDC->DrawText(text,strRect,DT_WORDBREAK | DT_EXPANDTABS); } } //FIN COMMENTAIRE COLORISATION EN VERT //lignes spéciales else if((Length > 1) && ((text.Left(2) == "M ") || (text.Left(2) == "M*") || (text.Left(2) == "C*")|| (text.Left(2) == "m ") || (text.Left(2) == "m*")|| (text.Left(2) == "c*") || (text.Left(2) == "$M")|| (text.Left(2) == "$E"))) { //toute la ligne en couleur de spéciale for(int i=0; i<Length; i++) { pDC->SetTextColor(RGB(0,0,255)); pDC->DrawText(text, rcCalcText, DT_CALCRECT); strRect.right = pDC->GetDeviceCaps(HORZRES); nStringheight = rcCalcText.Height(); strRect.bottom = (strRect.top + nStringheight); pDC->DrawText(text,strRect,DT_WORDBREAK | DT_EXPANDTABS); } } //CAS PARTICULIER DECOUPAGE DE CHAINES else { CRect rcWord(0,0,0,0); CString reste = text; CString word; CString txtCalc = ""; int i = 0; //MessageBox(_T("Salut toi !")); while(reste.GetLength() > 0) { i++; if(reste.GetAt(i) == ' ') { word = reste.Left(i);//Sûre //MessageBox(_T(word)); // affiche le bon word reste = reste.Right(reste.GetLength() - i - 1);//Sûre //MessageBox(_T(reste.Right(1))); //MessageBox(_T(reste)); // affiche le bon reste txtCalc = txtCalc + word + " ";//Sûre //MessageBox(_T(txtCalc)); //affiche le bon txtCalc if((word == "$I") || (word == "$R") || (word == "$c") || (word == "$o") || (word == "$M") || (word == "$E") || (word == "$B") || (word == "$F") || (word == "$Si") || (word == "Alors") || (word == "$Sinon") || (word == "$Sifin") || (word == "@") || (word == "$G") || (word == "$P") || (word == "+") || (word == "-") || (word == "*") || (word == "^") || (word == "cos") || (word == "sin") || (word == "tan") || (word == "abs") || (word == "int") || (word == "TY") || (word == "EL") || (word == "NO") || (word == "DA") || (word == "CA") || (word == "XX") || (word == "YY") || (word == "ZZ") || (word == "FIC") || (word == "N1") || (word == "N2") || (word == "N3") || (word == "N4") || (word == "IX") || (word == "IY") || (word == "IZ") || (word == "MO") || (word == "NU") || (word == "DE") || (word == "SE") || (word == "CE") || (word == "CN") || (word == "MAT") || (word == "EP") || (word == "MOD") || (word == "EP") || (word == "SL") || (word == "SL") || (word == "MOD") || (word == "NI") || (word == "FC") || (word == "CO") || (word == "DEN")) { //strRect.bottom = 0; pDC->DrawText(word, rcWord, DT_CALCRECT); pDC->DrawText(txtCalc, rcCalcText, DT_CALCRECT);//On calcule le rectangle pour le mot en fonction des mots précédents pDC->SetTextColor(RGB(0,0,255));// On indique au DC qu'on souhaite que notre mot soit colorié en bleu strRect.right = pDC->GetDeviceCaps(HORZRES);//rcCalcText.right; // On étend en largeur (vers la droite) notre rectangle de dessin nStringheight = rcCalcText.Height(); // On indique la hauteur de notre mot (la taille du mot en hauteur) strRect.left = rcCalcText.right - rcWord.right; strRect.bottom = (strRect.top + nStringheight); //On indique au côté du bas l'extension qu'il doit prendre pDC->DrawText(word, strRect, DT_WORDBREAK | DT_EXPANDTABS); } else { //strRect.bottom = 0; pDC->DrawText(word, rcWord, DT_CALCRECT); pDC->DrawText(txtCalc, rcCalcText, DT_CALCRECT);//On calcule le rectangle pour le mot en fonction des mots précédents if(word.Left(2) == "$.") pDC->SetTextColor(RGB(255,0,255)); else pDC->SetTextColor(RGB(0,0,0));// On indique au DC qu'on souhaite que notre mot soit colorié en bleu strRect.right = rcCalcText.right; // On étend en largeur (vers la droite) notre rectangle de dessin nStringheight = rcCalcText.Height();// On indique la hauteur de notre mot (la taille du mot en hauteur) strRect.bottom = (strRect.top + nStringheight); //On indique au côté du bas l'extension qu'il doit prendre strRect.left = rcCalcText.right - rcWord.right; pDC->DrawText(word, strRect, DT_WORDBREAK | DT_EXPANDTABS); } i=0; } if(reste.GetAt(i+1) == NULL) { word = reste; txtCalc = txtCalc + " " + word; if((word == "$I") || (word == "$R") || (word == "$c") || (word == "$o") || (word == "$M") || (word == "$E") || (word == "$B") || (word == "$F") || (word == "$Si") || (word == "Alors") || (word == "$Sinon") || (word == "$Sifin") || (word == "@") || (word == "$G") || (word == "$P") || (word == "+") || (word == "-") || (word == "*") || (word == "^") || (word == "cos") || (word == "sin") || (word == "tan") || (word == "abs") || (word == "int") || (word == "TY") || (word == "EL") || (word == "NO") || (word == "DA") || (word == "CA") || (word == "XX") || (word == "YY") || (word == "ZZ") || (word == "FIC") || (word == "N1") || (word == "N2") || (word == "N3") || (word == "N4") || (word == "IX") || (word == "IY") || (word == "IZ") || (word == "MO") || (word == "NU") || (word == "DE") || (word == "SE") || (word == "CE") || (word == "CN") || (word == "MAT") || (word == "EP") || (word == "MOD") || (word == "EP") || (word == "SL") || (word == "SL") || (word == "MOD") || (word == "NI") || (word == "FC") || (word == "CO") || (word == "DEN")) { //strRect.bottom = 0; pDC->DrawText(word, rcWord, DT_CALCRECT); pDC->DrawText(txtCalc, rcCalcText, DT_CALCRECT);//On calcule le rectangle pour le mot en fonction des mots précédents pDC->SetTextColor(RGB(0,0,255));// On indique au DC qu'on souhaite que notre mot soit colorié en bleu strRect.right = pDC->GetDeviceCaps(HORZRES);//rcCalcText.right; // On étend en largeur (vers la droite) notre rectangle de dessin nStringheight = rcCalcText.Height(); // On indique la hauteur de notre mot (la taille du mot en hauteur) strRect.left = rcCalcText.right - rcWord.right; strRect.bottom = (strRect.top + nStringheight); //On indique au côté du bas l'extension qu'il doit prendre pDC->DrawText(word, strRect, DT_WORDBREAK | DT_EXPANDTABS); } else { //strRect.bottom = 0; pDC->DrawText(word, rcWord, DT_CALCRECT); pDC->DrawText(txtCalc, rcCalcText, DT_CALCRECT);//On calcule le rectangle pour le mot en fonction des mots précédents if(word.Left(2) == "$.") pDC->SetTextColor(RGB(255,0,255)); else pDC->SetTextColor(RGB(0,0,0));// On indique au DC qu'on souhaite que notre mot soit colorié en bleu strRect.right = rcCalcText.right; // On étend en largeur (vers la droite) notre rectangle de dessin nStringheight = rcCalcText.Height();// On indique la hauteur de notre mot (la taille du mot en hauteur) strRect.bottom = (strRect.top + nStringheight); //On indique au côté du bas l'extension qu'il doit prendre strRect.left = rcCalcText.right - rcWord.right; pDC->DrawText(word, strRect, DT_WORDBREAK | DT_EXPANDTABS); } reste = ""; } } } // Calcule la position suivante int x = strRect.bottom; iY = (nRowSpace + x); if(iY > iVerticalSize) { MessageBox("ça coince ici"); iY = 300; pDC->EndPage(); pDC->StartPage(); nPage++; } } }
J'en suis à la prévisualisation et je me penche donc plus sérieusement sur tes indications et les soucis commencent. Je ne peux pas déclarer une variable de type ULONGLONG pour obtenir la valeur du pointeur de fichier.
EDIT : En fait je ne parviens pas à faire le lien entre la page en cours (m_nCurPage) et mon pointeur de fichier. Ceci fait référence à ton indication suivante : "déplacer le pointeur du fichier sur l'offset de la page en question".
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++.
Désolé Farscape mais je ne te suis pas...
Je dois donc surcharger la méthode OnBeginPrinting et y mettre l'ouverture de mon fichier. La variable obtenue par la méthode CFile::GetPosition doit être indiquée dans les paramètres de la méthode CFile::Seek?
Ce que je n'intègre pas c'est le passage d'une page à l'autre; je connais et ai accès à mon membre m_nCurPage de mon objet CPrintInfo mais je ne vois pas (techniquement parlant) comment je peux relier cet élément à un pointeur sur mon fichier pour qu'au final, lorsque les lignes du fichier dépassent le cadre de dessin, elles soient représentées sur une autre page.
le plan que je t'ai donné pour imprimer le texte est une solution autonome indépendante du système d'édition doc/view des MFC.
dans ce système (doc/view) il ne peut pas y avoir de endpage et startpage.
c'est l'architecture qui gère cet aspect .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if(iY > iVerticalSize) { MessageBox("ça coince ici"); iY = 300; pDC->EndPage(); pDC->StartPage(); nPage++; }
par contre c'est à cet endroit que tu devras mémoriser la position actuelle de l'ofset de parcours de ton fichier.
une CMap devrait faire l'affaire:
la clef c'est la page ,la donnée c'est la position dans le fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CMap<int ,int,ULONGLONG,ULONGLONG> m_mapOfPages;
on peut dire que pour la page 1 on aura:
pour les pages suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 m_mapOfPages.SetAt(1,0);
En début de chaque page il faudra positionner le pointeur de fichier s'il existe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 m_mapOfPages.SetAt(pInfo->m_nCurPage+1,m_File.GetPosition());
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ULONGLONG pos; if(m_mapOfPages.Lookup(pInfo->m_nCurPage,pos)) m_File.Seek(pos, CFile::begin);
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 n'arrive pas à déclarer de variable de type ULONGLONG...
[EDIT] : ok, c'est bon pour ça.
Par contre je n'arrive pas à faire fonctionner correctement tout ça, je ne vois pas ce qui se passe.
tu utilises quelle version de visual ?
regarde la documentation de la classe CFile pour voir le type retourné par GetPosition ...
dans le cas de vc2008 c'est un ULONGLONG.
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++.
soit plus précis : quelle est l'erreur générée?
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++.
Apparemment, aussi surprenant soit-il, il n'y a plus de rapport d'erreur, néanmoins ça me disait que je n'avais pas mis de ";" entre ULONGLONG et pos... ().
Je dois par ailleurs mal utiliser tes indications. Voilàa comment je procède :
- Je déclare un membre de CMap
- J'indique monavant d'entrer dans ma boucle de dessin de chaînes
Code : Sélectionner tout - Visualiser dans une fenêtre à part m_mapOfPages.SetAt(1,0);
- Avant le dessin dans la boucle d'indique mon
- Lorsque je dépasse la zone de la première page :
Code : Sélectionner tout - Visualiser dans une fenêtre à part m_mapOfPages.SetAt(pInfo->m_nCurPage+1,File.GetPosition());
:
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(m_mapOfPages.Lookup(pInfo->m_nCurPage,position)) File.Seek(position, CFile::begin);
le stockage de l'information de la page (suivante) se fait en fin de page.
le positionnement du fichier pour la page en cours se fait au début dessin dans OnPrint.
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++.
J'ai enfin un rendu différent (c'est déjà ça, ça me prouve que ça touche quelque chose) : le seconde ligne de ce qui devrait être ma première page est dessinée sur chacune des lignes de ma première page et l'application n'a pas l'air d'aimer. Je vais poursuivre mes tests (pas évident, j'assimile pas).
Voilà ce que j'ai modifié dans le code..:
Je dois très certainement mal utiliser tout ça...
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 void CDonneesView::OnPrint(CDC * pDC, CPrintInfo * pInfo) { CDonneesDoc * pDoc = reinterpret_cast<CDonneesDoc*>(GetDocument()); int nMargins = 150; int iVerticalSize = (pDC->GetDeviceCaps(VERTRES)) - nMargins; CString str; CRect strRect(0,0,0,0); CRect rcCalcText(0,0,0,0); int nStringheight=0, nRowSpace=0; TEXTMETRIC tm; pDC->SetMapMode(MM_TEXT); int nPage=1; CStdioFile File; File.Open(pDoc->GetTitle(), CFile::modeNoTruncate | CFile::modeRead | CFile::typeText); int iY = 300; CMap<int ,int,ULONGLONG,ULONGLONG> m_mapOfPages; while(File.ReadString(str)) // Tant qu'on lit une chaïne de caractères dans le fichier { pDC->GetTextMetrics(&tm); CString text = str; // On déclare une variable tampon qui contient la ligne en lecture nRowSpace = tm.tmExternalLeading; strRect.top=iY; strRect.left = 200; pInfo->m_rectDraw.SetRect(0,0,pDC->GetDeviceCaps(HORZRES) ,pDC->GetDeviceCaps(VERTRES)); pInfo->m_nCurPage = nPage; ULONGLONG position = File.GetPosition(); if(m_mapOfPages.Lookup(pInfo->m_nCurPage,position)) File.Seek(position, CFile::begin); /* Code de dessin des lignes ici */ // Calcul la position suivante int x = strRect.bottom; iY = (nRowSpace + x); if(iY > iVerticalSize) { iY = 300; //MessageBox("Ouhla"); m_mapOfPages.SetAt(pInfo->m_nCurPage+1,73/*File.GetPosition()*/); nPage++; } } }
tu persistes ....
le fichier ne doit pas être ouvert dans onprinting, cette méthode est appelée pour chaque page.
la map (j'ai mis un m_ pour member ) doit être locale à la classe sinon ça ne sert à rien ...
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++.
Erf... ce qui te sembles évident ne l'est pas nécessairement. Je te rappelle que je débute, te notifie que ce dont tu me parles m'est complètement inconnu (CMap, kézako?). Pour moi ce n'est pas une évidence que le fichier doive être ouvert dans OnBeginPrinting, de fait d'une incompréhension du mécanisme en ce point. Oui, je suis laborieux... mais programmer dans l'abstrait m'embête (beaucoup).
Donc je reprends :
- Je dois déclarer un membre de CMap dans ma vue ( ?)
- Surcharger OnBeginPrinting pour y ouvrir le fichier
- Passer le fichier en argument dans ma méthode OnPrint
- Et ensuite? c'est sincère, je sais vraiment pas du tout où aller mais bon j'imagine que ça doit être au moins aussi embêtant pour les deux acteurs du fil...
Bon, voilà où j'en suis :
J'ai déclaré deux nouveaux membres dans ma classe vue :
- Un membre CMap m_mapOfPages
- Un membre CStdioFile m_File
J'ai surchargé la méthode OnBeginPrinting comme ceci :
J'ai modifié ma méthode OnPrint comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void CDonneesView::OnBeginPrinting(CDC * pDC, CPrintInfo * pInfo) { CDonneesDoc * pDoc = reinterpret_cast<CDonneesDoc*>(GetDocument()); m_File.Open(pDoc->GetTitle(), CFile::modeNoTruncate | CFile::modeRead | CFile::typeText); }
L'aperçu avant impression reste malgré tout non opérationnel. Aurais-tu une idée du problème Farscape ?
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 void CDonneesView::OnPrint(CDC * pDC, CPrintInfo * pInfo) { int nMargins = 150; int iVerticalSize = (pDC->GetDeviceCaps(VERTRES)) - nMargins; CString str; CRect strRect(0,0,0,0); CRect rcCalcText(0,0,0,0); int nStringheight=0, nRowSpace=0; TEXTMETRIC tm; pDC->SetMapMode(MM_TEXT); int nPage=1; int iY = 300; while(m_File.ReadString(str)) // Tant qu'on lit une chaïne de caractères dans le fichier { pDC->GetTextMetrics(&tm); CString text = str; // On déclare une variable tampon qui contient la ligne en lecture nRowSpace = tm.tmExternalLeading; strRect.top=iY; strRect.left = 200; pInfo->m_rectDraw.SetRect(0,0,pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES)); pInfo->m_nCurPage = nPage; if(pInfo->m_nCurPage == 1) m_mapOfPages.SetAt(1,0); else m_mapOfPages.SetAt(pInfo->m_nCurPage,m_File.GetPosition()); /*CODE DE DESSIN*/ int x = strRect.bottom; iY = (nRowSpace + x); if(iY > iVerticalSize) { iY = 300; ULONGLONG pos = m_File.GetPosition(); if(m_mapOfPages.Lookup(pInfo->m_nCurPage,pos)) m_File.Seek(pos, CFile::begin); nPage++; } } }
Salut.
Tu peux estimer le nombre de pages a l'avance.
De plus, j'aimerai savoir quel est le problème avec ton impression.
On peux par exemple deplacer le viewport de CDC vers le bas, et dessiner avec DrawText avec une decalage d'une page vers le bas
le lookup et le seek est a faire en début de boucle et pas en fin.
le stockage dans la map est à faire en fin de page...
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++.
Partager