CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Okno właściwości drukarki
Strona 1 z 1

Okno właściwości drukarki

Nowy postNapisane: wtorek, 2 października 2018, 10:01
przez Mironas
Robię własne okno dialogowe wydruku i oprócz wyboru drukarki (i innych opcji) chciałbym dodać przycisk otwierający okno właściwości wybranej drukarki.

Poniższy kod, otwiera takie okno, ale zmiany dokonywane w tym oknie, nie mają wpływu na wydruk.
KOD cpp:     UKRYJ  
  WCHAR* pPrinter = ComboBox1->Text.w_str();
  SHInvokePrinterCommand(Handle, PRINTACTION_DOCUMENTDEFAULTS, pPrinter, NULL, 1);
 


W porównaniu do okna właściwości otwieranego ze standardowego PrintDialogu (albo z innych aplikacji) jest też inny tytuł okna:
Otwierane z TPrintDialog: Właściwości: NazwaDrukarki
Otwierane z powyższego kodu: Preferencje drukowania: NazwaDrukarki
Poza tym te okna niczym się nie różnią.

Według dokumentacji funkcja SHInvokePrinterCommand jest passe i należy stosować IContextMenu lub ShellExecute ale nie znalezłem przykładu, jak za pomocą tych funkcji otwierać właściwości drukarki.

Re: Okno właściwości drukarki

Nowy postNapisane: wtorek, 2 października 2018, 10:29
przez polymorphism
Nie wiem, czy to coś da, ale wywołaj funkcją ShellExecute taką wiązankę RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry /p /n "Nazwa drukarki".

Re: Okno właściwości drukarki

Nowy postNapisane: czwartek, 4 października 2018, 09:09
przez lukagrom
Znalezione, może się przyda, tylko naturalnie wymaga przekształceń, bo napisane w Delphi.
KOD cpp:     UKRYJ  
uses shellapi, printers;
procedure PrintDocument(const documentToPrint : string) ;
var
printCommand : string;
printerInfo : string;
Device, Driver, Port: array[0..255] of Char;
hDeviceMode: THandle;
begin
if Printer.PrinterIndex = cboPrinter.ItemIndex then
begin
printCommand := 'print';
printerInfo := '';
end
else
begin
printCommand := 'printto';
Printer.PrinterIndex := cboPrinter.ItemIndex;
Printer.GetPrinter(Device, Driver, Port, hDeviceMode) ;
printerInfo := Format('"%s" "%s" "%s"', [Device, Driver, Port]) ;
end;
ShellExecute(Application.Handle, PChar(printCommand), PChar(documentToPrint), PChar(printerInfo), nil, SW_HIDE) ;
end;
 

Re: Okno właściwości drukarki

Nowy postNapisane: czwartek, 4 października 2018, 12:55
przez Mironas
@ lukagrom
Mi chodzi o otwarcie okna właściwości drukarki a nie wydrukowanie pliku.

polymorphism napisał(a):Nie wiem, czy to coś da, ale wywołaj funkcją ShellExecute taką wiązankę RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry /p /n "Nazwa drukarki".

To wywołanie otwiera "inne" okno właściwości (zawierające zakładki: Ogólne, Udostępnianie, Portyy, Zaawansowane, ...) niż okno właściwości otwierane z TPrintDialog-u (które zawiera zakładki: Układ, Papier/jakość i ew. zakładki specyficzne dla wybranej drukarki).

Poprawne okno właściwości otwiera funkcja DocumentProperties(...) z parametrem DM_IN_PROMPT.
Jednak tu się pojawia problem nr 1, bo zanim się ją zastosuje trzeba pobrać AKTUALNE ustawienia drukarki, a u mnie ta funkcja (wywołana z parametrem DM_OUT_BUFFER) pobiera DOMYŚLNE i GLOBALNE ustawienia drukarki. Tutaj kod:
KOD cpp:     UKRYJ  
  // pDevice - nazwa drukarki
  WCHAR* pDevice = ComboBox1->Text.w_str();

  // hPrinter - uchwyt do drukarki
  HANDLE hPrinter;
  OpenPrinter(pDevice, &hPrinter, NULL);

  // Struktura LPDEVMODE na właściwości drukarki
  DWORD dwNeeded = DocumentProperties(Handle, hPrinter, pDevice, NULL, NULL, 0);
  LPDEVMODE pDevMode = (LPDEVMODE)malloc(dwNeeded);

  // DM_OUT_BUFFER - Pobiera DOMYŚLNE właściwości drukarki >> pDevMode
  DocumentProperties(NULL, hPrinter, pDevice, pDevMode, NULL, DM_OUT_BUFFER);

  // DM_IN_PROMPT - Pokaż okno właściwości drukarki, zmiany zapisuje do pDevMode
  DocumentProperties(Handle, hPrinter, pDevice, pDevMode, pDevMode, DM_IN_BUFFER | DM_IN_PROMPT | DM_OUT_BUFFER);

  // Tutaj należałoby przepisać ustawienia z 'pDevMode' do ustawień drukarki. Funkcja SetPrinter ???

  ClosePrinter(hPrinter);
  free(pDevMode);
 


Do zapisania zmian teoretycznie powinno się użyć funkcji SetPrinter(...) ale tutaj pojawia się problem nr 2 bo ta funkcja (przynajmniej u mnie) zmienia GLOBALNE DOMYŚLNE ustawienia danej drukarki w całym systemie (dla wszystkich aplikacji). A ja chciałbym aby zmiany ustawień działały tylko lokalnie w danej aplikacji.
Tutaj zmieniony kod zawierający SetPrinter(...):
KOD cpp:     UKRYJ  
  // UWAGA - Zmienia SYSTEMOWE, GLOBALNE i DOMYŚLNE ustawienia danej drukarki !!!

  // pDevice - nazwa drukarki
  WCHAR* pDevice = ComboBox1->Text.w_str();

  // hPrinter - uchwyt do drukarki
  HANDLE hPrinter;
  OpenPrinter(pDevice, &hPrinter, NULL);

  DWORD dwNeeded = 0;
  GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);

  // Struktura PRINTER_INFO_2
  PRINTER_INFO_2* PI2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR,dwNeeded);
  GetPrinter(hPrinter, 2, (LPBYTE)PI2, dwNeeded, &dwNeeded);

  // DM_IN_PROMPT - Pokaż okno właściwości drukarki
  DocumentProperties(Handle, hPrinter, pDevice, PI2->pDevMode, PI2->pDevMode, DM_IN_BUFFER | DM_IN_PROMPT | DM_OUT_BUFFER);

  SetPrinter(hPrinter, 2, (LPBYTE)PI2, 0);

  ClosePrinter(hPrinter);
  GlobalFree(PI2);
 

Re: Okno właściwości drukarki

Nowy postNapisane: sobota, 6 października 2018, 11:23
przez Cyfrowy Baron
Jak rozumiem chciałbyś przywołać opcje drukowania tak jak to robi np. program WORD, który zapamiętuje opcje drukowania dla każdego dokumentu indywidualnie. Z tego co mi wiadomo, to takie ustawienia indywidualne Word zapisuje w pliku, a przywołując okno właściwości drukowania dla danego pliku, wywołuje to okno właściwości z takimi parametrami jakie zostały w takim pliku zapisane i stosuje je we właściwościach drukowania, bez zmieniania ustawień domyślnych.
Problem więc sprowadza się do zapisania gdzieś indywidualnych ustawień drukowania dla danego pliku, potem przed wywołaniem okna właściwości trzeba by te ustawienia indywidualne odczytać i wywołać okno drukowania z tymi indywidualnymi parametrami.
Nigdy tego nie próbowałem.

Re: Okno właściwości drukarki

Nowy postNapisane: sobota, 6 października 2018, 14:33
przez polymorphism
@Mironas, w jaki sposób drukujesz (w sensie to jakaś kontrolka, czy sam składasz wydruk używając kontekstu)?

Re: Okno właściwości drukarki

Nowy postNapisane: poniedziałek, 8 października 2018, 12:07
przez Mironas
Cyfrowy Baron napisał(a):Jak rozumiem chciałbyś przywołać opcje drukowania tak jak to robi np. program WORD, który zapamiętuje opcje drukowania dla każdego dokumentu indywidualnie.

Nie.
Jak pisałem - chcę zrobić własne okno dialogowe wydruku (taki własny TPrintDialog) tylko lepszy niż standardowy, ładniejszy i z podglądem wydruku.
W tym oknie chciałbym mieć m.in. przycisk WŁAŚCIWOŚCI - do zmiany właściwości danej drukarki. Te zmiany powinny dotyczyć tylko i wyłącznie działania drukarki w tym programie, i tylko w tej sesji (ustawienia wspólne dla wszystkich dokumentów).

Inaczej mówiąc:
  • Zmiany nie są widoczne w innych programach.
  • Jak ponownie uruchamiam program, to znowu mam domyślne ustawienia drukarki (nie trzeba nic zapisywać w pliku).
  • Jak jednocześnie uruchomię dwie kopie tego samego programu, to w każdej z nich drukarka może mieć inne ustawienia.

Czyli powinno działać dokładnie tak samo, jak bym użył standardowy TPrintDialog w którym też jest przycisk WŁAŚCIWOŚCI.


polymorphism napisał(a):w jaki sposób drukujesz (w sensie to jakaś kontrolka, czy sam składasz wydruk używając kontekstu)?

FastReport 5
Do podglądu wydruku frxPreview.

Tutaj pojawia się kolejny problem (teraz dopiero zauważyłem) bo FastReport ignoruje właściwości drukarki ustawione w TPrintDialog-u. Można co najwyżej po przed wydrukiem wywołać jego własne okno drukowanie, gdzie jest przycisk PROPERTIES...

To już chyba w ogóle zrezygnuję z wywoływania właściwości drukarki i zostanę tylko przy minimalnych opcjach wydruku - ilość kopii, sortowanie, zakres stron wydruku, ...

Re: Okno właściwości drukarki

Nowy postNapisane: poniedziałek, 8 października 2018, 12:49
przez polymorphism
Te ustawienia dla jednego wydruku to się ustawia, o ile się nie mylę, przy tworzeniu kontekstu drukarki. Stąd moje pytanie. No ale jeśli to kontrolka, to sprawa raczej się komplikuje...