Imprimer in fichier sous Windows

Imprimer in fichier sous Windows - C - Programmation

Marsh Posté le 29-12-2007 à 17:43:51    

Salut à tous
 
J'aimerais trouver le moyen d'imprimer du texte en C...
 
J'ai déjà fais des recherches et j'ai trouvé ces codes :

Code :
  1. FILE *imprim;
  2. imprim=fopen("PRN","wt" );
  3. fprintf(imprim,"Exemple d'impression!\n" );
  4. fclose(imprim);


Résultat ==> Ecran noir pendant environ 30 secondes, puis le programme s'arrete sans avoir imprimer.
 

Code :
  1. fprintf(stdprn,"Mon texte à imprimer: %s","le text" );


Résultat ==> Erreur lors de la compilation, mais d'après ce que j'ai pu lire sur internet cette fonction est dépassé, donc plus utilisé...
 

Code :
  1. FILE *fp;
  2. int c;
  3. if (argc != 2) /* un seul paramètre ! */
  4. {
  5. printf("Syntaxe : printfl fichier\n" );
  6. exit(1);
  7. }
  8. if ((fp = fopen(argv[1], "r" )) == NULL)
  9. {
  10. printf("Impossible d'ouvrir le fichier %s.\n", argv[1]);
  11. exit(2);
  12. }
  13. while ((c = fgetc(fp)) != EOF) 
  14. fputc("essai", stdin);


Résultat ==> Le programme compile mais ce referme tout de suite sans imprimer.
 

Code :
  1. *stream;
  2. stream = fopen("PRN", "w" );
  3. fprintf(stream, "a line of text\n" );


Résultat ==> Le programme compile mais ce referme tout de suite sans imprimer.
 

Code :
  1. system("print test.txt" );

 
Résultat ==> Assez bon...le programme ce lance trouve le fichier et met impression en cour...puis 30 secondes aprés le programme s'arrete san avoir imprimer...
 
 
Es que quelq'un à une solution?
 
 
Merci d'avance.  
 
PS = Je précise que c'est dans le but de réaliser un éditeur de texte, dans je ne peut pas passer par le bloc note ou autre...

Reply

Marsh Posté le 29-12-2007 à 17:43:51   

Reply

Marsh Posté le 29-12-2007 à 18:17:15    

M'est avis que tu devrais utiliser les fonctions d'impression propre a windows pour avoir un minimum de choix (configuration de l'impression, choix de l'imprimante, etc...)
http://msdn2.microsoft.com/en-us/l [...] S.85).aspx

Reply

Marsh Posté le 29-12-2007 à 18:27:33    

MERCI beaucoup pour le lien!
 
La description que tu as faite est exactement ce que je cherche, mais malheresement je n'ai pas tout compris sur le lien que tu m'as donné...
 
Aurais tu un petit exemple de code?
 
 
Merci
Je continu à regarder ton lien...

Reply

Marsh Posté le 29-12-2007 à 20:22:54    

Euh non désolé, je n'ai pas d'exemple...
(ci peut etre un petit exemple: http://www.gidforums.com/t-6872.html )
 
Sinon au lieu d'utiliser fopen("PRN", ...) as tu essayé fopen("LPT1",...)

Reply

Marsh Posté le 29-12-2007 à 23:35:46    

Oui j'ai essayé mais ça ne marche pas...
Enfin je réessayerais demain...
 
Sinon le lien que tu m'as donné c'est du C++ non ( "cpp" )?
 
 
 
Merci

Reply

Marsh Posté le 30-12-2007 à 10:03:31    

Ok bon j'ai obtenue ce code :
 

Code :
  1. #include <stdio.h>
  2. #include <conio2.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <windows.h>
  6. void PageGDICalls (HDC, int, int) ;
  7. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  8. BOOL PrintMyPage (HWND) ;
  9. extern HINSTANCE hInst ;
  10. extern TCHAR     szAppName[] ;
  11. extern TCHAR     szCaption[] ;     // in PRINT.C
  12. HDC  GetPrinterDC (void) ;              // in GETPRNDC.C
  13. main(int argc, char **argv)
  14. {
  15. HINSTANCE hInst ;
  16. TCHAR     szAppName[] = TEXT ("Print1" ) ;
  17. TCHAR     szCaption[] = TEXT ("Print Program 1" ) ;
  18. BOOL PrintMyPage (HWND hwnd)
  19. {
  20.      static DOCINFO di = { sizeof (DOCINFO), TEXT ("Print1: Printing" ) } ;
  21.      BOOL           bSuccess = TRUE ;
  22.      HDC            hdcPrn ;
  23.      int            xPage, yPage ;
  24.    
  25.      if (NULL == (hdcPrn = GetPrinterDC ()))
  26.           return FALSE ;
  27.      xPage = GetDeviceCaps (hdcPrn, HORZRES) ;
  28.      yPage = GetDeviceCaps (hdcPrn, VERTRES) ;
  29.    
  30.      if (StartDoc (hdcPrn, &di) > 0)
  31.      {
  32.           if (StartPage (hdcPrn) > 0)
  33.           {
  34.                PageGDICalls (hdcPrn, xPage, yPage) ;
  35.              
  36.                if (EndPage (hdcPrn) > 0)
  37.                     EndDoc (hdcPrn) ;
  38.                else
  39.                     bSuccess = FALSE ;
  40.           }
  41.      }
  42.      else
  43.           bSuccess = FALSE ;
  44.    
  45.      DeleteDC (hdcPrn) ;
  46.      return bSuccess ;
  47. }
  48. system ("PAUSE" );
  49. return 0;
  50. }
  51. HDC GetPrinterDC (void)
  52. {
  53.      DWORD            dwNeeded, dwReturned ;
  54.      HDC              hdc ;
  55.      PRINTER_INFO_4 * pinfo4 ;
  56.      PRINTER_INFO_5 * pinfo5 ;
  57.  DWORD pcchBuffer;
  58.  OSVERSIONINFO osver;
  59.  osver.dwOSVersionInfoSize =sizeof(OSVERSIONINFO);
  60.  GetVersionEx(&osver);
  61.      if (GetVersion () & 0x80000000)         // Windows 98
  62.      {
  63.           EnumPrinters (PRINTER_ENUM_DEFAULT, NULL, 5, NULL,
  64.                         0, &dwNeeded, &dwReturned) ;
  65.           pinfo5 = (PRINTER_INFO_5*)malloc (dwNeeded) ;
  66.           EnumPrinters (PRINTER_ENUM_DEFAULT, NULL, 5, (PBYTE) pinfo5,
  67.                         dwNeeded, &dwNeeded, &dwReturned) ;
  68.           hdc = CreateDC (NULL, pinfo5->pPrinterName, NULL, NULL) ;
  69.           free (pinfo5) ;
  70.      }
  71.  else if(osver.dwMinorVersion==1){ //windows XP
  72.   GetDefaultPrinter(NULL,&pcchBuffer);
  73.   TCHAR* pszBuffer = new TCHAR[pcchBuffer];   // printer name buffer
  74.   GetDefaultPrinter(pszBuffer,&pcchBuffer);
  75.   hdc = CreateDC (NULL, pinfo4->pPrinterName, NULL, NULL) ;
  76.  }
  77.      else                                    // Windows NT
  78.      {
  79.           EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, NULL,
  80.                         0, &dwNeeded, &dwReturned) ;
  81.           pinfo4 = (PRINTER_INFO_4*)malloc (dwNeeded) ;
  82.           EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4,
  83.                         dwNeeded, &dwNeeded, &dwReturned) ;
  84.           hdc = CreateDC (NULL, pinfo4->pPrinterName, NULL, NULL) ;
  85.           free (pinfo4) ;
  86.      }
  87.      return hdc ; 
  88. }
  89. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  90.                     PSTR szCmdLine, int iCmdShow)
  91. {
  92.      HWND     hwnd ;
  93.      MSG      msg ;
  94.      WNDCLASS wndclass ;
  95.    
  96.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  97.      wndclass.lpfnWndProc   = WndProc ;
  98.      wndclass.cbClsExtra    = 0 ;
  99.      wndclass.cbWndExtra    = 0 ;
  100.      wndclass.hInstance     = hInstance ;
  101.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  102.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  103.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  104.      wndclass.lpszMenuName  = NULL ;
  105.      wndclass.lpszClassName = szAppName ;
  106.    
  107.      if (!RegisterClass (&wndclass))
  108.      {
  109.           MessageBox (NULL, TEXT ("This program requires Windows NT!" ),
  110.                       szAppName, MB_ICONERROR) ;
  111.           return 0 ;
  112.      }
  113.    
  114.      hInst = hInstance ;
  115.    
  116.      hwnd = CreateWindow (szAppName, szCaption,
  117.                           WS_OVERLAPPEDWINDOW,
  118.                           CW_USEDEFAULT, CW_USEDEFAULT,
  119.                           CW_USEDEFAULT, CW_USEDEFAULT,
  120.                           NULL, NULL, hInstance, NULL) ;
  121.    
  122.      ShowWindow (hwnd, iCmdShow) ;
  123.      UpdateWindow (hwnd) ;
  124.    
  125.      while (GetMessage (&msg, NULL, 0, 0))
  126.      {
  127.           TranslateMessage (&msg) ;
  128.           DispatchMessage (&msg) ;
  129.      }
  130.      return msg.wParam ;
  131. }
  132. void PageGDICalls (HDC hdcPrn, int cxPage, int cyPage)
  133. {
  134.      static TCHAR szTextStr[] = TEXT ("Hello, Printer!" ) ;
  135.    
  136.      Rectangle (hdcPrn, 0, 0, cxPage, cyPage) ;
  137.    
  138.      MoveToEx (hdcPrn, 0, 0, NULL) ;
  139.      LineTo   (hdcPrn, cxPage, cyPage) ;
  140.      MoveToEx (hdcPrn, cxPage, 0, NULL) ;
  141.      LineTo   (hdcPrn, 0, cyPage) ;
  142.    
  143.      SaveDC (hdcPrn) ;
  144.    
  145.      SetMapMode       (hdcPrn, MM_ISOTROPIC) ;
  146.      SetWindowExtEx   (hdcPrn, 1000, 1000, NULL) ;
  147.      SetViewportExtEx (hdcPrn, cxPage / 2, -cyPage / 2, NULL) ;
  148.      SetViewportOrgEx (hdcPrn, cxPage / 2,  cyPage / 2, NULL) ;
  149.    
  150.      Ellipse (hdcPrn, -500, 500, 500, -500) ;
  151.    
  152.      SetTextAlign (hdcPrn, TA_BASELINE | TA_CENTER) ;
  153.      TextOut (hdcPrn, 0, 0, szTextStr, lstrlen (szTextStr)) ;
  154.      RestoreDC (hdcPrn, -1) ;
  155. }
  156. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  157. {
  158.      static int   cxClient, cyClient ;
  159.      HDC          hdc ;
  160.      HMENU        hMenu ;
  161.      PAINTSTRUCT  ps ;
  162.    
  163.      switch (message)
  164.      {
  165.      case WM_CREATE:
  166.           hMenu = GetSystemMenu (hwnd, FALSE) ;
  167.           AppendMenu (hMenu, MF_SEPARATOR, 0, NULL) ;
  168.           AppendMenu (hMenu, 0, 1, TEXT ("&Print" )) ;
  169.           return 0 ;
  170.          
  171.      case WM_SIZE:
  172.           cxClient = LOWORD (lParam) ;
  173.           cyClient = HIWORD (lParam) ;
  174.           return 0 ;
  175.          
  176.      case WM_SYSCOMMAND:
  177.           if (wParam == 1)
  178.           {
  179.                if (!PrintMyPage (hwnd))
  180.                     MessageBox (hwnd, TEXT ("Could not print page!" ),
  181.                                 szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  182.                return 0 ;
  183.           }
  184.           break ;
  185.          
  186.      case WM_PAINT :
  187.           hdc = BeginPaint (hwnd, &ps) ;
  188.          
  189.           PageGDICalls (hdc, cxClient, cyClient) ;
  190.          
  191.           EndPaint (hwnd, &ps) ;
  192.           return 0 ;
  193.          
  194.      case WM_DESTROY :
  195.           PostQuitMessage (0) ;
  196.           return 0 ;
  197.      }
  198.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  199. }


 
Mais j'ai une erreur sur cette ligne :

Code :
  1. TCHAR* pszBuffer = new TCHAR[pcchBuffer];   // printer name buffer


erreur : `new' undeclared (first use in this function)  
Je vois pas l'erreur, je voie même pas ou elle est déclarer!C'est peut-être ça justement l'erreur?
 
 
 
Merci

Reply

Marsh Posté le 30-12-2007 à 11:54:29    

new/delete, c'est du cplusplus, remplace par malloc/free

Reply

Marsh Posté le 01-01-2008 à 00:41:47    

Merci beaucoup!
 
Mais peut tu détailelr un peu ce que tu veux dire, je croi que je n'ai pas trés bien compris?
Je remplace juste les mots?
 
 
Sinon personne à plus simple?
 
 
 
merci

Reply

Marsh Posté le 01-01-2008 à 11:23:34    

remplace
TCHAR* pszBuffer = new TCHAR[pcchBuffer];
par il me semble:
TCHAR* pszBuffer = (TCHAR *) malloc(pcchBuffer);

Reply

Marsh Posté le 01-01-2008 à 13:17:14    

Salut
 
Merci beaucoup!
 
Bon le programme ne compile toujours pas...
Il me dit qu'il y a plein de fonctions non trouvées, comme ci je n'avais pas inclue une librairie...
 
Voila ce que j'ai inclue :

Code :
  1. #include <stdio.h>
  2. #include <conio2.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <windows.h>


 
 
Merci d'avance

Reply

Marsh Posté le 01-01-2008 à 13:17:14   

Reply

Marsh Posté le 01-01-2008 à 16:34:07    

aurey a écrit :

Il me dit qu'il y a plein de fonctions non trouvées, comme ci je n'avais pas inclue une librairie...


"inclue une librairie" Qu'est-ce que ça peut bien vouloir dire ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 02-01-2008 à 16:02:46    

Salut.
 
Les premiers codes sont corrects, et le résultat est bon. Il faut seulement trouver le fichier "PRN" dans le même endroit de le .exe fichier.
 
Code :
   1. FILE *imprim;
   2. imprim=fopen("PRN","wt" );
   3. fprintf(imprim,"Exemple d'impression!\n" );
   4. fclose(imprim);
Résultat ==> Ecran noir pendant environ 30 secondes, puis le programme s'arrete sans avoir imprimer.

Message cité 1 fois
Message édité par you_801204 le 02-01-2008 à 16:03:48
Reply

Marsh Posté le 02-01-2008 à 16:56:27    

you_801204 a écrit :

Salut.
 
Les premiers codes sont corrects, et le résultat est bon. Il faut seulement trouver le fichier "PRN" dans le même endroit de le .exe fichier.


Ah ? Tu crois que "PRN" est un fichier...
 
http://support.microsoft.com/kb/60203/fr
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 02-01-2008 à 17:40:57    

Oh! Merci, Emmanuel Delahaye. C'est ma imprimante. "PRN" est pour LPT1, qui est le connecteur entre l'ordi et l'imprimante. Donc les messages sont soumis vers LPT1.
 
Si pour enregistrer des messages en fichier, on peut remplacer "PRN" de un nom comme "resultat.txt".


---------------
Pierre Electro-Info http://porte-d-orleans.reparation-paris.fr/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed