@ 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:
// 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(...):
// 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);