Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2814 connectés 

  FORUM HardWare.fr
  Programmation

  [C]mode d'impression

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C]mode d'impression

n°51430
cthulhu
Merci, merci...
Posté le 07-08-2001 à 11:34:04  profilanswer
 

Bonjour a tous,
je désire lancer une impression avec selection de limprimante.
Pour se faire, j'utilise la fonction CreateDC().
Jusque là tout va bien...
Mais voilà je ne comprends pas comment définir l'impression en landscape ouen portrait.
J'ai cru comprendre que c sur le document qu'on travaille, mais je ne trouve pas comment.
mon code au cas ou:

Code :
  1. int main(int argc,char *argv[])
  2. {
  3. DWORD    dwSizeNeeded;
  4. DWORD    dwNumItems;
  5. DWORD    dwItem;
  6. LPPRINTER_INFO_2  lpInfo = NULL;
  7. unsigned int compt=0;
  8. char *select[20];
  9. char temp[80];
  10. char szPrinter[80];
  11. char Printer[80];
  12. char output[80]={NULL};
  13. int PageY=0;
  14. HDC PrintDC=NULL;
  15. TEXTMETRIC PtrTxtMet;
  16. static DOCINFO DocInfo = { sizeof(DOCINFO), "Printing Test", NULL };
  17. clrscr();
  18. EnumPrinters ( PRINTER_ENUM_CONNECTIONS, NULL, 2, NULL, 0, &dwSizeNeeded, &dwNumItems );
  19. lpInfo = (LPPRINTER_INFO_2)HeapAlloc ( GetProcessHeap (), HEAP_ZERO_MEMORY, dwSizeNeeded );
  20. if ( lpInfo == NULL ){
  21.  puts ( "Not enough memory\n" );
  22.  return 0;
  23. }
  24. if ( EnumPrinters ( PRINTER_ENUM_CONNECTIONS, // what to enumerate
  25.       NULL,   // printer name (NULL for all)
  26.       2,    // level
  27.       (LPBYTE)lpInfo,  // buffer
  28.       dwSizeNeeded,  // size of buffer
  29.       &dwSizeNeeded,  // returns size
  30.       &dwNumItems   // return num. items
  31.     )
  32.  == 0 ){
  33.  printf ( "EnumPrinters() Failed with error: %d\n", GetLastError () );
  34.  return 0;
  35.  }
  36. // free memory
  37. HeapFree ( GetProcessHeap (), 0, lpInfo );
  38. PrintDC=CreateDC(NULL,Printer,NULL,NULL);
  39. PageY = GetDeviceCaps(PrintDC, VERTRES);   
  40.     if(PrintDC){
  41.  GetTextMetrics(PrintDC, &PtrTxtMet);
  42.  if(StartDoc(PrintDC, &DocInfo) > 0) { 
  43.   if(StartPage(PrintDC) > 0) {   
  44.            int Y = 0;
  45.   while(Y < PageY) {
  46.    Y += (PtrTxtMet.tmHeight + PtrTxtMet.tmExternalLeading);
  47.    sprintf(output, "test dimpression" );
  48.                TextOut(PrintDC,  // Device context
  49.                            0,    // X coordinate
  50.                         Y,    // Y coordinate
  51.                          output,         // string to output
  52.                          strlen(output)  // size of string in chars
  53.                     );
  54.    }
  55.   }
  56.  if (!EndPage(PrintDC) > 0) {
  57.                  printf("Print Error: EndPage() Failed!" );
  58.                  DeleteDC(PrintDC);
  59.                 return 1;
  60.                  }   
  61.  else
  62.   if (!StartPage(PrintDC) > 0) {
  63.                       printf("Print Error: StartPage() Failed!" );
  64.    }
  65.  EndDoc(PrintDC);
  66.  }
  67. DeleteDC(PrintDC);
  68. }
  69. return 0;
  70. }


 
Merci davance

mood
Publicité
Posté le 07-08-2001 à 11:34:04  profilanswer
 

n°51444
cthulhu
Merci, merci...
Posté le 07-08-2001 à 11:57:00  profilanswer
 

hehe, apparemment, mon post ninteresse pas grand monde,... :)
pas grave, pour ceux que ca interesse, jai trouve ma reponse ici:
http://support.microsoft.com/suppo [...] 7/3/45.ASP

n°51450
SoWhatIn22
Posté le 07-08-2001 à 12:10:48  profilanswer
 

Ben franchement, ca ne m'interresse pas trop, par contre merci de dire ou tu as trouvé ta réponse. Ca pourras sans doute servir à d'autres.
Un exemple à suivre.
Par ce que des fois, on essaye de répondre, et puis on a un "ok, c'est bon, j'ai trouvé..." mais on ne connait pas le résultat final. Et c'est parfois frustrant.

n°51492
cthulhu
Merci, merci...
Posté le 07-08-2001 à 14:03:14  profilanswer
 

:sol:

n°51649
Carbon_14
Posté le 08-08-2001 à 09:33:49  profilanswer
 

En 16 (et 32 bits), j'utilise une méthode permettant d'imprimer sur toute imprimante installée mais qui ne modifie PAS l'imprimante par défaut.  
 
void Imprim(void)
{
    PRINTDLG   pd;
    DOCINFO    DocInfo;
    BYTE       NumCopie;
    int        xPageWidth, yPageHeight;
    int        LargPage, HautPage;
    float      RapporYXEcran;
 
    memset(&pd, 0, sizeof(PRINTDLG));  // RAZ
    pd.lStructSize = sizeof(PRINTDLG);
    pd.hwndOwner = hWnd;
    pd.Flags = PD_RETURNDC | PD_HIDEPRINTTOFILE | PD_NOPAGENUMS | PD_NOSELECTION;
    pd.nFromPage = 1;
    pd.nToPage = 1;
    pd.hDevMode = (HANDLE)NULL;
    pd.hDevNames = (HANDLE)NULL;
    pd.nMinPage = 1;
    pd.nMaxPage = 1;
    pd.nCopies = 1;  // par défaut
 
    if (! PrintDlg(&pd))
    {
      if ((int)CommDlgExtendedError != 490) // not "Abandon"
      {
 char *str;  
        if ((str = (char *)malloc(300)) != NULL)
        {
   sprintf(str, "Impression du fichier %s impossible.", NomCourtFich);
          MessageBox(hWnd, str, NULL, MB_OK | MB_ICONSTOP);
   free(str);
 }
      }
      return;
    }
 
    xPageWidth = GetDeviceCaps(pd.hDC, HORZRES);  
    yPageHeight = GetDeviceCaps(pd.hDC, VERTRES);  
    // si imprimante noir et blanc, imprime en noir (et blanc)
    N_B = (GetDeviceCaps(pd.hDC, BITSPIXEL) == 1);
 
    HautPage = GetDeviceCaps(pd.hDC, VERTSIZE);
    LargPage = GetDeviceCaps(pd.hDC, HORZSIZE);
 
    memset(&DocInfo, 0, sizeof(DOCINFO));
    DocInfo.cbSize = sizeof(DOCINFO);
    #ifndef __FLAT__
    DocInfo.lpszDocName = "Spectr16"; // le nom de mon appli
    #else
    DocInfo.lpszDocName = "Spectr32"; // le nom de mon appli
    #endif
    DocInfo.lpszOutput = NULL;
 
    // nombre exemplaires demandé, tj >= 0 !
    if (StartDoc(pd.hDC, &DocInfo) != SP_ERROR)
    { // SINON, Cf GetLastError pour savoir où Pb
      EnableWindow(hWnd, FALSE);
      bCanceled = FALSE;
 
      StartPage(pd.hDC);
      for (NumCopie = 1; NumCopie <= pd.nCopies; NumCopie ++)
      {
        ZigZagP(pd.hDC); // mon module qui dessine à l'écran, sur l'imprimante
                         // ou dans un métafichier
 EndPage(pd.hDC);
      }
      EndDoc(pd.hDC); // même si erreur, faut bien finir !
    }
 
    EnableWindow(hWnd, TRUE);
 
    if (pd.hDevMode != NULL) GlobalFree(pd.hDevMode);
    if (pd.hDevNames != NULL) GlobalFree(pd.hDevNames);
 
    DeleteDC(pd.hDC);
}
// fin du module Imprim
 
J'ai ôté la cuisine perso qui me sert à règler la taille de la zone de dessin en fonction de la taille du périphérique destination (écran, imprimante, métafichier).
 
Ca donne une alternative à la méthode Krosoft....  :)

n°52070
cthulhu
Merci, merci...
Posté le 09-08-2001 à 14:13:37  profilanswer
 

merci, ca c du bon boulot,... ;)

n°52545
cthulhu
Merci, merci...
Posté le 13-08-2001 à 12:54:06  profilanswer
 

bon, maintenant je me retrouve avec un autre probleme,
j'ai recupere et adapte une fonction de rexuperation de l'imprimante par defaut, en gros ca marche, sauf que dans les informations, je nai aucune imprimante par defaut.
Bien sur, jai correctement défini une imprimante par defaut...
 
la recuperation se fait bit par bit dans une variable, seulement je recupere "24" pour toutes les imprimantes...
apres verification je realise que ca correspond a  
 
1)default printer
 
2)shared printer
 

Code :
  1. static char *GetDefPrinter()
  2. {
  3. unsigned int k;
  4. char szPrinter[2048];
  5. DWORD    dwSizeNeeded;
  6. DWORD    dwNumItems;
  7. DWORD    dwItem;
  8. LPPRINTER_INFO_2  lpInfo ;
  9. EnumPrinters ( PRINTER_ENUM_CONNECTIONS, NULL, 2, NULL, 0, &dwSizeNeeded, &dwNumItems );
  10. lpInfo = (LPPRINTER_INFO_2)HeapAlloc ( GetProcessHeap (), HEAP_ZERO_MEMORY, dwSizeNeeded );
  11. if ( lpInfo == NULL ){
  12.  puts ( "Not enough memory\n" );
  13.  return NULL;
  14. }
  15. if ( EnumPrinters ( PRINTER_ENUM_CONNECTIONS, // what to enumerate
  16.       NULL,   // printer name (NULL for all)
  17.       2,    // level
  18.       (LPBYTE)lpInfo,  // buffer
  19.       dwSizeNeeded,  // size of buffer
  20.       &dwSizeNeeded,  // returns size
  21.       &dwNumItems   // return num. items
  22.     )
  23.  == 0 ){
  24.  printf ( "EnumPrinters() Failed with error: %d\n", GetLastError () );
  25.  return NULL;
  26.  }
  27. for(k=0;k<dwNumItems;k++){
  28. sprintf(szPrinter,"%s %d & %d",lpInfo[k].pPrinterName,lpInfo[k].Attributes,PRINTER_ATTRIBUTE_DEFAULT);
  29. MessageBox(NULL,szPrinter,"temp",MB_OK);
  30. MessageBox(NULL,itoa(lpInfo[k].Attributes & PRINTER_ATTRIBUTE_DEFAULT,szPrinter,10),"temp",MB_OK);
  31.  if(lpInfo[k].Attributes & PRINTER_ATTRIBUTE_DEFAULT){
  32.   return strdup(lpInfo[k].pPrinterName);
  33.  }
  34. }
  35. HeapFree ( GetProcessHeap (), 0, lpInfo );
  36. return "noDefaultPrinter";
  37. }

 

[edtdd]--Message édité par cthulhu--[/edtdd]

n°52707
cthulhu
Merci, merci...
Posté le 14-08-2001 à 10:05:56  profilanswer
 

:bounce:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C]mode d'impression

 

Sujets relatifs
[Newbie PHP] Fred999 veut se mettre aux trucs à la mode[C++] Impression Ecran
[VB6] composant d'apercu avant impression ???[HTML/CSS] forcer un saut de page à l'impression pour IE5
[C++ builder] impression[C++] Minimizer une application en mode console
Creer un module d'impression en phpGérer l'impression du document en JavaScript
[EMACS] Changer le mode d'indentation[windows/windev 5.5] problème d'impression...
Plus de sujets relatifs à : [C]mode d'impression


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)