Kopieren einer Grafik in eine TMetaFileCanvas außerhalb der Bildschirmdimensionen

8

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.

%Vor%

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.

    
Graymatter 22.05.2015, 00:35
quelle

2 Antworten

6

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.

    
Remy Lebeau 22.05.2015 01:21
quelle
2
%Vor%     
user3197381 27.05.2015 21:26
quelle

Tags und Links