2008-09-19 13 views

Répondre

3

Les travaux suivants grands pour l'impression avec la win32api de C++

char szPrinterName[255]; 
unsigned long lPrinterNameLength; 
GetDefaultPrinter(szPrinterName, &lPrinterNameLength); 
HDC hPrinterDC; 
hPrinterDC = CreateDC("WINSPOOL\0", szPrinterName, NULL, NULL); 

À l'avenir au lieu de googler "win32/sujet /" "non géré" essayer googler ou "win32 api/sujet /"

+0

parfois il n'y a aucune imprimante par défaut sélectionnée et dans ce cas, vous obtiendrez 0 pour printernamelength – KPexEA

1

GetDefaultPrinter (MSDN) devrait faire l'affaire. Cela vous donnera le nom à passer à CreateDC pour l'impression.

2

Voici comment obtenir une liste des imprimantes actuelles et celle par défaut s'il y en a un par défaut.

Notez également: obtenir zéro pour la longueur du nom d'imprimante par défaut est valide si l'utilisateur n'a pas d'imprimante ou n'en a pas défini par défaut. De même, si vous appelez GetDefaultPrinter avec NULL comme pointeur de mémoire tampon, la longueur du nom sera d'abord renvoyée, puis vous pourrez allouer un tampon de nom suffisamment grand pour contenir le nom.

DWORD numprinters; 
DWORD defprinter=0; 
DWORD    dwSizeNeeded=0; 
DWORD    dwItem; 
LPPRINTER_INFO_2 printerinfo = NULL; 

// Get buffer size 

EnumPrinters (PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS , NULL, 2, NULL, 0, &dwSizeNeeded, &numprinters); 

// allocate memory 
//printerinfo = (LPPRINTER_INFO_2)HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, dwSizeNeeded); 
printerinfo = (LPPRINTER_INFO_2)new char[dwSizeNeeded]; 

if (EnumPrinters (PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,  // what to enumerate 
      NULL,   // printer name (NULL for all) 
      2,    // level 
      (LPBYTE)printerinfo,  // buffer 
      dwSizeNeeded,  // size of buffer 
      &dwSizeNeeded,  // returns size 
      &numprinters   // return num. items 
     ) == 0) 
{ 
    numprinters=0; 
} 

{ 
    DWORD size=0; 

    // Get the size of the default printer name. 
    GetDefaultPrinter(NULL, &size); 
    if(size) 
    { 
     // Allocate a buffer large enough to hold the printer name. 
     TCHAR* buffer = new TCHAR[size]; 

      // Get the printer name. 
     GetDefaultPrinter(buffer, &size); 

     for (dwItem = 0; dwItem < numprinters; dwItem++) 
     { 
          if(!strcmp(buffer,printerinfo[dwItem].pPrinterName)) 
       defprinter=dwItem; 
     } 
     delete buffer; 
    } 
} 
-1

Unmanaged C++ n'existe pas (et géré C++ est maintenant C++/CLI), si vous faites référence à C++, en utilisant non géré comme balise est juste triste ...

+0

Code Unmanaged/C++ natif existe encore dans VS2008 et je crois en VS2010. Je ne suis pas sûr si les versions Express l'ont cependant. –