Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.06.2007, 19:40

[C#] Image von einem Form bekommen

Hi leutz,

ich schreibe gerade ein Programm in C# um Rechnungen für eine Firma zu drucken.
Das mit dem Rechnungsgenerieren u.s.w klappt alles, aber ich will die auf einem Form generierte Rechnungs ausdrucken. Als erstes hat mir jemand geraten mir den DC zu holen und es mit bitBlt in eine bitmap zu packen, das ist aber unnötig kompliziert, da jemand anderes mit im ICQ gesagt hat, es existiere eine Methode mit der man ein Image von einem Form bekommen kann aber er wüsste den Namen nicht mehr. Also hab ich nach dieser Methode gesucht aber nix gefunden. Weiß jemand zufällig den Namen dieser Methode, dass würde mir ein schönes Stück Arbeit ersparen!

Schon mal danke für eure Hilfe!
»TheProgrammer«
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

2

21.06.2007, 20:13

BitBlt ist sinnlos.
Schau dir mal die Funktion PageGDICalls() an.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

21.06.2007, 21:01

Zitat von »"ChrisJ"«

BitBlt ist sinnlos.
Schau dir mal die Funktion PageGDICalls() an.


Wieso sollte das sinnlos sein?
@D13_Dreinig

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

4

21.06.2007, 21:05

Nicht grade sinnlos, aber funktioniert nicht bei allen druckern.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

21.06.2007, 21:22

Soll ja auch nicht mit dem Drucker funktionieren! :-P Soll mit einem Device Context auf ein Image Objekt funktionieren.

Easy, einfach ne PrintDocument Componente ins Projekt einfügen und los gehts:

C-/C++-Quelltext

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
[ System.Runtime.InteropServices.DllImportAttribute( "gdi32.dll" ) ]
        private static extern bool BitBlt( IntPtr hdcDest, 
            int nXDest, 
            int nYDest, 
            int nWidth, 
            int nHeight, 
            IntPtr hdcSrc, 
            int nXSrc, 
            int nYSrc, 
            System.Int32 dwRop ); 

        private void button1_Click(object sender, System.EventArgs e)
        {
            PrintDialog foo = new PrintDialog();
            foo.Document = printDocument1;
            DialogResult res = foo.ShowDialog();

            if ( res == DialogResult.OK )
            {
                printDocument1.Print();
            }
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Graphics graphicsSrc = this.CreateGraphics();
            Image image = new Bitmap( this.Size.Width, this.Size.Height );
            Graphics graphicsDst = Graphics.FromImage( image );

            IntPtr srcDC = graphicsSrc.GetHdc();
            IntPtr dstDC = graphicsDst.GetHdc();

            BitBlt( dstDC, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, srcDC, 0, 0, 13369376 );

            graphicsSrc.ReleaseHdc( srcDC );
            graphicsDst.ReleaseHdc( dstDC );

            e.Graphics.DrawImage( image, 0, 0 );
        }
@D13_Dreinig

6

23.06.2007, 10:43

@David_pb vielen dank!
Aber ich habe heute morgen eine Methode gefunden bei der mir das BitBlt() erspart bleibt:

C-/C++-Quelltext

1
Form.drawToBitmap();


Das klappt jetzt auch wunderbar, aber es werden nur gezeichnete Dinge aber keine Steuerelemente gedruckt. Ich finde aber bei Steuerelementen keine Eigenschaft wie printable.
Weiß jemand von euch wie man einstellen kann dass auch Steuerelemente gedruckt werden?

Schonmal vielen dank!
»TheProgrammer«
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

23.06.2007, 12:36

Garnicht.
@D13_Dreinig

8

23.06.2007, 13:00

werden bei deiner Methode von oben die Steuerelemente eigentlich miterfasst?
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

9

23.06.2007, 15:01

Ja werden sie, es klappt jetzt auch alles wunderbar, aber ich hab ein scheinbar unlöses Problem denn ich hab auf meinem ausgedruckten Blatt auch den Druckdialog!
Mit refreshen hab ichs schon probiert!

Kann mir jemand helfen, es wäre wichtig!

Vielen dank
»TheProgrammer«
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

23.06.2007, 15:56

Am Anfang noch:

C-/C++-Quelltext

1
2
this.Invalidate();
this.Refresh();
@D13_Dreinig

Werbeanzeige