[C#] Bitmaps printen

Pagina: 1
Acties:

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 19:33
Ik ben al enige tijd bezig met het maken van een programma om Autocad tekeningen te bekijken (de beschikbare gratis versies zijn voor onze doeleinden niet compleet genoeg). De applicatie is om een dll heen gebouwd die zorgt voor het uitlezen van het Autocad-bestand wat verder zonder problemen werkt.

Nu is het de bedoeling dat het programma ook kan printen en daarbij gaat het om tekeningen met meerdere bladzijden (een soort batch-printing dus). De dll werkt door van een opgegeven Autocad-bestand bitmaps te genereren. Dit werkt mooi voor het tonen op het scherm, maar bij het printen komt het er op neer dat er voor elke pagina een hele bitmap wordt geprint (ook al zijn het alleen maar een paar zwarte lijnen op een zwarte achtergrond) wat met 300DPI op A4 formaat wel te doen is, maar je moet geen haast hebben. Ik maak gebruik van de standaard System.Drawing.Printing.

Mijn eerste vraag: Is er een manier om sneller te kunnen printen (zonder in DPI achter uit te gaan) door de bitmaps te vectoriseren of te comprimeren?

Mijn tweede vraag: Omdat dit programma afwijkende printopies moet bieden dan een standaard applicatie, heb ik voor het schermpje waar je normaal kiest voor welke printer je wilt hebben en hoeveel kopieen je wilt, een nieuw schermpje gemaakt. Om verdere printerspecifieke instellingen te kunnen doen heb ik een knop "eigenschappen" welke de instellingen van de desbetreffende printer opent. .NET zelf biedt de optie niet om dit printerspecifieke scherm te openen, dus dat heb ik op de volgende manier aangeroepen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        void PrinterProperties_Click(object sender, EventArgs e)
        {
            this.pcon.DefaultPageSettings.Landscape = true;
            this.pcon.PrinterSettings.PrinterName = (string)this.PrinterSelection.SelectedItem;

            IntPtr hDevMode = this.pcon.PrinterSettings.GetHdevmode(this.pcon.PrinterSettings.DefaultPageSettings);
            IntPtr pDevMode = GlobalLock(hDevMode);
            int sizeNeeded = DocumentProperties(this.Handle, IntPtr.Zero, this.pcon.PrinterSettings.PrinterName, pDevMode, ref pDevMode, 0);
            IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
            DocumentProperties(this.Handle, IntPtr.Zero, this.pcon.PrinterSettings.PrinterName, devModeData, ref pDevMode, 14);
            GlobalUnlock(hDevMode);
            this.pcon.PrinterSettings.SetHdevmode(devModeData);
            this.pcon.PrinterSettings.DefaultPageSettings.SetHdevmode(devModeData);
            GlobalFree(hDevMode);
            Marshal.FreeHGlobal(devModeData);
        }


Dit werkt verder wel. Maar het enigste probleem wat ik hier nog mee heb is dat de ingstelde instellingen alleen geldig zijn voor één printbeurt. Wat ik zou willen is dus dat deze instellingen onthouden worden, ook als ik later nog een keer wil printen en ook als ik het programma weer opnieuw opstart.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:16

TeeDee

CQB 241

Je probleem is dus dat de specifieke settings niet opgeslagen worden? Zo ja, kijk/zoek dan eens naar App.settings / Settings.settings

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 19:33
TeeDee schreef op woensdag 18 juni 2008 @ 14:01:
Je probleem is dus dat de specifieke settings niet opgeslagen worden? Zo ja, kijk/zoek dan eens naar App.settings / Settings.settings
Die manier om variabelen op te slaan ken ik wel, maar mijn probleem is meer hoe ik uit het stuk code wat in de topicstart staat een instatie van de settingspagina kan op slaan en deze vervolgens weer in terug kan zetten als ik ze weer nodig heb.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:16

TeeDee

CQB 241

Je zou de Printersettings kunnen serializen natuurlijk.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 19:33
TeeDee schreef op woensdag 18 juni 2008 @ 14:11:
Je zou de Printersettings kunnen serializen natuurlijk.
Ik zal eerst wel even proberen om deze binnen mijn aplicatie vast te houden en daarna weer terug te zetten. Maar het staat me bij dat dat niet werkte (hele tijd terug al eens geprobeerd). Kom ik in ieder geval nog op terug.

Edit: Binnen de klasse waar de PrintProperties_Click eventhandler zit die in de startpost zit word this.pcon (waar printersettings dus weer onderdeel van is) niet opnieuw geïnitialiseerd en zouden de instellingen dus al behouden moeten zijn (lijkt mij), echter als ik weer op de settingsknop druk zijn de settings weer terug naar default (het printen gaat dan echter wel met de ingestelde isntellingen).

[ Voor 34% gewijzigd door Invisible_man op 18-06-2008 14:44 ]