| auteur : Farscape | Le principe :
On commence par récupérer le nombre d'imprimante avec EnumPrinters
On alloue un tableau de type PRINTER_INFO_2 pour recevoir les informations et on appelle à nouveau EnumPrinters pour le remplir.
Si on veut récupérer d'autres informations comme le réglage papier par exemple on continuera comme suit :
Ensuite on itère le tableau et pour chaque nom d'imprimante on obtient un handle sur l'imprimante, et enfin un pointeur sur la structure DEVMODE.
Notez que pour la plupart de ces fonctions, un premier appel permet de récupérer la taille de la structure à allouer avant d'effectuer l'appel final?
L'exemple ci-dessus remplit une CCombobox des imprimantes trouvées avec l'indication du format papier (à compléter pour les autres formats).
int GetPrinterList (CComboBox * pCombo)
{
PRINTER_INFO_2* list;
DWORD cnt = 0 ;
DWORD sz = 0 ;
int i;
int sl;
EnumPrinters ( PRINTER_ENUM_LOCAL, NULL , 2 , NULL , 0 , & sz, & cnt );
if ( (list = (PRINTER_INFO_2* ) malloc ( sz )) = = 0 ) return 0 ;
if (! EnumPrinters ( PRINTER_ENUM_LOCAL, NULL , 2 , (LPBYTE)list, sz, & sz, & cnt))
{
free ( list );
return 0 ;
}
CString str,strSize;
HANDLE hDriver;
for ( i = 0 , sl = 0 ; i < (int )cnt; i+ + )
{
if (! OpenPrinter (list[i].pPrinterName,& hDriver,NULL )) continue ;
if (! hDriver) continue ;
DWORD dwBufSize = 0 ;
LPDEVMODE lpDM;
dwBufSize = DocumentProperties ( NULL ,
(HANDLE)hDriver,
(LPSTR)list[i].pPrinterName,
(LPDEVMODE)NULL ,
(LPDEVMODE)NULL ,
(DWORD) 0 );
HANDLE hDevMode= GlobalAlloc (GMEM_MOVEABLE, dwBufSize);
lpDM = (LPDEVMODE)GlobalLock (hDevMode);
dwBufSize = DocumentProperties (NULL ,
(HANDLE)hDriver,
(LPSTR)list[i].pPrinterName,
(LPDEVMODE)lpDM,
(LPDEVMODE)NULL ,
(DWORD)DM_COPY);
strSize= " Autre " ;
if (lpDM- > dmPaperSize= = DMPAPER_A4 ) strSize= " A4 " ;
ClosePrinter (hDriver);
:: GlobalFree (hDevMode);
str= list[i].pPrinterName;
str+ = " " ;
str+ = strSize;
pCombo- > AddString (str);
}
free ( list );
return cnt;
}
|
|
| auteur : Farscape | L'imprimante matricielle étant l'utilisation type:
HANDLE HandlePrinter= NULL ;
bool OpenPrinterDirect (char * szPrinterName, char * szDocName)
{
DOC_INFO_1 di;
di.pDocName = szDocName;
di.pOutputFile = NULL ;
di.pDatatype = " RAW " ;
if ( ! OpenPrinter (szPrinterName, & HandlePrinter, NULL ) ) return false ;
if ( StartDocPrinter ( HandlePrinter, 1 , (LPBYTE)& di ) = = 0 ) return false ;
if ( ! StartPagePrinter ( HandlePrinter ) ) return false ;
return true ;
}
bool ClosePrinterDirect ()
{
if ( ! EndPagePrinter (HandlePrinter ) )return false ;
if ( ! EndDocPrinter (HandlePrinter) )return false ;
if ( ! ClosePrinter (HandlePrinter) )return false ;
HandlePrinter= NULL ;
return true ;
}
BOOL WritePrinterString (const char * sz)
{
DWORD bw;
return WritePrinter (HandlePrinter, (void * )sz,strlen (sz),& bw);
}
if (OpenPrinterDirect (?Brother?,?TestsDocument?))
{
WritePrinterString (?essai d' impressio\n?);
ClosePrinterDirect ();
}
|
|
| auteur : Farscape | Il est parfois utile de pouvoir changer l'imprimante par défaut Windows par programme.
Exemple concret : Je veux pouvoir lancer l'impression d'un document Word sur une imprimante pdf par une commande ShellExecute, le problème étant alors de spécifier l'imprimante de traitement à Word.
Depuis Windows 2000 on dispose d'une api Windows spécifique pour ce réglage: SetDefaultPrinter.
Si je reprends mon exemple précédent je procèderais comme suit :
# include <winspool.h>
bool PrintDocument (const TCHAR * szDocument,const TCHAR * szPrinterName)
{
TCHAR szPrinterOld[256 ];
DWORD n= sizeof (szPrinterOld)/ sizeof (TCHAR);
:: GetDefaultPrinter (szPrinterOld,& n);
if (! :: SetDefaultPrinter (szPrinterName)) return false ;
HINSTANCE nerror;
if ((nerror= :: ShellExecute (AfxGetMainWnd ()- > m_hWnd,_T (" print " ), szDocument, NULL , NULL ,SW_HIDE))<= (HINSTANCE)32 )
{
CString mess;
mess.Format (_T (" Impossible d'imprimer le Document:\n%s Erreur n°: " ),szDocument,nerror);
AfxMessageBox (mess,MB_ICONEXCLAMATION);
}
:: SetDefaultPrinter (szPrinterOld);
return (nerror > (HINSTANCE)32 );
}
PrintDocument (_T (" C:\\testdoc.docx " ),_T (" GhostScript Pdf Writer " ));
|
le code ci-dessous imprime le document Word testdoc.docx dans une imprimante pdf
|
Consultez les autres F.A.Q.
|
|