c# drukowanie z wyśrodkowaniem

0

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

 
        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ć...

0

poniżej poprawiony kod:

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

0

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

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);
			

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...)

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.