2012-03-14 2 views
5

Sto cercando di modificare l'oggetto System.Drawing.Printing.PrinterSettings che ottengo da System.Windows.Forms.PrintDialog dopo che la finestra di dialogo è stata mostrata all'utente. Sebbene sia possibile modificare i valori delle proprietà nell'oggetto PrinterSettings, nessuna delle modifiche apportate dopo la visualizzazione della finestra di dialogo viene effettivamente considerata durante la stampa di un documento.Modifica impostazioni stampante dopo StampaDialog è stato mostrato

Ecco un esempio di ciò che intendo:

//Show the printdialog and retreive the printersettings  
var printDialog = new PrintDialog(); 
if (printDialog.ShowDialog() != DialogResult.OK) 
      return; 
var printerSettings = printDialog.PrinterSettings; 

//Now modify the printersettings object 
printerSettings.ToPage = 8; 

ora usano il PrinterSettings oggetto per la stampa. Io uso la DLL di terze parti Aspose.Words per questo, poiché ho bisogno di stampare Word, ma questo non sembra essere il problema. Sembra che dopo che la finestra di dialogo è stata mostrata, tutte le impostazioni sono già state impostate sulla stampante e la modifica di PrinterSettings non porta a nulla. Qualche idea su come farlo funzionare?

MODIFICA: Ho alcuni soluzioni per questo. Quello che voglio qui è ottenere una risposta a queste domande specifiche: è possibile cambiare l'oggetto PrinterSettings dopo che la finestra di dialogo è stata mostrata e queste modifiche sono considerate nella stampa. Se qualcuno conosce solo un modo di come questo può funzionare (puoi decidere quale API vuoi usare per la stampa, non importa se si utilizza l'oggetto PrinterSettings), ne sarei molto grato.

+0

Qualsiasi motivo per cui non si modificano le impostazioni prima di aprire la finestra di dialogo? –

+0

Sì, nella mia domanda ho "documenti uniti", che consistono in molti documenti diversi. Nella finestra di dialogo di stampa dovrebbero apparire come un unico documento, ma per la stampa ho bisogno di gestirli individualmente. Quindi, per essere più precisi: alcuni degli PrinterSettings dovrebbero applicarsi a tutti i documenti, altri che ho bisogno di impostare per ogni documento individualmente. Le singole proprietà/impostazioni che posso calcolare senza l'interazione dell'utente, ma per la stampa ho bisogno di iniettarle nelle impostazioni della stampante. – user1182735

+0

Non è completamente chiaro dallo snippet come l'oggetto PrinterSettings viene applicato al lavoro di stampa effettivo. Anche la mancanza nel codice spiega la causa del problema. –

risposta

2

Non capisco perché la tua domanda abbia un voto negativo, mi sembra abbastanza ragionevole ????

In ogni caso, alcune cose che ho notato con PrintDialog (che può o non può rispondere alla tua domanda).

La prima cosa è che è solo una classe wrapper per il dialogo di windows com.

[DllImport("comdlg32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
     public static extern bool PrintDlg([In, Out] NativeMethods.PRINTDLG lppd); 

e il secondo, e più importante con riferimento a mettere in discussione immagino: La classe PrintDialog ha questa routine che viene chiamato dopo la chiusura della PrintDlg chiamare

if (!UnsafeNativeMethods.PrintDlg(data)) 
       return false; 

      IntSecurity.AllPrintingAndUnmanagedCode.Assert(); 
      try { 
       UpdatePrinterSettings(data.hDevMode, data.hDevNames, data.nCopies, data.Flags, settings, PageSettings); 
      } 
      finally { 
       CodeAccessPermission.RevertAssert(); 
      } 

. . .

// VSWhidbey 93449: Due to the nature of PRINTDLGEX vs PRINTDLG, separate but similar methods 
// are required for updating the settings from the structure utilized by the dialog. 
// Take information from print dialog and put in PrinterSettings 
private static void UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, short copies, int flags, PrinterSettings settings, PageSettings pageSettings) { 
     // Mode 
     settings.SetHdevmode(hDevMode); 
     settings.SetHdevnames(hDevNames); 

     if (pageSettings!= null) 
      pageSettings.SetHdevmode(hDevMode); 

     //Check for Copies == 1 since we might get the Right number of Copies from hdevMode.dmCopies... 
     //this is Native PrintDialogs 
     if (settings.Copies == 1) 
      settings.Copies = copies; 

     settings.PrintRange = (PrintRange) (flags & printRangeMask); 
    } 

C'è anche un gioco piuttosto interessante (tenendo a mente si imposta PrinterSettings.ToPage):

public PrinterSettings PrinterSettings { 
    get { 
     if (settings == null) 
     { 
      settings = new PrinterSettings(); 
     } 
     return settings; 
    } 
    set { 
     if (value != PrinterSettings) 
     { 
      settings = value; 
      **printDocument = null;** 
     } 
    } 
} 

e poi

public PrintDocument Document { 
      get { return printDocument;} 
      set { 
       printDocument = value; 
       **if (printDocument == null) 
        settings = new PrinterSettings();** 
       else 
        settings = printDocument.PrinterSettings; 
      } 
     } 

Non è una risposta diretta lo so, ma Penso che dovrei indicarti la giusta direzione del perché non funziona. Mi sembra che durante l'uso del dialogo, possa tranquillamente annullare le impostazioni sui cambiamenti poiché verrà ricreato al completamento, ma quando il Dialogo è completo, la modifica delle impostazioni invalida le impostazioni di stampa del documento fino a quando non viene nuovamente impostato. Potrebbe essere possibile farlo manualmente, o potrebbe essere locato da M $ nel solito modo interno/privato di molti interni.

C'è un'opzione ovviamente (non è bello che io sappia) utilizzare semplicemente l'API di Windows direttamente dopo il codice di chiamata, che potrebbe essere sottratta dai dialghe precedenti per creare il proprio wrapper, se necessario.

Buona fortuna.

+0

Non l'ho controllato per un po 'e quindi sono un po' in ritardo con il mio replay: Grazie mille. – user1182735

+0

E btw. Penso che la domanda abbia avuto un downvote perché alcune persone su questo sito hanno la tendenza a non prendere in considerazione il vero problema e il contenuto della domanda. Non si è disposti a riconoscere che l'autore ha più di un'idea superfica di programmazione. Per quanto riguarda questa domanda, la via più facile da prendere è pensare che ho commesso qualche errore in qualche altra parte del codice e che il problema è in realtà non esistente. E mi spiace, non ho abbastanza crediti o punti o cose per alzare la tua risposta. – user1182735

1

Da documentazione Aspose:

AsposeWordsPrintDocument awPrintDoc = new AsposeWordsPrintDocument(doc); 
awPrintDoc.PrinterSettings = printDlg.PrinterSettings; 

così sembra che è possibile passare TUO PrinterSettings modificati oggetto al documento parola che si sta tentando di stampare. Potresti dirmi se funziona?

+0

Ciao Steve, il risultato è lo stesso. Vengono considerate solo le impostazioni di printDialog. Non le modifiche manuali. Ora seguo un approccio diverso e converto tutti i documenti in xps (con Aspose), li uniamo in un unico xps e quindi stampo questo xps (o le pagine selezionate) usando il printdialog wpf. – user1182735