[C]mode d'impression

mode d'impression [C] - Programmation

Marsh Posté le 07-08-2001 à 11:34:04    

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

Reply

Marsh Posté le 07-08-2001 à 11:34:04   

Reply

Marsh Posté le 07-08-2001 à 11:57:00    

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

Reply

Marsh Posté le 07-08-2001 à 12:10:48    

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.

Reply

Marsh Posté le 07-08-2001 à 14:03:14    

:sol:

Reply

Marsh Posté le 08-08-2001 à 09:33:49    

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....  :)

Reply

Marsh Posté le 09-08-2001 à 14:13:37    

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

Reply

Marsh Posté le 13-08-2001 à 12:54:06    

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]

Reply

Marsh Posté le 14-08-2001 à 10:05:56    

:bounce:

Reply

Sujets relatifs:

Leave a Replay

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