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

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

1

22.08.2005, 18:26

Ableiten einer Managed Klasse (Windows Forms)

Hi,

ich will mit den Windows Forms etwas ausdrucken. Ich find leider keine Beispiele in C++ :(
Egal ich hab welche in C# gefunden. Nach denen progge ich jetzt meine Drucken Klasse. Die erstellen eine neue Klasse die von der "PrintDocument" Klasse abgeleitet ist. Das habe ich auch gemacht:

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
// Klasse die ein Teile eines Windows Forms ausdruckt


#ifndef _FormPrintDOC_H_
#define _FormPrintDOC_H_

using namespace System;
using namespace System::ComponentModel;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace System::Drawing::Printing;
using namespace System::IO;

class FormPrintDocument : public PrintDocument
{
private:
    Font *printFont           = null ;
    System::String *StringToPrint = "";

public:
    FormPrintDocument(System::String testString) : PrintDocument()
    {
        StringToPrint = testString;
    }
    virtual ~FormPrintDocument() : ~PrintDocument()
    {
        if (printFont != null)
            delete printFont;
    }

protected:
    System::void OnBeginPrint(PrintEventArgs ev);
    System::void OnPrintPage(PrintEventArgs ev);
};

#endif


Dann kommt aber folgender Compiler Fehler:
FormPrintDocument.h(14): error C3625: 'FormPrintDocument': an unmanaged type cannot derive from a managed type 'System::Drawing::Printing::PrintDocument'

Ich schätz mal das meine Klasse nicht managed ist aber wie mach ich das?? Oder gibts eine andere Möglichkeit?
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

2

22.08.2005, 19:45

wieso vermischst du managed und unmanaged code? ist im grunde immer sehr unschön und unvorteilhaft und wird so weit ich weiß idR nur angewandt um existierende, aus nicht verwaltetem code bestehende projekte auch in verwaltetem code verwenden zu können.

durch das schlüsselwort __gc kannst du erreichen, dass dein objekt in der "managed welt läuft".

stichworte: interoperabilität und anwendungsmigration. schau mal hier und hier

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

3

23.08.2005, 15:43

Die Beispiele sind bei mir nur in C# und Visual Basic. Gibts die bei euch auch in C++?
Wenn ja dann könnte mir vielleicht jemand den inhalt diesen ordners zukommen lassen:
\MS Visual Studio .NET 2003\SDK\v1.1\QuickStart\winforms\

es klappt aber immer noch nicht ganz, die printing beispiele in c++ würden auch schon reichen
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

4

23.08.2005, 17:38

kann dir nicht helfen, habe nur visual c# installiert. was ist denn das genaue problem? wenn du dir die beiden von mir geposteten seiten zu gemüte geführt hast, müsste es eigentlich machbar sein...

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

5

23.08.2005, 23:31

Ich die Elemente meines Windows Forms drucken. In C# hab ich es hinbekommen. Jetzt will ich es aber auf eine andere Weise versuchen, weil ich noch eine Seitenansicht einbauen will und so.

Ich hab kein plan was der unterschied zwischen managed und unmanaged ist. Das wollt ich heut noch kucken, hatte aber keine zeit mehr. Wenns einfach zum erklären ist kannst du mir ja einen kuzren Abriss sagen.
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

6

23.08.2005, 23:48

So schlecht siehts eigentlich nicht aus, aber ich bekomm gerade einen sehr unlogischen Fehler:

Header

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
#define _FormPrintDOC_H_

using namespace System;
using namespace System::ComponentModel;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace System::Drawing::Printing;
using namespace System::IO;

__gc class FormPrintDocument : public PrintDocument
{
private:
    Font            *printFont;
    System::String  *StringToPrint;

public:
    FormPrintDocument(System::String *testString) //: PrintDocument()

    {
        printFont = 0;
        StringToPrint = "";
        StringToPrint = testString;
    }

protected:
    /*System::*/void OnBeginPrint(PrintEventArgs *ev);
    /*System::*/void OnPrintPage(PrintEventArgs *ev);
};

#endif


CPP

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "FormPrintDocument.h"

/*System::*/void FormPrintDocument::OnBeginPrint(PrintEventArgs *ev)
{
    PrintDocument::OnBeginPrint(ev);
    printFont = new Font("Arial", 10);
}

/*System::*/void FormPrintDocument::OnPrintPage(PrintEventArgs *ev)
{
    PrintDocument::OnPrintPage(ev);
    ev->Graphics->DrawString(StringToPrint);
}


Fehler

Zitat


c:\...\FormPrintDocument.cpp(11): error C2664: 'System::Drawing::Printing::PrintDocument::OnPrintPage' : cannot convert parameter 1 from 'System::Drawing::Printing::PrintEventArgs __gc *' to 'System::Drawing::Printing::PrintPageEventArgs __gc *'


Die Zeile ist gemeint:

Quellcode

1
PrintDocument::OnBeginPrint(ev);


PS: mit der Darstellung der Kommentare im Code stimmt was nicht! Liegt wohl am Forum.
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

8

25.08.2005, 12:48

@anfänger: das beispiel verwendet die win32 api. bassdscho will es glaube ich mit wionforms machen (auch wenn die im endeffekt auf der winapi aufbauen).

@bassdscho: um den unterschied zwischen managed und unmanged code zu verstehen muss man etwas in das .net framework eintauchen. man kann mit managed extensions for c++ managed und unmanaged code erzeuen (manaaged c++ ist im übrigen die einzige sprache des .net frameworks mit der dies möglich ist).
managed code ist wie der name schon sagt verwalteter code. er wird in einer laufzeitumgebung (bei .net der clr) ausgeführt und überwacht. außerdem liegen die programme nicht direkt in maschinensprache vor sondern in einem plattformunabhängigem code (bei .net msil) und werden erst zu laufzeit stückchenweise compiliert. bei managed code wir der heap verwaltet und von zeit zu zeit von einem garbage collector bereinigt, sprich man muss sich nicht mehr um die freigabe von objekten kümmern.
da nativer code allerdings nicht wegzudenken ist gibt es in managed c++ die möglichkeit managed und unmanaged code zu kombinieren. deswegen gibt es in der fcl (framework class reference library) im namspace system.runtime.interop klassen, welche die kommunikation mit nichtverwaltetem code ermöglichen.

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

9

25.08.2005, 17:04

Ja ich wollte das mit .Net machen da es ja ziemlich einfach ist (wenn man beispiele hätte). Wie gesagt, in C# hab ich es ja schon ziemlich hin bekommen.
Das mit dem Managed Code und so hab ich auch nach gelsesn, trotzdem danke für deine Erklärung!!

Mein Problem ist jetzt eigentlich nur noch der Compiler Fehler und das ich keine Beispiele hab.
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

10

25.08.2005, 20:38

was hast du denn genau vor? du möchtest doch eine .net anwendung erstellen. oder? dann musst du das auch in deinen compilereinstellungen so einstellen. wenn die eintsellung richtig gesetzt ist müssten alle klassen automatisch managed sein und du hättest diese ganzen konflikte zwischen managed und unmanaged nicht mehr...

in der 2005er msdn steht zum drucken mit winforms ein ganzes kapitel...
unter anderem das hier:

Zitat


To create a print job
Add a PrintDocument component to your form.

Right-click your form and choose View Code.

Write code to handle the PrintPage event.

You will have to code your own printing logic. Additionally, you will have to specify the material to be printed.

In the example below, a sample graphic (a red rectangle) is created in the PrintPage event handler to act as material to be printed.

C-/C++-Quelltext

1
2
3
4
5
6
7
private:
   void printDocument1_PrintPage(System::Object ^ sender,
      System::Drawing::Printing::PrintPageEventArgs ^ e)
   {
      e->Graphics->FillRectangle(Brushes::Red,
         Rectangle(500, 500, 500, 500));
   }


Werbeanzeige