2012-03-14 18 views
5

Próbuję zmodyfikować obiekt System.Drawing.Printing.PrinterSettings, który otrzymuję z System.Windows.Forms.PrintDialog po wyświetleniu okna dialogowego użytkownikowi. Chociaż mogę zmienić wartości właściwości w obiekcie PrinterSettings, żadna ze zmian, które wprowadzę po wyświetleniu okna dialogowego, nie jest faktycznie brana pod uwagę przy drukowaniu dokumentu.Modyfikowanie ustawień drukarki po wyświetleniu komunikatu PrintDialog

Oto przykład tego, co mam na myśli:

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

teraz używać printerSettings obiekt do drukowania. Używam 3rd Party DLL Aspose.Words do tego, ponieważ muszę wydrukować Word, ale to nie wydaje się być problemem. Wygląda na to, że po wyświetleniu okna dialogowego wszystkie ustawienia zostały już zatwierdzone w drukarce, a zmiana ustawień drukarki nic nie daje. Jakieś pomysły, jak to uruchomić?

EDYCJA: Mam kilka obejść tego. Chcę tutaj uzyskać odpowiedź na następujące pytania: Czy jest możliwe zmienić obiekt PrinterSettings po wyświetleniu okna dialogowego i czy zmiany te zostały uwzględnione podczas drukowania. Jeśli ktoś wie tylko jeden sposób, w jaki sposób to działa (możesz zdecydować, jakiego interfejsu API chcesz użyć do drukowania, nie ma to znaczenia, dopóki jest używany obiekt PrinterSettings), byłbym bardzo wdzięczny.

+0

Jakieś powody, dla których nie zmieniasz ustawień przed otwarciem okna dialogowego? –

+0

Tak, w mojej aplikacji mam "dokumenty scalone", które składają się z wielu różnych dokumentów. W oknie dialogowym drukowania powinny pojawić się jako jeden dokument, ale do drukowania muszę je obsługiwać indywidualnie. Mówiąc dokładniej: niektóre ustawienia PrinterSettings powinny dotyczyć wszystkich dokumentów, inne muszę ustawić dla każdego dokumentu indywidualnie. Poszczególne właściwości/ustawienia, które mogę obliczyć bez interakcji użytkownika, ale do drukowania, muszę wprowadzić je do ustawień drukarki. – user1182735

+0

Z opisu nie wynika jasno, w jaki sposób obiekt PrinterSettings jest stosowany do faktycznego zadania drukowania. Brak tych elementów w kodzie wyjaśnia przyczynę problemu. –

Odpowiedz

2

Nie jestem pewien, dlaczego Twoje pytanie zostało odrzucone, wydaje mi się to całkiem rozsądne?

W każdym razie, kilka rzeczy zauważyłem z PrintDialog (który może lub nie może odpowiedzieć na twoje pytanie).

Po pierwsze, jest to tylko klasa wrapper dla dialogu Windows Comm.

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

i drugie, i najważniejsze w odniesieniu do kwestionujesz Chyba: Klasa PrintDialog ma tę rutynę, która jest wywoływana po zamknięciu PrintDlg zadzwonić

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

Jest też bardzo ciekawe współgranie tutaj (pamiętając o ustawieniu PrinterSettings.ToPage):

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

a następnie

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

Nie bezpośrednią odpowiedź znam, ale Myślę, że powinien wskazać ci właściwy kierunek, dlaczego nie działa. Wydaje mi się, że podczas używania dialogu może on z przyjemnością anulować ustawienia zmian, ponieważ zostaną one odtworzone po zakończeniu, ale kiedy Dialog zostanie zakończony, zmiana ustawień faktycznie unieważnia ustawienia drukowania dokumentu, dopóki nie zostanie ponownie ustawiona. Możliwe, że można to zrobić ręcznie, lub może to być Loch \ Ked by M $ w zwykły sposób wewnętrzny/prywatny, jakimi jest wiele wewnętrznych elementów.

Jest oczywiście opcja (nie tak miła, jak mi wiadomo), aby używać interfejsu API Win po wywołaniu - kod mógł zostać przeniesiony z powyższych numerów, aby w razie potrzeby utworzyć własne opakowanie.

Powodzenia.

+0

Nie sprawdzałem tego przez chwilę i dlatego jestem trochę spóźniony z moją powtórką: Dziękuję bardzo. – user1182735

+0

I przy okazji. Sądzę, że to pytanie zostało odrzucone, ponieważ niektórzy ludzie na tej stronie mają tendencję do nieuwzględniania prawdziwego problemu i treści pytania. Nie są skłonni przyznać, że autor ma więcej niż tylko superfikcyjną koncepcję programowania. W odniesieniu do tego pytania łatwą drogą do podjęcia jest myślenie, że popełniłem jakiś błąd w jakiejś innej części kodu, a kwestia ta nie istnieje. I przepraszam, nie mam wystarczających kredytów ani punktów, ani niczego, co pozwoliłoby ci odpowiedzieć na twoją odpowiedź. – user1182735

1

Z dokumentacji Aspose:

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

Więc wydaje się, że można przekazać yuor zmodyfikowane PrinterSettings sprzeciw wobec dokumentu tekstowego, który próbujesz wydrukować. Czy możesz mi powiedzieć, czy to działa?

+0

Witaj, Steve, wynik jest taki sam. Uwzględniane są tylko ustawienia z printDialog. Nie ręczne zmiany. Teraz stosuję inne podejście i konwertuję wszystkie dokumenty do formatu xps (z Aspose), łączę je w jeden xps, a następnie wypisz jeden xps (lub wybrane strony) za pomocą wpf printdialog. – user1182735

Powiązane problemy