c# drukowanie z wyśrodkowaniem

c# drukowanie z wyśrodkowaniem
hasfarantabolis
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Ma ktoś pomysł jak wydrukować np linie ale wyśrodkowane na kartce?

Kopiuj
 
        using (PrintDialog pd = new PrintDialog())
        {
            if (pd.ShowDialog() != DialogResult.OK) return;
            PrintDocument document = new PrintDocument();
            document.PrinterSettings = pd.PrinterSettings;
            document.PrintPage += new PrintPageEventHandler(Document_PrintPage);
            document.Print();
        }

        private void Document_PrintPage(object sender, PrintPageEventArgs e)
        {
            int X = (int)e.PageSettings.PrintableArea.X;
            int Y = (int)e.PageSettings.PrintableArea.Y;
            int width = (int)e.PageSettings.PrintableArea.Width - X;
            int height = (int)e.PageSettings.PrintableArea.Height - Y;
            int centerX = (width - X) / 2 + X;
            int centerY = (height - Y) / 2 + Y;
           
            e.Graphics.DrawRectangle(Pens.Gray, new Rectangle(X, Y, width, height));
            e.Graphics.DrawLine(Pens.Black, centerX - 100, centerY, centerX + 100, centerY);
            e.Graphics.DrawLine(Pens.Black, centerX, centerY - 100, centerX, centerY + 100);
        }

próbowałem między innymi tak, ale cały prostokąt jest przesunięty. ( próbowałem tez wyliczać w oparciu o HardMargins, MarginBounds, Margins itd. )
Programy graficzne zwykle mają opcję "drukuj wycentrowane" - więc jakoś to się musi dać zrobić...

PP
  • Rejestracja:ponad 15 lat
  • Ostatnio:3 dni
  • Lokalizacja:Bochnia
0

poniżej poprawiony kod:

Kopiuj
// wyliczenia adby od każdej krawędzi był równy
			int odstep_od_lewej = (int)Math.Max(e.PageSettings.PrintableArea.X, e.PageBounds.Width - e.PageSettings.PrintableArea.Width);
			int odstep_od_gory = (int)Math.Max(e.PageSettings.PrintableArea.Y, e.PageBounds.Height - e.PageSettings.PrintableArea.Height);
			int wymiar_krzyzyka=250;// długość jedego ramienia krzyżyka rysowanego na środku

			// wyśrodkowany obszar do rysowania
			Rectangle r = new Rectangle(odstep_od_lewej, odstep_od_gory, e.PageBounds.Width - 2 * odstep_od_lewej, e.PageBounds.Height - 2 * odstep_od_gory);

			e.Graphics.DrawRectangle(Pens.Gray, r);
			// rysowanie lini pionowej
			e.Graphics.DrawLine(Pens.Red
					, r.Left + r.Width / 2
					, r.Top + r.Height / 2 - wymiar_krzyzyka
					, r.Left + r.Width / 2
					, r.Top + r.Height / 2 + wymiar_krzyzyka);
			// rysowanie lini poziomej
			e.Graphics.DrawLine(Pens.Blue
					, r.Left + r.Width / 2 - wymiar_krzyzyka
					, r.Top + r.Height / 2
					, r.Left + r.Width / 2 + wymiar_krzyzyka
					, r.Top + r.Height / 2 );
hasfarantabolis
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Dzięki za odpowiedź.
Niestety ten kod nie daje wyśrodkowanego wydruku...
Na podglądzie wydruku - PrintPreviewDialog - wygląda to ślicznie, ale już na rzeczywistej drukarce lewy bok "r" jest około 1,5 cm od prawej strony, góra 1,1 ,a lewego i dolnego boku nie ma na wydruku.

PP
  • Rejestracja:ponad 15 lat
  • Ostatnio:3 dni
  • Lokalizacja:Bochnia
0

odrobiłem zadanie za Ciebie i potestowałem , wystarczy zmienić

Kopiuj
int twardy_margines_x = Convert.ToInt32(e.PageSettings.HardMarginX);
			int twardy_margines_y = Convert.ToInt32(e.PageSettings.HardMarginY);			
			// wyśrodkowany obszar do rysowania
			// podczas wyrzucania do podglodu w 2 powyższe zmianne wpisać jeden 
			// podczas drukowania należy wpisać wartości z twardego marginesu
			Rectangle r = new Rectangle(odstep_od_lewej - twardy_margines_x, odstep_od_gory - twardy_margines_y, e.PageBounds.Width - 2 * odstep_od_lewej, e.PageBounds.Height - 2 * odstep_od_gory);
			

hasfarantabolis
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Dzięki wielkie.
Wygląda to naprawdę dobrze, jest co prawda minimalna różnica w odległościach (ok 1mm), ale jest do zaakceptowania.
Potem jeszcze posprawdzam to dla różnych drukarek.
Jeszcze raz wielkie dzięki.
Pozdrawiam.

(spędziłem nad tym naprawdę dużo czasu...)

Azarien
tyle to wynosi niedokładność pozycjonowania papieru w drukarce...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.