IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Impression et aperçu avant impression


Sujet :

MFC

  1. #21
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    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 ^^.

  2. #22
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    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 :
    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++;
    			}
    	}
    }
    EDIT : Apparemment le problème apparait lorsque l'utilisateur (moi) s'amuse à rajouter des espaces à chaque fin de ligne.

  3. #23
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    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".

  4. #24
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par farscape Voir le message
    ok j'en conviens
    donc ton traitement de previsu doit être adapté .
    tu dois mémoriser dans une table ( avec un vector par exemple)
    le début de chaque page ,c'est à dire la position en offset dans le fichier
    voir CFile::GetPosition()
    et donc par la suite il faudra faire un file.Seek(lOffset, CFile::begin);
    donc tant que l'utilisateur déroule le fichier tu mémorises le début de chaque page.
    quand il revient en arrière il faut déplacer le pointeur du fichier sur l'offset de la page en question.
    dans la méthode OnPrint l'objet CPrintInfo te renseigne sur la page en cours m_nCurPage.
    la classe CFile gère ces aspects et CStdiofile hérite de CFile.
    et il faut faire des aménagements dans ton code :
    Faq:
    OnBeginPrinting : créations d'objets gdi personnels.
    tu pourras y mettre ton ouverture de fichier .
    l'objet CStdiofile devant être une donnée membre de classe.

  5. #25
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    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.

  6. #26
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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.
    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++;
    
                }
    c'est l'architecture qui gère cet aspect .
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CMap<int ,int,ULONGLONG,ULONGLONG> m_mapOfPages;
    la clef c'est la page ,la donnée c'est la position dans le fichier.
    on peut dire que pour la page 1 on aura:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_mapOfPages.SetAt(1,0);
    pour les pages suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_mapOfPages.SetAt(pInfo->m_nCurPage+1,m_File.GetPosition());
    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
    3
     
    ULONGLONG pos;
    if(m_mapOfPages.Lookup(pInfo->m_nCurPage,pos)) m_File.Seek(pos, CFile::begin);

  7. #27
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    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.

  8. #28
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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.

  9. #29
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Citation Envoyé par farscape Voir le message
    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.
    Version 2008 mais je crois qu'il apprécie pas trop le coup du ULONGLONG pos = File.GetPosition(); comprends pas pourquoi...

  10. #30
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    soit plus précis : quelle est l'erreur générée?

  11. #31
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Citation Envoyé par farscape Voir le message
    soit plus précis : quelle est l'erreur générée?
    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 mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_mapOfPages.SetAt(1,0);
    avant d'entrer dans ma boucle de dessin de chaînes
    - Avant le dessin dans la boucle d'indique mon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_mapOfPages.SetAt(pInfo->m_nCurPage+1,File.GetPosition());
    - Lorsque je dépasse la zone de la première page :

    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(m_mapOfPages.Lookup(pInfo->m_nCurPage,position)) File.Seek(position, CFile::begin);

  12. #32
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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.

  13. #33
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Citation Envoyé par farscape Voir le message
    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.
    Cela me donne le même résultat qu'auparavant, l'aperçu avant impression ne fonctionne pas plus.
    En fait je ne comprends pas vraiment le processus là

  14. #34
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    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).

  15. #35
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Voilà ce que j'ai modifié dans le code..:

    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++;
    			}
    	}
    }
    Je dois très certainement mal utiliser tout ça...

  16. #36
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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 ...

  17. #37
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Citation Envoyé par farscape Voir le message
    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 ...
    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...

  18. #38
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    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 :

    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);
    }
    J'ai modifié ma méthode OnPrint comme ceci :

    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++;
    	}
        }
    }
    L'aperçu avant impression reste malgré tout non opérationnel. Aurais-tu une idée du problème Farscape ?

  19. #39
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    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

  20. #40
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    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...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/11/2013, 20h18
  2. [AC-2003] Aperçu avant impression différente de l'impression
    Par meolimo dans le forum IHM
    Réponses: 3
    Dernier message: 18/01/2013, 16h52
  3. ComponentPrint Problème Impression ou Aperçu avant impression
    Par Invité dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/03/2012, 11h53
  4. Réponses: 1
    Dernier message: 06/01/2009, 22h50
  5. Réponses: 1
    Dernier message: 16/09/2008, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo