PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [VS.NET]Grafik, Device Context?


Gast
2006-06-15, 16:03:49
Hi Leute,

Bei mir steht demnächst an, eine für VC++ 6 mit MFC geschriebene Klasse, die Zeichenoperationen mit Hilfe von Device Contexts (unter Verwendung der Klassen CDC, CPen und CBrush) durchführt, auf Visual Studio .NET zu portieren. Nur habe ich gar keine so rechte Ahnung, wie Grafik unter .NET gehandlet wird, und habe auch in der MSDN noch nichts so rechtes dazu gefunden (für Win32 API und MFC gibt es jeweils die Rubriken "Graphics and Multimedia", für .NET scheint es die nicht zu geben).

Soweit ich das bisher feststellen konnte, hat sich M$ in VS .NET sehr stark von den Konzepten aus früheren VS-Versionen entfernt und einen Fensterdesigner wie auch eine Klassenbibliothek entwickelt, die beide ziemlich 1:1 von Borland Delphi und der VCL abgekupfert zu sein scheinen.
Deswegen dachte ich, für Grafikoperationen würde es dann vielleicht eine Art TCanvas-Klasse geben. Dem scheint aber nicht so zu sein.

Kennt sich jemand mit Grafik unter VS .NET aus und kann mir da weiter helfen?

Vielleicht anhand eines kleinen Codebeispiels:
So sähe es unter der Win32 API aus:

HWND hForm1;
//...
HDC hdc = GetDC(hForm1);
HPEN hpen = CreatePen(PS_SOLID,1,crColor);
HPEN holdpen = (HPEN) SelectObject(hdc, hpen);
// Zeichenstift nach (x0,y0) bewegen
MoveToEx(hdc, x0, y0, NULL);
// Linie nach (x1,y1) zeichnen
LineTo(hdc, x1, y1);

so unter der MFC:

CWnd cForm1;
//...
CDC *pdc = cForm1.GetDC();
CPen cpen, *poldpen;
cpen.CreatePen(PS_SOLID,1,crColor);
poldpen = pdc->SelectObject(&cpen);
// Zeichenstift nach (x0,y0) bewegen
pdc->MoveTo(x0,y0);
// Linie nach (x1,y1) zeichnen
pdc->LineTo(x1,y1);

und so unter Delphi/VCL:

var Form1: TForm1;
//...
Form1.Canvas.pen.Style := psSolid;
Form1.Canvas.pen.Color := crColor;
Form1.Canvas.pen.Width := 1;
// Zeichenstift nach (x0,y0) bewegen
Form1.Canvas.MoveTo(x0,y0);
// Linie nach (x1,y1) zeichnen
Form1.Canvas.LineTo(x1,y1);

wie würde das in VS .NET (in C++) aussehen?

Crushinator
2006-06-15, 17:19:00
Es ist demnach (http://www.functionx.com/vcnet/gdi+/linebased.htm) mit GDI+ nicht viel anders.


private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e)
{
Pen *penCurrent = new Pen(Color::Red);
e->Graphics->DrawLine(penCurrent, 20, 20, 205, 20);

penCurrent = new Pen(Color::Green);
e->Graphics->DrawLine(penCurrent, 40, 40, 225, 40);

penCurrent = new Pen(Color::Blue);
e->Graphics->DrawLine(penCurrent, 30, 60, 215, 60);
}


http://www.functionx.com/vcnet/gdi+/forms/line1.gif

Xmas
2006-06-15, 21:35:46
Da new auch in C++/CLI normalerweise keinen GC-Speicher reserviert würde ich mal behaupten da fehlen ein paar deletes. Und wenn es Garbage-Collected ist, sollte man zumindest Dispose() auf die Pens aufrufen.

Gast
2006-06-15, 23:26:49
Crushinator[/POST]']Es ist demnach (http://www.functionx.com/vcnet/gdi+/linebased.htm) mit GDI+ nicht viel anders.hm, von GDI+ habe ich in Zusammenhang mit .NET auch schon gehört. Ist es so wie ich vermute, daß in .NET GDI+ die GDI ersetzt, man gewissermaßen gar nicht mehr unter der GDI programmieren kann? Oder ist GDI+ einfach nur eine Klasse/Klassenbibliothek (ähnlich wie TCanvas), die auf der GDI aufbaut und Zugriffe auf diese kapselt? Der Name GDI+ suggeriert ja eher, es handele sich um eine Weiterentwicklung, vergleichbar etwa mit DirectDraw.

Gast
2006-06-15, 23:37:18
Gast[/POST]']hm, von GDI+ habe ich in Zusammenhang mit .NET auch schon gehört. Ist es so wie ich vermute, daß in .NET GDI+ die GDI ersetzt, man gewissermaßen gar nicht mehr unter der GDI programmieren kann? Oder ist GDI+ einfach nur eine Klasse/Klassenbibliothek (ähnlich wie TCanvas), die auf der GDI aufbaut und Zugriffe auf diese kapselt? Der Name GDI+ suggeriert ja eher, es handele sich um eine Weiterentwicklung, vergleichbar etwa mit DirectDraw.

GDI+ ist der Nachfolger von GDI und mit XP/W2k3 erhältlich. Was du im .NET Framework hast, ist ein Wrapper um die C++ GDI+ Implementierung. Der Unterschied zu GDI+ ist, dass es Geräteunabhängig ist (DeviceContext). Um beim obigen Bsp. zu bleiben, das Pen Object kannst du unter GDI+ auch für andere Graphics Objekte (DeviceContext) verwenden. Daneben bietet wohl GDI+ auch noch Vektorschriften und andere Neuigkeiten im Vergl. zu GDI.

Gast
2006-06-16, 09:38:47
geht denn Grafik unter .NET auch ohne GDI+ und stattdessen mit GDI? Oder anders gefragt: läuft .NET nur auf Betriebssystemen mit GDI+ Unterstützung?

Gast
2006-06-16, 09:51:49
Gast[/POST]']geht denn Grafik unter .NET auch ohne GDI+ und stattdessen mit GDI? Oder anders gefragt: läuft .NET nur auf Betriebssystemen mit GDI+ Unterstützung?

Es geht ja nur darum, dass GDI+ standardmäßig mit XP/W2k3 ausgeliefert wird. Wenn du das .NET Framework auf W2k installierst, wird dort sicherlich bei der Installation auch die GDI+ installiert, sofern nicht schon vorhanden. Das vermute ich jetzt zumindest mal, kanns dir aber nicht genau sagen. Die Windows Forms Controls werden ja eh alle über GDI+ gezeichnet, also muss es folglich so sein.

SgtTynis
2006-06-16, 10:00:05
Also grafisches gemale geht selbst auf NT 4.0 unter .NET, von daher denke ich mal schon das die alles notwendige mit dem Framework mitinstallieren. Sollte aber immer GDI+ sein, weil intern muss man keine Fallunterscheidung vornehmen.

Crushinator
2006-06-16, 18:38:49
Xmas[/POST]']Da new auch in C++/CLI normalerweise keinen GC-Speicher reserviert würde ich mal behaupten da fehlen ein paar deletes. Und wenn es Garbage-Collected ist, sollte man zumindest Dispose() auf die Pens aufrufen.
Da wirst Du vermutlich ganz recht haben. Ich bin in Puncto managed C++ gar nicht bewandert, werde es vermutlich auch nie sein und habe den obigen Code nach erfolgreicher Suche aus der geposteten Quelle einfach per Cut & Paste übernommen. :)

Chris Lux
2006-06-16, 21:53:55
Xmas[/POST]']Da new auch in C++/CLI normalerweise keinen GC-Speicher reserviert würde ich mal behaupten da fehlen ein paar deletes. Und wenn es Garbage-Collected ist, sollte man zumindest Dispose() auf die Pens aufrufen.
in dem code einfach die * durch ^ und die new durch gcnew ersetzen und die welt ist gerettet. aber ich musste am eigenen leib gerade erst erfahren, dass c++/clr auch super probleme machen kann. stichwort typ identität und native templates...