Pregunta

Estoy tratando de modificar el objeto System.Drawing.printing.PrintSettings que obtengo del sistema.windows.forms.printDialog Una vez que se ha mostrado el cuadro de diálogo al usuario. Aunque soy capaz de cambiar los valores de la propiedad en el objeto de las impresoras, ninguno de los cambios que hago después de que se haya mostrado el cuadro de diálogo se muestra en realidad cuando se imprime un documento.

Aquí hay un ejemplo de lo que quiero decir:

//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;

Ahora use el objeto de impresoras para imprimir. Utilizo la DLL de la tercera parte, Aspose.words para esto, ya que necesito imprimir palabra, pero esto parece no ser el problema. Parece que después de que se ha demostrado que el diálogo se ha demostrado que todas las configuraciones ya se han comprometido con la impresora y cambiar las impresoras que no alcanzan nada. ¿Alguna idea sobre cómo hacer que esto funcione?

Editar: Tengo algunas soluciones para esto. Lo que quiero aquí es obtener una respuesta a estas preguntas específicas: ¿es posible cambiar el objeto de las impresoras después de que se haya mostrado el cuadro de diálogo y se encuentran estos cambios considerados en la impresión? Si alguien sabe solo una forma de que esto puede funcionar (puede decidir qué API desea usar para imprimir, no importa siempre que se use el objeto de las impresoras), estaría muy agradecido.

¿Fue útil?

Solución

No estoy seguro de por qué su pregunta obtuvo un voto por abajo, parezca bastante razonable para mí ????

de todos modos, algunas cosas que he notado con PrintDialog (que puede o no responder su pregunta).

Lo primero es que es solo una clase de envoltura para el diálogo de Windows COM.

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

y segundo, y lo más importante con referencia a su pregunta, supongo: La clase PrintDialog tiene esta rutina que se llama después del cierre de la llamada PrintDLG

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); 
    }

También hay una interacción bastante interesante aquí (teniendo en cuenta que establece impresorsettings.topage):

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

y luego

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

No es una respuesta directa que sé, pero creo que debería apuntarte en la dirección correcta de por qué no funciona. Me parece que durante el uso del diálogo, felizmente puede anular la configuración de los cambios en los cambios, ya que se recreará al finalizar, pero cuando se complete el diálogo, cambiar la configuración realmente invalida la configuración de impresión de documentos hasta que se configure nuevamente. Puede ser posible hacer esto manualmente, o puede ser loch \ Ked por M $ en la forma habitual interna / privada, muchos internales son.

Hay una opción, por supuesto, (no es tan agradable que sé) para usar la API de WIN Diaply después de que el código de llamada podría ser húmedo de los Dialgues anteriores para crear su propia envoltura si es necesario.

buena suerte.

Otros consejos

de la documentación de ASPOSE:

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

Por lo tanto, parece que puede pasar el objeto de las impresoras modificadas de YUOR al documento de Word que está intentando imprimir.¿Podrías decirme si esto funciona?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top