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 :

probleme d'impression :tabulation et dimensions de la page


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut probleme d'impression :tabulation et dimensions de la page
    bonjour,

    je suis en train de travailler sur des fonctions d'impression tres basiques qui consistent à imprimer des lignes de textes simples.
    seulement je me heurte a deux problemes.

    le premier viens des tabulations, j'utilise le caractere \t mais ca m'imprime des carrés et non des tabulations.

    voila ma fonction d'initialisation de l'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
     
    void init_imprimante( void )
    {				
     
    	//initialisation de l'imprimante  et du contexte de peripherique
    	CPrintDialog dlg(FALSE);
    	dlg.GetDefaults();
    	dc.Attach (dlg.GetPrinterDC ());
     
    	//creation des polices de caracteres
     
    	gothic12.CreateFont(-50, 0, 0, 0, FW_NORMAL, 1, 1, 0,
    						DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    						CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    						DEFAULT_PITCH |  TMPF_TRUETYPE,
    						"Letter Gothic");
     
    	times12.CreateFont(-45, 0, 0, 0, FW_NORMAL, 0, 0, 0,
    						DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    						CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    						DEFAULT_PITCH |  TMPF_TRUETYPE,
    						"Times New Roman");
     
    	courier16.CreateFont(-40, 0, 0, 0, FW_NORMAL, 0, 0, 0,
    						DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    						CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    						DEFAULT_PITCH |  TMPF_TRUETYPE,
    						"Courier New");
     
    	ZeroMemory(&di, sizeof (DOCINFO));
    	di.cbSize = sizeof(DOCINFO);
    	di.lpszDocName = "Resultat test sur Titan";
    	dc.StartDoc (&di);
    	dc.StartPage();
    }
    j'ai ensuite ma fonction d'impression qui est :

    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
    void imprime(char *ptr_chaine)				//Procédure d'impression
    {
    	if(global_imprimante == TRUE)
    	{
    		dc.TextOut(x_texte,y_texte,ptr_chaine);
    		y_texte+=50;
    		if (y_texte >= 3400)
    		{
    			dc.EndPage();
    			dc.StartPage();
    			dc.SelectObject (pOldFont);
    			y_texte=100;
    		}
    	 }
    }
    et je l'utilise comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void imprime_fin_pas(void)
    {
    	pOldFont=dc.SelectObject (&courier16);
    	imprime("\t\t\t - OK ");
    }
    puis pour lancer l'impression j'appelle:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fin_imprimer(void)
    {
    	dc.EndPage();
    	dc.EndDoc();
    }
    et là je n'obtiens pas mes tabulations


    /**********************************************************/

    ensuite j'ai un probleme de mise en page,
    j'utilise une variable y_texte (initialisé a 100) pour la gestion verticale des lignes et une variable x_texte (initialisé a 20) pour l'abscisse.
    x_texte ne varie jamais et est utilisé dans la fonction imprime lors du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dc.TextOut(x_texte,y_texte,ptr_chaine);
    mais voila si j'imprime une chaine longue alors j'ai un retour à la ligne à mis chemin et à chaque fois... pourquoi?

    merci pour votre aide, j'ai essayé d'être le plus clair possible mais je sais pas si j'y suis arrivé...

  2. #2
    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,
    il faut utiliser CDC:rawText et le flag DT_EXPANDTABS .
    exemple:
    http://www.developpez.net/forums/vie...056118#1056118


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    super merci, je viens de modifier le code pour faire comme dans le lien que tu m'as donné et ca me donne donc 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
    void imprime(char *ptr_chaine)				//Procédure d'impression
    {
    	if(global_imprimante == TRUE)
    	{
    		CSize size=dc.GetTextExtent(ptr_chaine);
    		CRect rect=new CRect(x_texte,y_texte,x_texte+2000, y_texte+50);
     
    		dc.DrawText(ptr_chaine,rect,DT_TOP | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_EXPANDTABS); 
     
    		y_texte+=50;
    		if (y_texte >= 3400)
    		{
    			dc.EndPage();
    			dc.StartPage();
    			dc.SelectObject (pOldFont);
    			y_texte=100;
    		}
    	 }
    }
    ca marche bien meme si le rect est definie à la volée

    et justement, les valeurs de test de x_texte et y_texte je les ai choisi arbitrairement, comment savoir la taille d'une feuille A4 (actuellement y_texte>=3400 m'arrete a peu pres au milieu de la page).

    il existe une fonction qui permet de connaitre ces valeur ou je dois y aller a taton?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    pour la taille du rect je vais utiliser DT_CALCRECT mais pour le reste je ne sais pas.

  5. #5
    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
    pour avoir les dimensions de la feuille voir GetDeviceCaps
    voir utilisation dans ce post:
    http://www.developpez.net/forums/vie...=getdevicecaps
    ça te donne la dimension en pixels de la feuille en fonction de ton dc d'impression (imprimante).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    ok super, ca marche tres bien la fonction GetDeviceCaps.

    j'ai laissé tomber le flag DT_CALCRECT car ca m'imprime des feuille blanche sinon (je devrai peu etre passer par un imprimante virtuel pour mes essai... )

    en tout cas merci bien

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    re,

    je supprime la balise resolu car j'ai un probleme,

    lorsque j'imprime avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void imprime_nb_passage(short nb_passage)			//Procédure d'impression
    {
    	imprime_gothic12();
    	imprime("*****************************************************************");
    	sprintf(buffertemp,"*\t\t\tpassage n° %d\t\t\t*",nb_passage);
    	imprime(buffertemp);
    	imprime("*****************************************************************");
    	imprime_courier16();
    }
    j'ai mes caractere qui apparaisse souligné en sortie d'imprimante... je ne comprend pas pourquoi.


    j'ai toujours les fonctions suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void  imprime_gothic12(void)
    {
    	pOldFont=dc.SelectObject (&gothic12);
    }
    et la fonction d'impression standart:

    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
    void imprime(char *ptr_chaine)				//Procédure d'impression
    {
    	if(global_imprimante == TRUE)
    	{		
    		// surface d'impression
            CRect rectDraw;
            rectDraw.SetRect(x_texte, 
    						 y_texte,
    						 dc.GetDeviceCaps(HORZRES)-x_texte,
    						 dc.GetDeviceCaps(VERTRES)-100); 
     
     
    		//insertion du text sur la feuille
    		dc.DrawText(ptr_chaine,			//text a ecrire
    					rectDraw,			//limite de l'ecriture
    					DT_TOP				//Specifies top-justified text 	
    					| DT_LEFT			//Aligns text flush-left
    					| DT_SINGLELINE		//Specifies single line only. Carriage returns and linefeeds do not break the line
    					| DT_NOPREFIX		//Turns off processing of prefix characters
    					| DT_EXPANDTABS);	//Expands tab characters. The default number of characters per tab is eight
     
    		//TextOut(x_texte,y_texte,ptr_chaine);
     
    		y_texte+=50;
    		//if (y_texte >= 3400)
    		if (y_texte >= dc.GetDeviceCaps(VERTRES)-100)//dc.GetDeviceCaps(VERTRES) renvoie la hauteur de la feuille A4
    		{
    			dc.EndPage();
    			dc.StartPage();
    			dc.SelectObject (pOldFont);
    			y_texte=100;
    		}
    	 }
    }
    et celle d'initialisation:

    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
    void init_imprimante( void )
    	{				
     
    				//initialisation de l'imprimante  et du contexte de peripherique
    				CPrintDialog dlg(FALSE);
    				dlg.GetDefaults();
    				dc.Attach (dlg.GetPrinterDC ());
     
    				//creation des polices de caracteres
     
    				gothic12.CreateFont(-50, 0, 0, 0, FW_NORMAL, 1, 1, 0,
    									DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    									CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    									DEFAULT_PITCH |  TMPF_TRUETYPE,
    									"Letter Gothic");
     
    				times12.CreateFont(-45, 0, 0, 0, FW_NORMAL, 0, 0, 0,
    									DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    									CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    									DEFAULT_PITCH |  TMPF_TRUETYPE,
    									"Times New Roman");
     
    				courier16.CreateFont(-40, 0, 0, 0, FW_NORMAL, 0, 0, 0,
    									DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    									CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    									DEFAULT_PITCH |  TMPF_TRUETYPE,
    									"Courier New");
     
    				ZeroMemory(&di, sizeof (DOCINFO));
    				di.cbSize = sizeof(DOCINFO);
    				di.lpszDocName = "Resultat test sur Titan";
    				dc.StartDoc (&di);
    				dc.StartPage();
    	}

  8. #8
    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,
    Même réponse que j'ai donné à d'autres je préfère passer par une fonte système récupérée et après modifiée que créer directement.
    voir faq:
    http://c.developpez.com/faq/vc/?page=Fontes#CreateFonte

    exemple d'utilisation:
    http://farscape.developpez.com/Sampl...tmapButton.zip

    un conseil qui n'a rien a voir : priviligie des objets CString pour tes chaines au lieu de sprintf ,avec une CString tu as Format qui est la meme chose que sprintf et tu auras la securité en plus...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    merci pour l'info et le conseil, je vais faire ca de ce pas.

    et en effet j'ai testé et ca vien bien de la font car si j'appelle ma fonction comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //imprime_gothic12();
    	imprime("*****************************************************************");
    	//sprintf(buffertemp,"*                     passage n° %d                               *",
    	sprintf(buffertemp,"*\t\t\tpassage n° %d\t\t\t*",nb_passage);
    	imprime(buffertemp);
    	imprime("*****************************************************************");
    	//fin modification
    	//imprime_courier16();
    rien n'est souligné

    le plus louche c'est que en cour de developpement ce n'etait pas souligné... alors hop poubelle ces font et je fais comme tu dis.

    je posterai le resultat si ca peut aider d'autre.

    merci.

    edit: je vien de m'appercevoir de ma betise, dans les parametres de la font, elle est specifiée comme "underlined"....


    bon je vien aussi de regarder ton exemple et c'est un peu trop compliqué pour ce que je souhaite faire mais en tout cas je garde ca de coté pour la prochaine fois (j'apprend).
    là je modifie pour passer par des Cstring

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB]probléme d'impression en VB
    Par jolicoeur-3 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/10/2005, 21h30
  2. Probleme d'impression
    Par Kotik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/10/2005, 10h37
  3. Problème d'impression avec CUPS
    Par piff62 dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 14/02/2005, 11h46
  4. [TP]problème d'impression en turbopascal
    Par matusa96 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 14/02/2004, 17h17
  5. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

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