PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Beitrag 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?
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Beitrag 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 ?
Gruß
Hubert
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Beitrag 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)...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Beitrag 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...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Beitrag 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?
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PrintDevice / XbpPresSpace: in ein Xbp zeichnen lassen

Beitrag 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.
gruss by OHR
Jimmy
Antworten