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. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut Impression et aperçu avant impression
    Bonjour,

    Je travaille actuellement sur une application et j'ai pour mission de mettre en marche le processus d'impression. J'ai passé plusieurs jours à lire de la documentation à ce sujet et je rencontre quelque problèmes de programmation.

    J'en suis au stade du calcul de la hauteur et de la largeur de mon document. Celui-ci est entièrement constitué de texte. Texte qui est enregistré dans un fichier...

    Première question : Comment déterminer la taille globale de mon document?

    J'aimerais le scinder en pages pour déterminer le nombre de pages à imprimer dans ma fonction OnPreparePrinting. J'avais commencé par calculer le nombre total de lignes de texte dans mon fichier, et avais ensuite déterminé combien de pages j'aurais pu avoir sachant que, volontairement, j'aurais pas mis plus de 50 lignes de texte par page.

    Seconde question : Vais-je être amené à devoir surcharger la méthode OnPrepareDC?

    Troisième question : Le texte de mon document est soumis à une colorisation syntaxique, vais-je alors perdre mes informations sur la couleur à l'impression?

    D'avance merci.

    ps : ça fait maintenant plus d'une semaine que je me documente, donc inutile de me renvoyer vers un lien que j'aurais déjà probablement ajouté à mon marque-page. Ne répondez tout simplement pas, si vous ne pouvez pas m'aider par vous même.

  2. #2
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Bon... juste une question : Comment obtenir la largeur et la longueur de mon document en pixels?

    Je cherche, je cherche... mais ne vois vraiment pas :s

  3. #3
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    ERRATUM : J'ai oublié de préciser dans le post-scriptum du premier message que je serais en revanche, particulièrement intéressé par un lien vers un autre forum spécialisé.

  4. #4
    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
    salut,
    tu as un exemple dans ce programme tiré de ce tuto :http://farscape.developpez.com/tutoriels/PrinterPDF/
    la méthode PrintPdfByDocumentName() s'occupe de lancer l'impression d'un fichier au format texte sur une imprimante (ici une imprimante pdf).

  5. #5
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Merci mais ça ne m'aide pas vraiment... je n'en comprends pas le quart. Ca ne fait même pas deux semaines que j'ai découvert Visual C++ et MFC. Je vais tout de même étudier un peu tout ce code.
    Si jamais par hasard tu avais des réponses à mes questions posées plus haut, n'hésites pas .

  6. #6
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Je pense vraiment que mon problème est plutôt simple, j'ai les idées pour le régler, mais mes connaissances en VC++ sont trop justes. J'ai donc d'autres questions :

    OnPrepareDC : à quoi cette fonction va-t-elle pouvoir me servir?
    OnBeginPrinting : dans quel(s) cas celle-ci va devoir être surchargée? Là j'ai plus ou moins les réponses types que j'ai pu voir sur la toile. Néanmoins bien souvent, une multitudes d'instructions y sont faites, ne correspondant qu'en partie aux réponses types.

    J'en suis pour l'instant à OnPreparePrinting ; j'y calcule le nombre de lignes de texte qu'il y a dans mon document actif sur ma vue (via un fichier texte portant le nom du document).
    Le texte sur le document est de type CString.
    Je détermine par la suite un nombre de ligne (une "constante-quota") maximum par page (50 lignes). J'obtiens finalement mon nombre de pages et je renseigne mon pointeur pInfo de CPrintInfo.
    Je retourne DoPreparePrinting(pInfo).

    Jusque là tout va bien...

    Maintenant je me penche sur OnPrepareDC, OnBeginPrinting, OnPrint.
    Certes j'ai lu que la fonction OnPrepareDC définit l'origine du Viewport et les attributs du DC mais... ce n'est pas très clair dans mon esprit.

    J'ai fouillé tout CodeGuru.com, ai marqué pas loin de 30 pages concernant les impressions en MFC mais je patauge atrocement. Il y a quelque chose qui m'échappe je pense, quelque chose que je n'arrive pas vraiment à assimiler.

  7. #7
    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 as consulté la faq ?: http://cpp.developpez.com/faq/vc/ind...HowToPrintView

    note: l'architecture impression view n'est utile que si le texte est affiché dans une CView ou CScrollview ou si tu veux gérer la pre-visu écran du texte.

    dans mon exemple la portion de code qui s'occupe d'imprimer le texte est celle-la:
    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
     
    //------------------------------------------------------------------------------------------
    void PrintFile(CDC *pDC,CStdioFile &File,DOCINFO &docInfo)
    {
        // 
        int nMargins = 150;
        int iVerticalSize =pDC->GetDeviceCaps(VERTRES);
        iVerticalSize =iVerticalSize-nMargins;
     
        File.SeekToBegin();
        CString str;
        CRect strRect(0,0,0,0);
        CRect rcCalcText(0,0,0,0);
        int nStringheight=0,nStringwidth=0, nRowSpace = 0;
        TEXTMETRIC tm;
     
        pDC->SetMapMode(MM_TEXT); // Sets the mapping mode
     
        if (pDC->StartDoc(&docInfo) == SP_ERROR)
        {                    
           // delete pDC;
            return;
        }            
        int nPage=0;
        while(File.ReadString(str))   
        {                
            int iY = 300;  
            pDC->StartPage();
            nPage++;
            for( ; File.ReadString(str) && (iY < iVerticalSize ); )
            {
                pDC->GetTextMetrics(&tm);
     
                CString strTmp = str;
     
                nRowSpace = tm.tmExternalLeading;
     
                // Calc the Height of the String, that can different
                // if using newline etc.
                pDC->DrawText(strTmp, rcCalcText, DT_CALCRECT);
                nStringheight = rcCalcText.Height();
     
                strRect.left=200;
                strRect.right = pDC->GetDeviceCaps(HORZRES);
                strRect.top=iY;
                strRect.bottom = strRect.top + nStringheight;
     
     
                CString tab1,tab2;                        
                int tabPos = strTmp.Find("\t");
                if ( tabPos != -1 )
                {
                    tab1 = strTmp.Left(tabPos);
                    tab2 = strTmp.Right(strTmp.GetLength()-tabPos-1);            
                }
                else
                    tab1 = strTmp;
     
                // Attach header font to the header text.
                pDC->SelectObject(&m_HeadingFont);
     
                CPrintInfo Infos;
                Infos.m_rectDraw.SetRect(0, 0,
                    pDC->GetDeviceCaps(HORZRES),
                    pDC->GetDeviceCaps(VERTRES));
                Infos.m_nCurPage=nPage;
                PrintPageHeader(pDC,Infos);
     
                // Attach Body font to the body text.
                pDC->SelectObject(&m_BodyFont2);
     
                pDC->DrawText( tab1,
                    strRect,
                    DT_WORDBREAK | DT_EXPANDTABS);
                strRect.left=strRect.right/6*2;
                pDC->SelectObject(&m_BodyFont);
                pDC->DrawText( tab2,
                    strRect,
                    DT_WORDBREAK | DT_EXPANDTABS);
     
                // Calculate the next start position
                int x = strRect.bottom;
                iY = ( nRowSpace + x);
                if ((iY > iVerticalSize)) break;
            }
            pDC->EndPage();
        }
        pDC->EndDoc();
     
    }
    la partie sélection du fichier a imprimer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        CFileDialog dlg( TRUE, _T( "txt" ), _T( "*.txt" ) );
        if( dlg.DoModal() != IDOK ) return;
     
        CStdioFile File;
     
        if( !File.Open(dlg.GetPathName(), CFile::modeNoTruncate      | CFile::modeRead | CFile::typeText ) )
        {
            #ifdef _DEBUG
            afxDump << "erreur d'ouverture fichier" << "\n";
            #endif   
            return;
        }
    la préparation du dc et le réglage des infos générales:
    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
     
    CDC             dc;
    CPrintDialog    printDlg(FALSE);
     
    // selection de l'imprimante.
     if (printDlg.DoModal() == IDCANCEL)   return;
     
     dc.Attach(printDlg.GetPrinterDC());
     CString strTitle=dlg.GetFileTitle();    // le nom du fichier uniquement
      DOCINFO docInfo;
      memset(&docInfo, 0, sizeof(DOCINFO));
      docInfo.cbSize = sizeof(DOCINFO);
      docInfo.lpszDocName = strTitle;        
      docInfo.lpszOutput = NULL;
      PrintFile(&dc,File,docInfo);
    tu as toutes les étapes de base d'une édition d'un fichier texte autonome.

  8. #8
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Bonjour !

    Rapidement, passer par le fichier pour imprimer mon document va faire en sorte que je vais perdre toutes mes informations concernant ma colorisation syntaxique, non?

    Il n'y aurait pas un moyen pour le faire tout simplement, en dessinant juste mes pages?

    ps : Oui j'ai consulté la FAQ, il y a une semaine environ. D'ailleurs je ne l'avais pas trouvée très explicite pour qui n'a jamais touché à VC++ et aux MFC.

  9. #9
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Bonjour,

    J'ai finalement décidé de suivre la méthode proposée. Il me reste quelques problèmes à résoudre au niveau de l'aperçu avant impression qui ne marche pas et la première ligne de mon texte qui disparait.

    Je pense n'avoir pas très bien compris le code d'impression au niveau de la déclaration des deux tableaux (tab1 et tab2) et de leur utilisation. Quelqu'un aurait une idée?

  10. #10
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Comment faire en sorte qu'à l'aperçu avant impression, je puisse visualiser le même nombre de pages imprimées?

    Et surtout, comment faire en sorte que l'aperçu avant impression fonctionne?
    Devrais-je développer un cas à part pour ma fonction d'impression si mon m_bPreview est à TRUE?

    [EDIT] : Je ne comprends pas pourquoi la première ligne de mon texte est toujours tronquée.

    [EDIT] : Il y a une erreur dans ta fonction d'impression. A chaque 'break', ta condition supprime la première phrase affichée sur la page suivante.
    Première ligne de la première page tronquée, première de la seconde page tronquée, etc. J'essaye d'arranger ç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
    51
     
            nPage=1;
            int iY = 300;
    	pDC->StartPage();
    	while(File.ReadString(str))
    	{
    		pDC->GetTextMetrics(&tm);
                    CString strTmp = str;
                    nRowSpace = tm.tmExternalLeading;
     
                    pDC->DrawText(strTmp, rcCalcText, DT_CALCRECT);
                    nStringheight = rcCalcText.Height();
     
                    strRect.left=200;
                    strRect.right = pDC->GetDeviceCaps(HORZRES);
                    strRect.top=iY;
                    strRect.bottom = strRect.top + nStringheight;
     
     
                    CString tab1,tab2;                        
                    int tabPos = strTmp.Find("\t");
                    if ( tabPos != -1 )
                    {
                         tab1 = strTmp.Left(tabPos);
                         tab2 = strTmp.Right(strTmp.GetLength()-tabPos-1);            
                    }
                    else
                         tab1 = strTmp;
     
                    pInfo->m_rectDraw.SetRect(0,0,
                                 pDC->GetDeviceCaps(HORZRES),
                                 pDC->GetDeviceCaps(VERTRES));
                    pInfo->m_nCurPage= nPage;
     
                    pDC->DrawText(tab1,strRect,
                           DT_WORDBREAK | DT_EXPANDTABS);
                    strRect.left=strRect.right/3;
                    pDC->DrawText( tab2,strRect,
                           DT_WORDBREAK | DT_EXPANDTABS);
     
                   // Calculate the next start position
                   iY = ( nRowSpace + strRect.bottom);
                   if(iY > iVerticalSize)
    	       {
    			iY = 300;
    			pDC->EndPage();
    			pDC->StartPage();
    			nPage++;
    	       }
     
    	}
    Comme ça je n'ai plus de problème avec mes lignes auparavant tronquées.

  11. #11
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Salut Farscape, si jamais tu (ou quelqu'un d'autre) passes par là, pourrais tu me conseiller sur la marche à suivre pour la prévisualisation écran?
    Par exemple si j'ai deux pages à imprimer -ce qui se passe très bien- et que je souhaite les visualiser auparavant, j'ai un résultat assez fâcheux :
    Le première page affiche mes lignes de textes et quand la zone de la première page est dépassée, le reste des lignes de mon fichier viennent ligne par ligne effacer mes anciennes lignes jusqu'à la fin de lecture du fichier.
    Sur la seconde page j'ai le même résultat.
    J'aimerais faire en sorte que lorsque les dimensions de la première page sont dépassées, les lignes débutant la seconde page y soient affichés sur cette seconde page...

    Aurais tu une idée?

    Je rappelle que je débute...

  12. #12
    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
    salut,
    commence par poster ton code ,pour que l'on puisse regarder ce que tu as fait...

  13. #13
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Voici ma fonction OnPreparePrinting (mais je doute qu'elle soit encore utile) :

    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
    BOOL CDonneesView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	CPrintDialog pdlg(FALSE);
    	if(!pdlg.GetDefaults())
    		return FALSE;
     
    	HDC hdcPrinter = pdlg.GetPrinterDC();
    	if(hdcPrinter == NULL)
    	{
    		MessageBox(_T("Il y a un problème avec l'imprimante."));
    	}
    	else
    	{
    	   dcPrinter.Attach(hdcPrinter);
     
           CDonneesDoc* pDoc =
                   reinterpret_cast<CDonneesDoc*>(GetDocument());
     
    	   CString titre = pDoc->GetTitle();
     
     
    	   FILE * pFile;
    	   pFile = fopen(titre, "r");
    	   if(pFile == NULL)
    	   {
    			MessageBox(_T("Le fichier n'existe pas."));
    			return false;
    	   }
    	   else
    	   {
    			int c, nbLigne = 0;
    			while(!feof(pFile))
    			{
    				c = fgetc(pFile);
    				if(c == '\n')
    				{
    					nbLigne++;
    				}
    			}
    			int nbPage;
    			if(nbLigne <= 73)
    			{
    				nbPage = 1;
    			}
    			else
    			{
    				nbPage = (nbLigne - (nbLigne%73)) / 73;
    				if(nbLigne%73 > 0)
    				{
    					nbPage++;
    				}
    			}
    			fclose(pFile);
    			pInfo->SetMinPage(1);
    			pInfo->SetMaxPage(nbPage);
    			pInfo->m_nCurPage=1;
     
    			return DoPreparePrinting(pInfo);
    	   }
    	}
    }

    Voici la fonction 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
    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;
    	pDC->StartPage();
     
    	while(File.ReadString(str))
    	{
    		pDC->GetTextMetrics(&tm);
     
                CString strTmp = str;
     
    	    nRowSpace = tm.tmExternalLeading;
     
                pDC->DrawText(strTmp, rcCalcText, DT_CALCRECT);
                nStringheight = rcCalcText.Height();
     
                strRect.left=200;
                strRect.right = pDC->GetDeviceCaps(HORZRES);
                strRect.top=iY;
                strRect.bottom = (strRect.top + nStringheight);
     
     
                CString tab1,tab2;                        
                int tabPos = strTmp.Find("\t");
                if ( tabPos != -1 )
                {
                    tab1 = strTmp.Left(tabPos);
                    tab2 = strTmp.Right(strTmp.GetLength()-tabPos-1);            
                }
                else
                    tab1 = strTmp;
     
                pInfo->m_rectDraw.SetRect(0,0,
                   pDC->GetDeviceCaps(HORZRES),
                         pDC->GetDeviceCaps(VERTRES));
                pInfo->m_nCurPage= nPage;
     
    			pDC->DrawText(tab1,strRect,DT_WORDBREAK | DT_EXPANDTABS);
    			strRect.left=strRect.right/3;
    			pDC->DrawText(tab2,strRect,DT_WORDBREAK | DT_EXPANDTABS);
     
                int x = strRect.bottom;
                iY = (nRowSpace + x);
                if(iY > iVerticalSize)
    	    {
    				iY = 300;
    				pDC->EndPage();
    				pDC->StartPage();
    				nPage++;
    	    }
    	}
    }

    L'impression fonctionne très bien, j'ai juste un problème avec la prévisualisation et d'autres problèmes à venir étant donné que je perds mes informations quant à la colorisation syntaxique.

    [EDIT] : Colorisation syntaxique ok.

  14. #14
    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
    la question que je me pose et qui fait référence aux premiers posts c'est :
    Ta view CDonneesView affiche-elle déjà à l'écran le texte avec les attributs couleurs ?

  15. #15
    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
    Ta view CDonneesView affiche-elle déjà à l'écran le texte avec les attributs couleurs ?
    Oui.

  16. #16
    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
    alors pourquoi tout ce bastringue ?
    par défaut la pré visu écran ou l'impression d"une vue (cview) fonctionne...
    qu'est ce qui ne vas pas avec le traitement par défaut ?

  17. #17
    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
    qu'est ce qui ne vas pas avec le traitement par défaut ?
    Quand tu dis par défaut, tu entends que le simple fait d'associer à mes ID de contrôles, ID_FILE_PRINT et ID_FILE_PRINT_PREVIEW, aux fonctions OnFilePrint et OnFilePrintPreview respectivement, me permet à la fois d'imprimer et de prévisualiser ma vue?

    Dans le cas ou j'aurais bien compris: en appelant ces fonctions j'ai une prévisualisation qui ne fonctionne pas (page grisée) et une impression qui ne peut débuter avec un petit message "Could not start print job" .

  18. #18
    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
    oui ,le traitement par défaut permet un pré visualisation du document afficher dans la view par la méthode OnDraw.
    si tu reprends le post de la faq c'est bien spécifié.
    maintenant tout dépend comme ça été implémenté dans la view.
    en réponse à ton autre post:
    En ce qui concerne la colorisation syntaxique pourquoi réinventer la roue puisque le traitement de base à l'écran traite le sujet ?

  19. #19
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut
    Le traitement par défaut n'était pas fonctionnel. Le problème que je rencontre avec la colorisation syntaxique vient du fait que pour l'impression je fais appel au texte contenu dans le fichier associé au document, qui n'est pas coloré. Mon document a un membre de type CString qui contient le texte et le recrache à l'initialisation de ma CDonneesView. Le problème c'est que je ne peux pas réutiliser cette variable membre puisqu'elle est apparemment vidée après initialisation (je ne sais pas du tout pourquoi c'est fait comme ça).

    C'est une application professionnelle et je débute en VC++, mon projet de stage c'est simplement de faire en sorte qu'on puisse imprimer nos documents. Je ne préfère pas bidouiller à côté, ce n'est pas mon travail et je ne pense pas en avoir l'autorisation. Du moins je ne peux pas me permettre de me l'accorder...

    Du coup là j'en suis à aller chercher le texte dans mes fichiers pour imprimer chaque ligne. Je vais modifier le code d'impression pour faire en sorte de dessiner chaque mot et ainsi lui donner la couleur qui va bien. Je ne vois pas d'autre solution et surtout, me restant que deux semaines de stages, j'ai un peu peur de devoir partir sur une autre piste.

    Peut-être qu'il faudrait simplement faire en sorte que ma variable membre de CDonneesDoc m_sInput (de type CString) ne se vide pas me permettrait d'imprimer et de prévisualiser ma vue mais je me vois mal dire au jury : "Pendant mes six semaines de stage j'ai fait ça : ID_FILE_PRINT, OnFilePrint et ID_FILE_PRINT_PREVIEW, OnFilePrintPreview. C'est un peu bête je suppose de dire ça...

  20. #20
    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
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 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