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

Visual C++ Discussion :

Impression d'un document rtf


Sujet :

Visual C++

  1. #1
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut Impression d'un document rtf
    Bonjour,

    Je cherche à imprimer un fichier texte au format rtf.

    J'ai récupéré une première méthode qui imprime directement le fichier sur une imprimante. Par contre, je ne comprends pas son fonctionnement:
    1) Comment savoir quelle imprimante est sélectionnée?
    2) Pourquoi le fait de créer ce process signifie t'il l'impression du document?

    Voici 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
    51
    52
     
    ret_error = GetSystemDirectory(c_sysdir,_MAX_PATH);
    	ASSERT(ret_error!=0);
     
    	sprintf(c_RsFile,"%s\\rs.ini",c_sysdir);
     
    	//Check for WordPad path
    	GetPrivateProfileString("WORDPAD","PATH","NO",temp,_MAX_PATH,RsFile);
    	CString WordpadPath;
    	WordpadPath.Format("%s",temp);
     
    	if (WordpadPath=="NO")
    	{
    		AfxMessageBox("WordPad application not installed. Please install this component from Windows installation disk.");
    	}
    	else
    	{
    		WordpadPath+=" ";
    		WordpadPath+=m_sNomFic; //nom du fichier à imprimer
    		WordpadPath+=" /p";
    		char commandline[1024];
    		int i;
    		for (i=0;i<WordpadPath.GetLength();i++)
    			commandline[i]=WordpadPath.GetAt(i);
    		commandline[i]=0;
     
    		STARTUPINFO si;
    		PROCESS_INFORMATION pi;
    		ZeroMemory( &si, sizeof(si) );
    		si.cb = sizeof(si);
     
    		if( !CreateProcess( NULL, // No module name (use command line). 
    		commandline, // Command line. 
    		NULL,             // Process handle not inheritable. 
    		NULL,             // Thread handle not inheritable. 
    		FALSE,            // Set handle inheritance to FALSE. 
    		0,                // No creation flags. 
    		NULL,             // Use parent's environment block. 
    		NULL,             // Use parent's starting directory. 
    		&si,              // Pointer to STARTUPINFO structure.
    		&pi ))             // Pointer to PROCESS_INFORMATION structure.    
    		{
    			AfxMessageBox( "CreateProcess failed." );    
    		}
     
    		// Wait until child process exits.
    		WaitForSingleObject( pi.hProcess, INFINITE );
     
    		// Close process and thread handles.     CloseHandle( pi.hProcess );
    		CloseHandle( pi.hThread );
     
    	}

    Une autre méthode que je désire mettre en place est celle décrite dans la faq. Le problème est que je n'imprime rien alors que windows m'avertit bien que le document a été envoyée à l'imprimante. Le nom de l'imprimante et de ce document sont bien ceux désirés.

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(OpenPrinterDirect(list[1].pPrinterName,commandline))
    	{
    		//WritePrinterString("essai d'impression\n");
    		ClosePrinterDirect();
    	}
    commandline représente le nom du document.
    WritePrinterString affiche bien la ligne attendue. Je l'ai mis en commentaire car je souhaite imprimer le document dont je passe le chemin.
    Peut être dois donc utiliser impérativement WritePrinterString() avec comme paramètre le buffer contenant mes données mais dans ce cas, pourquoi donc passer comme paramètre le chemin du document à imprimer?! de plus quand j'ai fais celan ca m'a imprimé sur des pages différentes les balises rtf...

    Les fonctions appellées:
    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
    bool CHistoriqueDlg::OpenPrinterDirect(char* szPrinterName, char* szDocName)
    {
       DOC_INFO_1 di;
       di.pDocName = szDocName; 
       di.pOutputFile = NULL;
       di.pDatatype = "RAW";
     
       if ( !OpenPrinter(szPrinterName, &HandlePrinter, NULL ) )  return false;
       if ( StartDocPrinter( HandlePrinter, 1, (LPBYTE)&di ) == 0 ) return false;
       if ( !StartPagePrinter( HandlePrinter ) ) return false;
     
       return true;
    }
     
    bool CHistoriqueDlg::ClosePrinterDirect()
    {
        if ( !EndPagePrinter(HandlePrinter ) )return false;
        if ( !EndDocPrinter(HandlePrinter) )return false;
        if ( !ClosePrinter(HandlePrinter) )return false;
        HandlePrinter=NULL;
       return true;
    }
     
    BOOL CHistoriqueDlg::WritePrinterString(const char *sz)
    {
       DWORD bw;
       return WritePrinter(HandlePrinter, (void*)sz,strlen(sz),&bw);
    }
    Nicolas


  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,
    c'est normal ...
    la premiere méthode demande à wordpad d'imprimer le document en lui passant le chemin de celui-ci.
    la deuxieme méthode de la faq ne peut fonctionner dans ton cas ,
    c'est comme ci-tu envoyais un fichier html sous forme .txt à l'imprimante
    le flux d'impression ne va pas interpreter l'html il va envoyer le texte tel quel ...
    c'est pareil pour le rtf ,il faut un moteur de rendu pour imprimer.
    un CRichEditView par exemple sait imprimer un .rtf.

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Ok, merci pour ces informations.

    En fait, lorsqu'on lance un process avec comme 2ieme argument, le chemin d'un éditeur de texte suivi du chemin d'un fichier, alors on lance une impression via cet éditeur de texte. Je ne connaisais pas cette méthode d'impression...

    Je vais jeter un coup d'oeil sur le CRichEditView prochainement.
    Ca n'a rien a voir avec CRichTextEdit?

    Bonne soirée

    Nicolas

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À en juger par le nom, si, ça a à voir : Ce doit être une View (pour le modèle document/vue MFC) contenant un contrôle RichEdit, tout comme un CRichTextEdit doit être une classe dérivée de CWnd qui encapsule un contrôle...

    Pour la view, trois possibilités selon moi:
    • Une classe dérivée de CView contenant un CRichTextEdit.
    • Une classe dérivée de CView encapsulant directement le RichEdit.
    • Un hack affreux comme celui de CListCtrl/CListView : Une classe qui se caste en CRichTextEdit.

    Connaissant Microsoft, je parierais pour la troisième solution. Après tout, ils l'ont déja fait pour les ListViews, alors pourquoi pas pour les RichEdits...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Recherche documentation RTF
    Par BigBenQ dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 17/10/2005, 11h57
  2. chargement et impression d'un document pdf
    Par waldo2188 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/02/2005, 11h28
  3. [FLASH MX 2004] impression d'un document
    Par matN59 dans le forum Flash
    Réponses: 4
    Dernier message: 24/05/2004, 15h29
  4. Impression d'un document XML
    Par 501darts dans le forum XMLRAD
    Réponses: 3
    Dernier message: 31/03/2004, 14h11

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