CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Zmiana rozmiaru strony

Zmiana rozmiaru strony

dział ogólny

Zmiana rozmiaru strony

Nowy postprzez Mironas » wtorek, 2 grudnia 2014, 14:33

Jak programowo zmienić rozmiar strony dla domyślnej (aktualnie wybranej) drukarki?
Chodzi o zrobienie tego samego co mogę ręcznie zrobić w dialogu PageSetupDialog, opcja Papier/Rozmiar.

Orientację strony mogę zmienić tak:
KOD cpp:     UKRYJ  
Printer()->Orientation = poLandscape;

Jednak rozmiaru strony już się tak nie da bo są tylko do odczytu:
KOD cpp:     UKRYJ  
  Printer()->PageWidth = szerokosc;
  Printer()->PageHeight = wysokosc;
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Zmiana rozmiaru strony

Nowy postprzez Cyfrowy Baron » wtorek, 2 grudnia 2014, 17:13

Funkcja Skaluj dostępna w ustawieniach drukarki nie skaluje strony, lecz skaluje elementy przesłane do drukowania. Klasa TPrinter nie posiada funkcji pozwalającej sterować tą funkcją, więc programowo to możesz przeskalować to co chcesz wydrukować przed przesłaniem tego do drukarki. Skalowanie trzeba realizować poprzez odczytanie właśnie właściwości PageWidth i PageHeight. W przypadku tekstu trzeba skorzystać ze struktury LOGFON. Poczytaj sobie tutaj: http://programowanie.cal.pl/cyfbar/print.html
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Zmiana rozmiaru strony

Nowy postprzez Mironas » środa, 3 grudnia 2014, 11:33

Chyba się nie rozumiemy.
Nie chcę niczego skalować ani drukować.

Chcę programowo zmienić domyślny rozmiar strony dla domyślnej drukarki.

Czyli chcę osiągnąć taki sam efekt jak "na piechotę" mogę mieć przez otwarcie okna PageSetupDialog i zmianę rozmiaru papieru np z A4 na A3. Po tej operacji w Printer()->PageWidth/PageHeight mam prawidłowe wymiary wybranej strony, a w innych oknach dialogowych otwieranych w programie mam prawidłowo wybraną stronę (A3). Taki i tylko taki efekt chcę osiągnąc, ale bez ręcznego otwierania PageSetupDialog.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Zmiana rozmiaru strony

Nowy postprzez Cyfrowy Baron » środa, 3 grudnia 2014, 17:53

Rzeczywiście, źle cię zrozumiałem. Próbowałem kodu z tej strony: http://www.codeproject.com/Articles/132365/Configuring-Printer-Settings-Programmatically, ale u mnie to jakoś nie zadziałało i nie zmieniała się strona w drukarce z A4 na A3.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Zmiana rozmiaru strony

Nowy postprzez Mironas » czwartek, 4 grudnia 2014, 14:04

Problem rozwiązany. Inspirację co ciekawe znalazłem na forum:
Zmiana formatu wydruku

Dla potomnych (ewentualnie dla tych którzy by chcieli poprawić kod):

KOD cpp:     UKRYJ  
// Pobierz parametry strony
void TForm1::PobierzParametryStrony(int &PaperSize, int &Orientation)
{
  WCHAR cDevice[1024], cDriver[1024], cPort[1024];
  THandle hDeviceMode;
  PDeviceMode DevMode;

  Printer()->GetPrinter(cDevice, cDriver, cPort, hDeviceMode);
  DevMode =(_devicemodeW*) GlobalLock((void*)hDeviceMode);

  PaperSize   = DevMode->dmPaperSize;   // DMPAPER_A3, DMPAPER_A4, DMPAPER_A5, ...
  Orientation = DevMode->dmOrientation; // DMORIENT_PORTRAIT, DMORIENT_LANDSCAPE

  GlobalUnlock((void*)hDeviceMode);
}
//---------------------------------------------------------------------------
// Ustaw parametry strony
void TForm1::UstawParametryStrony(int PaperSize, int Orientation)
{
  WCHAR cDevice[1024], cDriver[1024], cPort[1024];
  THandle hDeviceMode;
  PDeviceMode DevMode;

  Printer()->GetPrinter(cDevice, cDriver, cPort, hDeviceMode);
  DevMode =(_devicemodeW*) GlobalLock((void*)hDeviceMode);

  DevMode->dmFields = DevMode->dmFields | DM_PAPERSIZE;
  DevMode->dmFields = DevMode->dmFields | DM_ORIENTATION;

  DevMode->dmPaperSize    = PaperSize;    // DMPAPER_A3, DMPAPER_A4, DMPAPER_A5, ...
  DevMode->dmOrientation  = Orientation;  // DMORIENT_PORTRAIT, DMORIENT_LANDSCAPE

  Printer()->SetPrinter(cDevice, cDriver, cPort, hDeviceMode);
  GlobalUnlock((void*)hDeviceMode);
}
//---------------------------------------------------------------------------
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome


  • 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 9 gości