Wir haben ein Problem mit der TMetaFileCanvas-Ausgabe, wenn ein Bild auf eine Koordinate außerhalb der Bildschirmauflösung gezeichnet wird. Vektoroperationen scheinen keine Probleme zu haben, aber Bildoperationen werden einfach "ignoriert". Wenn wir dasselbe Bild innerhalb der Bildschirmgrenzen auf eine Koordinate zeichnen, gibt es keine Probleme.
Zum Beispiel. Dieser SSCCE erzeugt 4 Ausgabedateien. Die Bitmap-Variante hat keine Probleme und wird wie erwartet mit dem roten Quadrat in der oberen linken Ecke für inscreen.bmp
und dem roten Quadrat in der unteren rechten Ecke für outsidescreen.bmp
ausgegeben. Die inscreen.emf
-Meta-Datei funktioniert wie erwartet mit dem roten Quadrat in der oberen linken Ecke. outsidescreen.emf
funktioniert nicht und nur die Zeile wird gezeichnet.
Kann jemand sehen, was das Problem ist oder weißt du von einer Arbeit dafür?
Aktualisieren
Ich hätte das einfügen sollen, als ich die Frage ursprünglich gestellt habe. Wir haben den HDC für eine große Bitmap getestet und das gleiche Problem gezeigt. Ich habe den Beispielcode aktualisiert, um dies zu demonstrieren.
Update 2
Leider ist die Lösung auch nach dem Kopfgeld noch schwer zu finden. Ein BitBlt-Vorgang außerhalb der Bildschirmgröße wird nicht gezeichnet.
Hier ist eine Extraktion der Metafile-Operationen, wenn das Bild in den Grenzen der Bildschirmkoordinaten ist:
%Vor%Hier ist eine Extraktion der Metafile-Operationen, wenn das Bild außerhalb der Grenzen der Bildschirmkoordinaten liegt:
%Vor%Sie können sehr deutlich sehen, dass die BilBlt-Operation (R0025 in der ersten) fehlt.
Sie erstellen TMetaFileCanvas
mit dem Parameter ReferenceDevice
auf 0, so dass ReferenceDevice
auf HDC
von GetDC(0)
gesetzt wird, dh der Bildschirm. ReferenceDevice
wird verwendet, um die Auflösung und die Funktionen zu erhalten, die während der EMF-Zeichnung verwendet werden. Wenn beispielsweise die Dimensionen von TMetaFile
leer sind, verwendet TMetaFileCanvas
die Dimensionen von ReferenceDevice
. TMetaFileCanvas
erstellt dann ein HDC
für sich selbst, das ein begrenzendes Rechteck basierend auf den Dimensionen von TMetaFile
oder ReferenceDevice
hat, je nachdem, welches Attribut gültig war.
Um Ihr Problem zu umgehen, stellen Sie ein ReferenceDevice
bereit, das groß genug ist, um Ihre Zeichnung zu bearbeiten. Sie können die TMetaFile
-Dimensionen auf die gewünschte maximale Größe vor dem Erstellen von TMetaFileCanvas
vordimensionieren, aber Sie müssen wahrscheinlich TBitmap
der gewünschten maximalen Größe erstellen und stattdessen Canvas.Handle
als ReferenceDevice
verwenden mit dem Bildschirm.
Intern ruft TCanvas.StretchDraw()
nur TGraphic.Draw()
auf. TMetaFile.Draw()
"spielt" die Metadatei auf dem% code% des Zielbereichs ab. Wenn dieses HDC
dasjenige ist, das von HDC
erstellt wurde, können Sie nicht außerhalb der Dimensionen zeichnen, die diesem TMetaFileCanvas
zugeordnet sind.