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 :

[MFC] Aide pour imprimer du HTML sans passer par le setup


Sujet :

MFC

  1. #1
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut [MFC] Aide pour imprimer du HTML sans passer par le setup
    Bonjour,

    Je travaille sur une application codée par quelqu'un d'autre. Cette appli. génère un fichier html qu'il est possible d'imprimer.
    Pour l'instant, l'impression se fait par ce code (destFile est le chemin du fichier à imprimer):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	ShellExecute(NULL, "print", destFile, NULL, NULL, SW_SHOWNORMAL);
    ...ce qui a pour effet d'afficher la fenêtre de configuration de l'impression.
    Je souhaiterai arriver à lancer l'impression sur l'imprimante par défaut sans cette fenêtre et j'avoue que je suis un peu perdu. J'ai cherché sur ce site et ailleurs sur le net et j'ai trouvé ça et ça qui me donnent des pistes, notamment sur la configuration de l'impression.
    Par contre, je ne vois pas quelle fonction effectue réellement l'impression. Est-ce CView::OnPreparePrinting() ? Si c'est le cas, comme je n'utilise pas de View qu'est-ce que je dois utiliser ?

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    la methode utilisée fait appel a un programme enregistré pour imprimer de l'html .
    de ce fait tu ne pourras controler l'edition dans ton programme.
    ce que tu peux faire :
    c'est générer une classe derivée de CHtmlView pour prendre en charge le document html ,la fenetre peut etre en mode cachée ,modifier eventuellement l'imprimante .
    et lancer l'edition a travers cette fenetre.



  3. #3
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Je vais me pencher sur la dérivation de CHtmlView.

    Ce que j'ai oublié de préciser, c'est que le fichier html en question est visible dans un controle d'un type dérivé de CWnd.
    Est-il possible d'imprimer le contenu de ce contrôle, indépendamment de la source ?

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    l'html c'est de l'interpreation ,
    donc si tu es capable de te brancher ou utiliser l'interpretation réalisé dans ton edit oui tu peux en faire l'impression ...


  5. #5
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par farscape
    l'html c'est de l'interpreation ,
    donc si tu es capable de te brancher ou utiliser l'interpretation réalisé dans ton edit oui tu peux en faire l'impression ...

    Excuse-moi mais je ne comprends pas trop ta réponse. Est-ce que tu veux dire que puisque l'affichage du fichier html a déjà été réalisé, il ne devrait pas y avoir de problème pour l'imprimer ?
    Dans ce cas, CHtmlView est la solution ?

  6. #6
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    ben oui CHtmlView sait imprimer de l'html.
    ton contrôle il herite de quelle classe ?
    si ton contrôle est un composant privé il devrait etre possible d'utiliser (avec un peu d'astuce) son moteur d'affichage de l'html pour en faire l'impression...

  7. #7
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    La classe qui affiche le html est CWebBrowser2, classe dérivée de CWnd.
    C'est vrai qu'en y regardant de plus près on y retrouve les fonctions d'un CHtmlView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [...]
     
    // Operations
    public:
    	void GoBack();
    	void GoForward();
    	void GoHome();
    	void GoSearch();
    	void Navigate(LPCTSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers);
    	void Refresh();
    	void Refresh2(VARIANT* Level);
    	void Stop();
    [etc...]
    Par contre je crois que je manque un peu "d'astuce"
    Est-ce que c'est la fonction OnDraw() qu'il faut modifier pour "rediriger" la sortie (même si je n'ai aucune idée de la manière dont il faut s'y prendre) : plutôt que d'envoyer l'image à l'écran, l'envoyer à l'imprimante ?

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    les commandes pour imprimer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ExecWB(OLECMDID_PRINTPREVIEW,OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
    				break;
     
    		case OLECMDID_PRINT:
    				ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

  9. #9
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    J'ai trouvé cette fonction qui utilise bien ExecWB() :
    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
     
    void CReport::PrintReport(bool userInput)
    {
    	CTime date = CTime::GetCurrentTime();
     
    	CString language = m_manageLanguage.GetLanguage();
    	CString header, footer = "";
     
    	if((language == "US-Feet") || (language == "US-Mil"))
    	{
    		header.Format("%d/%d/%d - %d:%d:%d", date.GetMonth(), date.GetDay(), date.GetYear(), date.GetHour(), date.GetMinute(), date.GetSecond());
    	}
    	else
    	{
    		header.Format("%d/%d/%d - %d:%d:%d", date.GetDay(), date.GetMonth(), date.GetYear(), date.GetHour(), date.GetMinute(), date.GetSecond());
    	}
     
    	// construct two element SAFEARRAY;
    	// first element is header string, second element is footer string
     
    	HRESULT hr;
     
    	VARIANT		header_variant;
    	VariantInit(&header_variant);
    	V_VT(&header_variant)   = VT_BSTR;
    	V_BSTR(&header_variant) = CString(header).AllocSysString();
     
    	VARIANT		footer_variant;
    	VariantInit(&footer_variant);
    	V_VT(&footer_variant)   = VT_BSTR;
    	V_BSTR(&footer_variant) = CString(footer).AllocSysString();
     
    	long index;
     
    	SAFEARRAYBOUND	parameter_array_bound[1];
    	SAFEARRAY		*parameter_array = NULL;
     
    	parameter_array_bound[0].cElements = 2;
    	parameter_array_bound[0].lLbound   = 0;
     
    	parameter_array = SafeArrayCreate(VT_VARIANT,1,parameter_array_bound);
     
    	index = 0;
    	hr    = SafeArrayPutElement(parameter_array,&index,&header_variant);
     
    	index = 1;
    	hr    = SafeArrayPutElement(parameter_array,&index,&footer_variant);
     
    	VARIANT	parameter;
    	VariantInit(&parameter);
    	V_VT(&parameter)    = VT_ARRAY | VT_BYREF;
    	V_ARRAY(&parameter) = parameter_array;
     
    	OLECMDEXECOPT option;
    	if (userInput)
    		option = OLECMDEXECOPT_PROMPTUSER;
    	else
    		option = OLECMDEXECOPT_DONTPROMPTUSER;
     
    	// start printing browser contents
    	m_htmlReport.ExecWB(OLECMDID_PRINT, option, &parameter, NULL);
    }
    Mais j'ai un plantage ("Debug Assertion Failed") sur la ligne de ExecWB(), justement.
    J'ai essayé de changer l'option et de mettre le parametre à NULL, sans succès.

    La fonction ExecWB() redéfinie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CWebBrowser2::ExecWB(long cmdID, long cmdexecopt, VARIANT* pvaIn, VARIANT* pvaOut)
    {
    	static BYTE parms[] =
    		VTS_I4 VTS_I4 VTS_PVARIANT VTS_PVARIANT;
    	InvokeHelper(0x1f6, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
    		 cmdID, cmdexecopt, pvaIn, pvaOut);
    }

  10. #10
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Je pense avoir trouvé d'où viens le problème :
    La variable m_htmlReport qui exécute la fonction ExecWB() est nulle !
    Pour être précis, il existe deux modes dans mon application.

    Dans le premier, on génère un fichier html que l'on peut imprimer. Pour cela on passe par un bouton qui appelle la fonction PrintReport() (voir précédent message) avec le paramètre true. Dans ce cas tout se passe bien, m_htmlReport n'est pas nulle et la fenêtre de setup apparaît, ce qui est voulu.

    Dans le second mode, on appelle l'application avec une ligne de commande et tout doit se faire sans qu'aucune fenêtre ne soit visible (pas même le setup, donc). La fonction PrintReport() est donc appelé avec le paramètre false. Et là, m_htmlReport est nulle.

    La seule différence que je vois entre les deux modes pour la variable m_htmlReport c'est que le DoDataExchange() n'est pas fait dans le deuxième mode. Est-ce que le problème viendrait de là ?

  11. #11
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    oui ! ,si pas de updateData pas de subclass de la variable.
    pour infos:
    http://c.developpez.com/faq/vc/?page...nge#UpdateData

  12. #12
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Chouette, on progresse !

    J'ai bien lu ton post de la FAQ mais je n'arrive pas à subclasser mon m_htmlReport...
    J'ai rajouté cette ligne la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_htmlReport.SubclassDlgItem(IDC_HTMLREPORT,this);
    avant l'appel à ExecWB() (IDC_HTMLREPORT est l'ID de l'affichage de la page html), et j'ai un plantage dans la fonction SubclassDlgItem() sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ASSERT(::IsWindow(pParent->m_hWnd));
    ce qui me paraît logique. Comment arriver à "simuler" une fenêtre parent ?

  13. #13
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    donne lui une fenetre valide ,si tu n'en as pas donne lui la plus proche ou a defaut (a essayer) AfxGetMainWnd().

  14. #14
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Comme je n'ai absolument pas de fenêtre, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_htmlReport.SubclassDlgItem(IDC_HTMLREPORT,AfxGetMainWnd());
    Même plantage...

    J'ai aussi essayé de me créer ma propre fenêtre :
    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
     
    	CWnd* pWnd;
    	pWnd = (CWnd*)CreateObject();
     
    	DWORD dwStyle = WS_CHILD | WS_BORDER;
     
    	// Create with the right size (wrong position)
    	CRect rect(0,0,100,100);
    	if (pWnd->Create(NULL, NULL, dwStyle, rect, this, 0, NULL))
    	{
    		m_htmlReport.SubclassDlgItem(IDC_HTMLREPORT,pWnd);
     
    		// start printing browser contents
    		m_htmlReport.ExecWB(OLECMDID_PRINT, option, &parameter, NULL);
     
    		pWnd->DestroyWindow();
    	}
    Sans succès, on ne rentre jamais dans le if{}


  15. #15
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    un petit moment on fait des betises la !
    dans ce mode d'edition tu n'as pas de controle HTML actif graphiquement ?

  16. #16
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Exactement !
    Absolument rien d'actif graphiquement, aucune fenêtre, nothing.

    C'est un mode "silencieux" qui permet de lancer des impressions automatiquement toutes les heures.

  17. #17
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    donc ,il va te falloir ruser !
    je reviens a ce que je disais au debut :
    il te faut creer ce controle en mode caché ou non visible voir la fonction Create .
    lui affecter ce fichier et lui demander d'editer ...

  18. #18
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Problème, la fonction Create() est redéfinie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
    		const RECT& rect, CWnd* pParentWnd, UINT nID,
    		CFile* pPersist = NULL, BOOL bStorage = FALSE,
    		BSTR bstrLicKey = NULL)
    	{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
    		pPersist, bStorage, bstrLicKey); }
    J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	m_htmlReport.Create("WindowName",NULL,CRect(0,0,100,100),NULL,4000);
    	m_htmlReport.ExecWB(OLECMDID_PRINT, option, &parameter, NULL);
    Mais ça plante sur le Create().

  19. #19
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    met WS_CHILD dans le style .
    pour le parent la fenetre principal AfxGetMainWnd().

  20. #20
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    J'ai le même plantage...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_htmlReport.Create("WindowName",WS_CHILD,CRect(0,0,100,100),AfxGetMainWnd(),4000);

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/05/2007, 00h52
  2. Réponses: 5
    Dernier message: 08/09/2006, 12h12
  3. Réponses: 2
    Dernier message: 06/06/2006, 14h43
  4. Imprimer un TIFF sans passer par PostScript
    Par iubito dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 22/03/2004, 20h44
  5. Réponses: 4
    Dernier message: 05/02/2004, 18h18

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