Brauche Hilfe bei Metafile-Ausgabe und Clone-Methode (Image)
-
Moin!
Ich versuche mich gerade an GDI+ und Metafiles. Die folgende Funktion erzeugt ein Metafile (m1) und zeichnet auch korrekt 2 Linien in die Datei. Jedoch funktioniert die Ausgabe im Fenster nicht (DrawImage). Zwar ist laut DrawImage alles "Ok", dennoch sieht man keine Ausgabe. Kann mir jemand sagen, was ich falsch mache?
Ebenso kriege ich es nicht hin, eine Kopie vom Metafile-Objekt zu erzeugen. Zwar gibt es in der Metafile-Klasse eine Methode "Clone" (von Image abgeleitet), aber die scheint nicht so richtig zu funktionieren. Der static_cast ist notwendig, damit überhaupt kompiliert wird. Der Versuch, die Metafile-Objekte per DrawImage auszugeben, gibt bei m1 wenigstens noch "Ok" zurück (auch, wenn ich nichts sehe), bei m2 aber nicht mehr. Wie kann ich also eine Kopie erstellen?
Die Funktion paint() wird in WM_PAINT aufgerufen.
void paint(HDC hdc) { wchar_t sTmp[128]; RectF rc(0.0f,0.0f,900.0f,900.0f); //Metafile m1(hdc,rc); //Metafile m1(hdc,rc,MetafileFrameUnitPixel); Metafile m1(L"test.emf",hdc,rc,MetafileFrameUnitPixel); //Metafile m2(m1.GetHENHMETAFILE()); Graphics g1(&m1); Graphics gView(hdc); Pen pen(Color(255,255,0,0)); PointF pn(0,0); // g1.DrawLine(&pen,10,10,10,500); g1.DrawLine(&pen,10,10,100,100); Metafile *m2=static_cast<Metafile*>(m1.Clone()); Graphics g2(m2); OutputDebugString(L"\r\n"); if(g2.DrawLine(&pen,20,20,100,300)!=Ok) OutputDebugString(L"g2.DrawLine klappt net...\r\n"); //gView.DrawLine(&pen,10,10,200,500); if(gView.DrawImage(&m1,300,500)!=Ok) OutputDebugString(L"DrawImage(m1) klappt net...\r\n"); pn.X+=100; pn.Y+=100; if(gView.DrawImage(m2,pn)!=Ok) OutputDebugString(L"DrawImage(m2) klappt net...\r\n"); wsprintf(sTmp,L"m1 width=%i\r\nm1 height=%i\r\n",m1.GetWidth(),m1.GetHeight()); OutputDebugString(sTmp); wsprintf(sTmp,L"m2 width=%i\r\nm2 height=%i\r\n",m2->GetWidth(),m2->GetHeight()); OutputDebugString(sTmp); OutputDebugString(L"\r\n"); UpdateWindow(::GetActiveWindow()); }EDIT: Ich lasse mir die Höhe und Breite der Metafile-Objekte ausgeben (OutputDebugString). Die wird irgendwie immer mit Null angegeben, obwohl zumindest m1 ja definitiv höher und breiter ist. Das sehe ich ja, wenn ich mir die erzeugte Datei mit der Bildanzeige ansehe. g2.DrawLine funktioniert übrigens auch nicht.
-
Hmm, in Sachen Metafiles gibt es hier wohl nicht soviele Experten, oder?
Na ja, ich hab's nun doch hingekriegt. Was ich bislang ignoriert hatte, war die Tatsache, dass beim Instanzieren der Metafile-Klasse auf den Konstruktor geachtet werden muss. Manche sind nur (und nur!) zum Aufnehmen, manche zum Abspielen. Ein Metafile-Objekt, dass zum Aufnehmen erzeugt wurde, kann nicht gleichzeitig zum Wiedergeben genutzt werden.
Eine Kopie eines Metafile-Objekts kann durch die Clone-Methode mit passendem Cast erzeugt werden:
Metafile *m2c=static_cast<Metafile*>(m2->Clone());Gruß Matze