[C#] Printermarges bepalen

Pagina: 1
Acties:

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Hallo,

Ik ben bezig met een C# project waarbij er overzichten afgedrukt moeten worden. Om zo optimaal mogelijk gebruik te maken van het papier wil ik de maximale marges van de gekozen printer bepalen. Ik heb de volgende code maar dit lijkt niet te werken.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Runtime.InteropServices;

namespace Calculatie.Library
{
    public class PrinterBounds
    {
        [DllImport("gdi32.dll")]
        private static extern Int32 GetDeviceCaps(IntPtr hdc, Int32 capindex);

        private const int PHYSICALOFFSETX = 112;
        private const int PHYSICALOFFSETY = 113;

        public readonly Rectangle Bounds;
        public readonly int HardMarginLeft;
        public readonly int HardMarginTop;

        public PrinterBounds(PrintPageEventArgs e)
        {
            IntPtr hDC = e.Graphics.GetHdc();

            HardMarginLeft = GetDeviceCaps(hDC, PHYSICALOFFSETX);
            HardMarginTop = GetDeviceCaps(hDC, PHYSICALOFFSETY);

            e.Graphics.ReleaseHdc(hDC);

            HardMarginLeft = (int)(HardMarginLeft * 100.0 / e.Graphics.DpiX);
            HardMarginTop = (int)(HardMarginTop * 100.0 / e.Graphics.DpiY);

            Bounds = e.MarginBounds;

            Bounds.Offset(-HardMarginLeft, -HardMarginTop);
        }
    }
}

Dit wordt aangeroepen met de volgende code:
C#:
1
2
3
4
5
6
7
8
9
10
PrinterBounds objBounds = new PrinterBounds(ev);

Rectangle r = objBounds.Bounds;

float leftMargin = r.Left;;
float rightMargin = r.Right;
float topMargin = r.Top;
float bottomMargin = r.Bottom;
float docWidth = r.Width;
float docHeight = r.Height;

Als ik de marges uit PrintPageEventArgs met MarginBounds probeer te halen blijft de marge bij iedere printer gelijk (bij bovenstaande code ook).

Ik maakt trouwens een PrintDocument aan om afdrukken te maken.

Wie weet een methode waarmee de echte marge van een printer bepaald kan worden?

Modbreak:Is jou niet al vaker verteld dat schoppen pas mag na 24 uur? Je topic stond nog gewoon in te topiclisting hoor.

[ Voor 4% gewijzigd door NMe op 13-03-2006 10:22 ]


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Sorry voor de snelle schop...

Misschien weet nu iemand iets?

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

ik heb zelf ook een keer wat documenten moeten printen in c#, en dat was geen pretje.
Je kan niet zomaar de margins uitlezen en daar mee werken... ze verschillen per printer (zelfs van hetzelfde type!)

ik moest de marges in de database opslaan, en gewoon lomp testen wat goed is.

  • barfieldmv
  • Registratie: Maart 2004
  • Laatst online: 10-10-2025
CaptBiele schreef op woensdag 15 maart 2006 @ 14:15:
ik heb zelf ook een keer wat documenten moeten printen in c#, en dat was geen pretje.
Je kan niet zomaar de margins uitlezen en daar mee werken... ze verschillen per printer (zelfs van hetzelfde type!)

ik moest de marges in de database opslaan, en gewoon lomp testen wat goed is.
Zelf heb ik ook een printje gemaakt, op mijn werk getest met 3 verschillende printers. Je kan al raden wat er bij de klant gebeurde.

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Is er uberhaubt een manier om dit uit te lezen?

Word geeft bijvoorbeeld een foutmelding als je buiten de marges van je printer zit. Hij moet dit toch ook uit lezen? Wie heeft de source van Word? :)

Nee, serieus, wie weet iets meer van dit 'probleem'?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Bedankt maar dat artikel heeft weinig mijn probleem te maken.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Slagroom schreef op vrijdag 17 maart 2006 @ 12:32:
Bedankt maar dat artikel heeft weinig mijn probleem te maken.
Daar wordt ook gesproken over PageBounds en MarginBounds; heb je daar niets aan?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Nee, die pakken bij iedere printer de zelfde marges.

  • pietervl
  • Registratie: Februari 2002
  • Nu online
Of het in C# zelf kan weet ik niet maar via een p/invoke op de GetDeviceCaps API kan je de PhysicalOffsetX en PhysicalOffsetY opvragen...

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Heb je hier iets aan? (Delphi maar eenvoudig om te zetten).
Zie halverwege pagina.

[ Voor 9% gewijzigd door Icelus op 18-03-2006 23:13 ]

Developer Accused Of Unreadable Code Refuses To Comment


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Haal dat readonly eens weg?

C#:
1
2
public readonly int HardMarginLeft; 
public readonly int HardMarginTop; 

[ Voor 104% gewijzigd door Mastermind op 19-03-2006 02:01 ]


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Bedankt maar helaas lijkt niets te werken...

Het moet toch kunnen lijkt me!

  • St-Bun
  • Registratie: November 2000
  • Laatst online: 18-02 18:29
Ik had hetzelfde probleem. Ik heb de code iets aangepast, de offset (X en Y) wordt nu goed aangepast en de width & height ook (die werden niet berekend).

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class PrinterBounds
    {
        [DllImport("gdi32.dll")] private static extern Int32 
            GetDeviceCaps(IntPtr hdc, Int32 capindex);

        private const int HORZRES         = 8;
        private const int VERTRES         = 10;
        private const int PHYSICALOFFSETX = 112;
        private const int PHYSICALOFFSETY = 113;        

        public Rectangle Bounds;
        public readonly int HardMarginLeft;
        public readonly int HardMarginTop;
        public readonly int HardMarginRight;
        public readonly int HardMarginBottom;

        public PrinterBounds(PrintPageEventArgs e)
        {
            IntPtr hDC = e.Graphics.GetHdc();

            HardMarginLeft = GetDeviceCaps(hDC, PHYSICALOFFSETX);
            HardMarginTop = GetDeviceCaps(hDC, PHYSICALOFFSETY);            
            HardMarginRight = GetDeviceCaps(hDC, HORZRES);          
            HardMarginBottom = GetDeviceCaps(hDC, VERTRES);                     

            e.Graphics.ReleaseHdc(hDC);

            HardMarginLeft = (int)(HardMarginLeft * 100.0 / e.Graphics.DpiX);           
            HardMarginTop = (int)(HardMarginTop * 100.0 / e.Graphics.DpiY);
            HardMarginRight = (int)((HardMarginLeft + HardMarginRight) * 100.0 / e.Graphics.DpiX);
            HardMarginBottom = (int)((HardMarginTop + HardMarginBottom) * 100.0 / e.Graphics.DpiY);         

            Bounds = e.MarginBounds;                        

            Bounds.X = HardMarginLeft;
            Bounds.Y = HardMarginTop;           
            Bounds.Width = HardMarginRight-HardMarginLeft;
            Bounds.Height = HardMarginBottom-HardMarginTop;                 
        }
    } 

O dus


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Dat is hem! Al heb ik zojuist een eenvoudiger versie gevonden namelijk:

C#:
1
2
3
4
5
6
Rectangle r = new Rectangle(
    (int)ev.PageSettings.PrintableArea.Y, 
    (int)ev.PageSettings.PrintableArea.X,
    (int)ev.PageSettings.PrintableArea.Height - (int)ev.PageSettings.PrintableArea.Y,
    (int)ev.PageSettings.PrintableArea.Width - (int)ev.PageSettings.PrintableArea.X
    );


Hiermee haal je ook de juiste bounds op. Alleen is het probleem dat hij de maten niet omdraait in landscape mode. In bovenstaande code heb ik de width, height, x en de y dan ook omgedraaid.

Ook moest ik de x en de y nog van de width en de height aftrekken om niet buiten de bounds te printen. Bij de code van st-bun moest dat ook nog (bij mij in ieder geval).

Bedankt, het probleem is zo opgelost!
Pagina: 1