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

C Discussion :

imprimer le contenu de l'écran


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 10
    Points : 7
    Points
    7
    Par défaut [Résolu]imprimer le contenu de l'écran
    Salut à tous !
    J'ai implémenté un programme sur les arbres généalogiques sous Turbo C 3. Je cherche à afficher mon arbre (en mode texte) sur l'imprimante . Est ce qu'il existe une commande qui imprime le contenu de l'écran ?
    @++
    Ensi

  2. #2
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 271
    Points
    130 271
    Billets dans le blog
    1
    Par défaut
    Tu peux simuler l'appui de la touche Impr Ecran en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    union REGS r;
    int86(0x05, &r, &r);
    Mais j'ignore si ça fonctionne, surtout si ton application DOS tourne sous Windows.

    Si ça ne marche pas, tu devras prendre en charge toi-même l'impression.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  3. #3
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut

    Si tu arrives à l'afficher sur ton écran, il doit être possible de l'écrire dans un fichier texte par l'instruction Ensuite tu l'imprime via un bloc-note.

    Voila....
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    J'ai pensé à utiliser la commande fprintf vers un fichier que j'imprime par la suite .
    Seuelement mon arbre généalogique contient des cadres faits par des caractères ascii et ces cadres sont placés par gotoxy() .
    C'est bizarre tout de même que turbo C n'a pas prévu la capture de la fenêtre texte vers l'imprimante ?
    @+

  5. #5
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut

    Si la solution de Anomaly ne fonctionne pas, y'a bien une autre solution mais qui me parait démesurée pour ton affaire. C'est de lire les octets en mémoire vidéo puis de les copier dans un fichier.
    En mode texte, l'adresse de la ram vidéo est (normalement) 0xB800:0000. En offset 0 tu as le caratère (en haut à gauche) et à l'offset 1 tu as la couleur (+background) du caractère. Donc aux offsets pairs tu as les caractères, et aux offsets impairs la couleur des caractères.
    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
    /*
      Fonction de copie d'écran texte dans un fichier
    */
    unsigned impr_ecran(void)
      { FILE *copy_ecran ;
        unsigned char far *ptr_ecran = 0xB8000000 ;	// Base de la ram vidéo
        unsigned i, j ;
        char car ;
     
      copy_ecran = fopen("cpyecran.txt", "w+") ;	// Ouverture du fichier texte
      if(copy_ecran==NULL) return 0 ;		// Cas où erreur
     
      for(i=0; i<25; i++)				// Parcour les 80x25 caractères de l'écran
        {
        for(j=0; j<80; j++)
          {
          car = *(ptr_ecran+(2*j + 160*i)) ;	// Lecture du caractère
          fprintf(copy_ecran, "%c", car) ;		// Copie dans le fichier
     
          // couleur = *(ptr_ecran+(2*j + 160*i)+1) ;	
          }
        fprintf(copy_ecran, "\n") ;			// On ajoute le CRLF
        }
      fclose(copy_ecran) ;				// Fermeture du fichier
      return 1 ;
      }
    Donc le but de cette fonction est de lire juste les caractères en ram vidéo puis de les sauver dans un fichier.
    Nota : Faire attention à l'init du pointeur d'écran, il est préférable de faire un caste genre (unsigned char far*)0xB8000000.

    Voila.....
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  6. #6
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Re-salut

    J'ai oublié juste une petite chose.
    Les caractères ascii sous dos comme l'accentuation (é,è,à etc..) et l'entourage des fenêtres ne sont pas affichés correctement sous windows. Donc il te faudrat surement retravailler ton fichier pour voir apparaître ton arbre généalogique.
    Ou autre solution, les intercepter au moment de l'écriture dans le fichier et les échanger par d'autres...

    Voila...
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Salut Elijha,
    Je te remercie énormémont pour ton code dont j'ai bien saisit le principe.
    Seulement en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void main ()
    {
    	printf ("bonjour");
    	impr_ecran();
    }
    Le compilateur me signale une erreur au niveau de la fonction impr_ecran() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char far *ptr_ecran = 0xB8000000 ;   // Base de la ram vidéo

    Error Name00.cpp 10:cannot convert 'unsigned long' to 'unsigned cahr far*'

    Je pense que nous ne sommes pas loin de notre but !
    @++
    ensi

  8. #8
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut

    Peut-être en essayant le caste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char far *ptr_ecran = (unsigned char far*)0xB8000000 ;
    soit en utilisant MK_FP(sous borland) toujours avec le caste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned char far *ptr_ecran = NULL;
    // dans le main, construit un pointeur du segment et de l'offset
    ptr_ecran = (unsigned char far*)MK_FP(0xB800,0x0000) ;
    MK_FP permet de "fabriquer" un pointeur à l'aide d'un segment et d'un offset au format Intel (dans include dos.h).
    Sinon je crois qu'il faut changer le type du pointeur (far ou huge) en fonction du model de compilation choisit (small, large ou huge).

    Voila...
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  9. #9
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Hum, Hum !

    Aurais-tu lu mon premier post jusqu'au bout ?
    Citation Envoyé par Elijha
    Nota : Faire attention à l'init du pointeur d'écran, il est préférable de faire un caste genre (unsigned char far*)0xB8000000.
    Je sais pas si c'est le problème, mais je crois que cela pourrait arranger les choses

    Revoila....
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    C'est gagné !
    J'ai tapé ce 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
     
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    /*  Fonction de copie d'écran texte dans un fichier
    */
    unsigned impr_ecran(void)
      { FILE *copy_ecran ;
        unsigned char far *ptr_ecran = (unsigned char far*)0xB8000000 ;   // Base de la ram vidéo
     
        unsigned i, j ;
        char car ;
     
      copy_ecran = fopen("c:\\k\\cpyecran.txt", "w+") ;   // Ouverture du fichier texte
      if(copy_ecran==NULL) return 0 ;      // Cas où erreur
     
      for(i=0; i<25; i++)            // Parcour les 80x25 caractères de l'écran
        {
        for(j=0; j<80; j++)
          {
          car = *(ptr_ecran+(2*j + 160*i)) ;   // Lecture du caractère
          fprintf(copy_ecran, "%c", car) ;      // Copie dans le fichier
     
          // couleur = *(ptr_ecran+(2*j + 160*i)+1) ;
          }
        fprintf(copy_ecran, "\n") ;         // On ajoute le CRLF
        }
      fclose(copy_ecran) ;            // Fermeture du fichier
      return 1 ;
      }
      void main ()
      {
    	printf ("bonjour");
    	impr_ecran();
    	getch();
      }
    et j'ai retrouvé ma capture d'écran .
    Enfin , au sujet de la "caste" : s'agit-il d'une sorte de convertissement ?
    Merci bien Elijha et Anomaly !
    ensi...

  11. #11
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut
    Citation Envoyé par ensi
    Enfin , au sujet de la "caste" : s'agit-il d'une sorte de convertissement ?
    Globalement le caste permet de spécifier ponctuellement le type de donnée pointée.
    Dans notre cas, il permet de dire au compilo que 0xB8000000, est une adresse qui pointe sur un octet. D'où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char far *ptr_ecran = (unsigned char far*)0xB8000000
    ce qui implique qu'avec ce pointeur tu ne pourras lire qu'un octet.
    Autre exemple; Maintenant disons que tu veuilles copier un octet dans un entier. On aura
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned char var_char = 5;
    unsigned int var_int = 0 ;
    // Dans le main
    var_int = (unsigned int)var_char ;
    Dans ce cas le compilo transforme ponctuellement ta variable char en int le temps de la copier dans var_int. Tu peu le faire sans le caste, mais le compilo l'implémente automatiquement. Les problèmes sont visibles sur les pointeurs qui n'ont pas de type vraiment définis comme dans le cas de lui attribuer une adresse hard.

    Voila en "gros" le caste
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

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

Discussions similaires

  1. [C#] Imprimer le contenu d'une fenêtre avec ascenseur
    Par biglong dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/08/2007, 23h29
  2. Je veux imprimer le contenu de ma combo ?!!
    Par nil dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/03/2004, 15h17
  3. imprimer le contenu d'une TPaintBox
    Par stimbo dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/03/2004, 19h42
  4. [Kylix] Imprimer le contenu d'une boîte de dialogue
    Par cmp-france dans le forum EDI
    Réponses: 13
    Dernier message: 18/10/2003, 20h31
  5. Comment imprimer le contenu d'un TStringGrid
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/06/2002, 15h41

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