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

Okno właściwości drukarki

dział ogólny

Okno właściwości drukarki

Nowy postprzez Mironas » wtorek, 2 października 2018, 10:01

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.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 430
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder XE
TMS Components Pack
    WindowsChrome

Re: Okno właściwości drukarki

Nowy postprzez polymorphism » wtorek, 2 października 2018, 10:29

Nie wiem, czy to coś da, ale wywołaj funkcją ShellExecute taką wiązankę RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry /p /n "Nazwa drukarki".
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2168
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Okno właściwości drukarki

Nowy postprzez lukagrom » czwartek, 4 października 2018, 09:09

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;
 
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Okno właściwości drukarki

Nowy postprzez Mironas » czwartek, 4 października 2018, 12:55

@ 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);
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 430
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder XE
TMS Components Pack
    WindowsChrome

Re: Okno właściwości drukarki

Nowy postprzez Cyfrowy Baron » sobota, 6 października 2018, 11:23

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4724
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 443
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Okno właściwości drukarki

Nowy postprzez polymorphism » sobota, 6 października 2018, 14:33

@Mironas, w jaki sposób drukujesz (w sensie to jakaś kontrolka, czy sam składasz wydruk używając kontekstu)?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2168
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox

Re: Okno właściwości drukarki

Nowy postprzez Mironas » poniedziałek, 8 października 2018, 12:07

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, ...
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 430
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder XE
TMS Components Pack
    WindowsChrome

Re: Okno właściwości drukarki

Nowy postprzez polymorphism » poniedziałek, 8 października 2018, 12:49

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...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2168
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości

cron