Seite 1 von 1

PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Verfasst: Do, 19. Mai 2011 11:28
von Markus Walter
Hi,

ich möchte eine "externe" Funktion in ein XbasePart zeichnen lassen. Konkret geht es um das TxTextControl, dass eine PrintDevice-Eigenschaft kennt, der man einen "device context" zuweisen kann, in welchen das TxTextcontrol dann seine Druckausgabe zeichnet.

Kann mir jemand einen Hinweis geben, was ich da zuweisen muss, damit die Druckausgabe in einem XbpBitmap ankommt?

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Verfasst: Do, 19. Mai 2011 13:11
von brandelh
Hi,

ein Presentation Space hat einen Device Context.
Bei XbpPrinter() ist das der Druckertreiber, bei einem Fenster ist das :winDevice() - ein XbpStatic() wird vom XbpWindow() abgeleitet,
also sollte es mit einem XbpStatic() Kontrol gehen. Vermutlich muss man aber dann die Anzeige bei jedem DRAW() Event neu zeichnen lassen.

eine Ähnliche Fragestellung gab es auch in QuickPDF, laut Pablo konnte dort allerdings nicht die Funktion mit DeviceContext() im Namen verwendet werden, sondern eine die einen "Bitsteam" erzeugte. Dieser wurde dann in ein XbpBitmap Objekt umgeleitet ...
Weiß jemand - z.B. der der gefragt hat - wo das steht ?

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Verfasst: Do, 19. Mai 2011 14:19
von Markus Walter
brandelh hat geschrieben:Hi,

ein Presentation Space hat einen Device Context.
Bei XbpPrinter() ist das der Druckertreiber, bei einem Fenster ist das :winDevice() - ein XbpStatic() wird vom XbpWindow() abgeleitet,
also sollte es mit einem XbpStatic() Kontrol gehen. Vermutlich muss man aber dann die Anzeige bei jedem DRAW() Event neu zeichnen lassen.
Hi Hubert,

was will mir der Verfasser damit sagen... :?:

So hatte ich das vermutet, aber wenn ich XbpStatic():Windevice() übergebe, bekomme ich einen Typkonflikt.
brandelh hat geschrieben: eine Ähnliche Fragestellung gab es auch in QuickPDF, laut Pablo konnte dort allerdings nicht die Funktion mit DeviceContext() im Namen verwendet werden, sondern eine die einen "Bitsteam" erzeugte. Dieser wurde dann in ein XbpBitmap Objekt umgeleitet ...
Weiß jemand - z.B. der der gefragt hat - wo das steht ?
Den Thread hatte ich auch gefunden, aber das wurde dann ja ganz anders gelöst (über eine Render-Funktion, die einen String lieferte, wenn ich mich recht erinnere)...

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Verfasst: Sa, 21. Mai 2011 5:54
von AUGE_OHR
Markus Walter hat geschrieben:was will mir der Verfasser damit sagen... :?:
hattest du mit RTF nicht mal ein ähnliches Problem ? http://www.xbaseforum.de/viewtopic.php? ... it=lockHDC

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Verfasst: Sa, 21. Mai 2011 13:30
von Markus Walter
Hi Jimmy,

das hatte ich glatt vergessen. Da ging es zwar um eine andere Geschichte (List&Label), aber das sollte in die gleiche Richtung gehen. Muss ich mir nochmal anschauen...

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Verfasst: Mo, 23. Mai 2011 8:22
von Markus Walter
Hm,

so wie es mit List&Label damals ging, geht es mit TxControl nicht...

Bei LL hatte ich das so gebaut:

Code: Alles auswählen

oPS := oXbp:lockPS()
nDC := oPS:lockHDC( 4, @hDC )
nError := LlRTFDisplay(hJob, hRTF, hDC, pRC, .t., @pnState)
oPS:UnlockHDC( nDC, hDC )
oXbp:unlockPS( oPS )
das "gleiche" mit TxControl:

Code: Alles auswählen

oPS := oStatic:lockPS()
nDC := oPS:lockHDC( 4, @hDC )
oTx:PrintDevice := nDC
oTx:PrintPage(1)
oPS:UnlockHDC( nDC, hDC )
oStatic:unlockPS( oPS )
liefert eine Fehlermeldung "Ungültiger Eigenschaftswert. (1-2101)"

Allerdings kann ich auch nicht drucken, wenn ich :PrintDevice nicht setze (dann sollte eigentlich ein Ausdruck auf den Standard-Drucker erfolgen). Es kommt dann zwar keine Fehlermeldung, aber es druckt auch nicht...

Ein Problem könnte vielleicht sein, das TxControl für die Seitenzahl einen Integer-Wert möchte. Xbase arbeitet ja was API-Calls angeht immer mit Long-Werten. Bei ActiveX auch? Hat jemand eine Idee, ob man auch Integer-Werte übergeben kann?

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Verfasst: Fr, 20. Jan 2017 6:34
von AUGE_OHR
hi,
Markus Walter hat geschrieben:ich möchte eine "externe" Funktion in ein XbasePart zeichnen lassen.
... in einem XbpBitmap ankommt?
der Thread ist zwar alt aber jetzt habe ich eine Lösung die in solchen Fällen als Workaround funktioniert.

zunächst benötigt man einen Parent z.b. XbpStatic wo wir leeres (Xbase++) Bitmap als Caption nehmen.
Dann

Code: Alles auswählen

DLLFUNCTION GetWindowDC( hwnd ) USING STDCALL FROM USER32.DLL
hDC1 := GetWindowDC( oStatic:GethWnd() )
so bekommst du vom "Fenster" den "DC"
von deinem ActiveX Control bekommst du den anderen "DC" und dann kommt nur noch ein BitBlt()

Code: Alles auswählen

DllCall("Gdi32.dll",DLL_STDCALL,"BitBlt", nDestDC, aPos2[1], aPos2[2], aSize1[1], aSize1[2],;
                                          nSourceDC, aPos1[1], aPos1[2], nOperation)
du überträgst also den kompletten "Inhalt" von einem Fenster in ein anderes mit BitBlt()

die Caption der Static war ja das Bitmap

Code: Alles auswählen

   oBitmap := oStatic:Caption
   oBitmap:Savefile("Test1.BMP") // nur zur Demo das da was ist.
wenn du erst mal das (Xbase++) Bitmap Object hast wird das weiter verarbeiten wohl kein Problem sein.