Ich verstehe wo dein Problem ist
Normalerweise nutzt man in Xbase++ diesen Befehl um eine Resource BMP zu laden:
Code: Alles auswählen
LoadResource( <nResId>|<cResId>, [<nDll|cDll>], [<nRestype>|<cResType>], <nLanguageId|cLanguageId> ) --> xResource
Wenn [<nDll|cDll>] leer ist, holt er sich z.B. die Bitmap aus der EXE, ansonsten gibt man die DLL (als Name oder ID nach dllload() ) ... oder man nutzt XbpBitmap() direkt:
Code: Alles auswählen
XbpBitmap()
Syntax
:load( [<cDLLname>], <nID> ) --> lSuccess
Bei PDF Dateien ist es mit den Bildern etwas anders als bei normalem Drucken.
Eine PDF bindet eine BITMAP genau EINMAL in die Datei ein und vergibt Name und/oder ID.
Danach druckt man mit dieser ID, welche NICHT der im Xbase++ Programm verwendeten ResourceID entspricht, daher ist auch keine DLL Angabe in dem obigen Befehl möglich.
Je nachdem was man im Xbase++ Programm schon hat, kann man verschiedene Befehle nutzen um die Grafik in die PDF zu bekommen.
Für dich dürfte das am Besten passen (Resource wurde noch NICHT in XbpBitmap geladen):
HBPrintPDF:PrintBmp( nPosX, nPosY, nXSize, nYSize, cFileNameID, nID, nHAlign, nVAlign, nRotate, nBox, nDotsPerUnit ) - sehen wir den Quellcode an:
Code: Alles auswählen
*---------------------------------------------------
METHOD HBPrintPDF:PrintBmp( nPosX, nPosY, nXSize, nYSize, cFileNameID, nID, nHAlign, nVAlign, nRotate, nBox, nDotsPerUnit )
local nImageID, lFehler := .f., cErrTxt, nDLL, nOldLineWidth, nOldImage // cFileNameID = C or N ...
...
nOldImage := ::SelectedImage() // die selektierte Image-ID (Bitmap) für folgende Image Befehle
do case
case nID==NIL .and. empty(cFileNameID)
// Keine Resource, Kein Dateiname, Kein Stringpuffer => aktuell selektierte Grafik benutzen !
...
case nID==NIL .and. valtype(cFileNameID)=="C" // Datei auf Festplatte nutzen
// Dateiname !
nImageID := ::AddImageFile(cFileNameID,0)
...
case nID==NIL .and. valtype(cFileNameID)=="N"
// Image ID ! - also die ID einer schon enthaltenen Bitmap in der PDF !
if ::SelectImage(cFileNameID)
...
case nID==NIL
// ERROR
...
case nID == -1 // XbpBitmap SetBuffer() String
if valtype(cFileNameID)=="C" .and. ! empty(cFileNameID)
nImageID := ::AddImageFromXbpBMP(cFileNameID) // XbpBitmap als Bitmap hinzufügen
...
case nID > 0 // RESOURCE ID DER EXE ODER DLL
// *** das müsste für dich am Besten passen ***
if valtype(cFileNameID)=="C" .and. ! empty(cFileNameID) // IN DLL
nDLL := DllLoad(cFileNameID)
else
nDLL := NIL
endif
nImageID := ::AddImageResource(nID,0,nDLL)
if nImageID > 0
// OK
else
cErrTxt := "RESOURCE-ID NOT VALID"
lFehler := .t.
endif
otherwise
...
end
der letzte Teil passt wohl für dich am Besten, solange du die Bitmap aus der Resource nicht schon geladen hast (wie ganz oben erwähnt):
Code: Alles auswählen
case nID > 0 // RESOURCE ID DER EXE ODER DLL
// *** das müsste für dich am Besten passen ***
if valtype(cFileNameID)=="C" .and. ! empty(cFileNameID) // IN DLL
nDLL := DllLoad(cFileNameID)
else
nDLL := NIL
endif
nImageID := ::AddImageResource(nID,0,nDLL)
cFileNameID := "MeineBitmapinDLL.DLL"
nID := 501 // besser einen NAMEN per CH Datei (#define bmpHintergrund 501)
HBPrintPDF:PrintBmp( nPosX, nPosY, nXSize, nYSize, cFileNameID, nID, nHAlign, nVAlign, nRotate, nBox, nDotsPerUnit )
Intern wird der Befehl dann die Bitmap in die PDF laden und verwenden:
Code: Alles auswählen
// -------------------------------------------------------------------------------------------------------------------
METHOD HBPrintPDF:AddImageResource(nResourceID,nOptions,nDLL) // ONLY / NUR BMP BITMAP RESOURCEN !!!
LOCAL nImageID, cImageName
DEFAULT nResourceID TO 0
if nResourceID > 0
cImageName := "RES_ID_"+alltrim(str(nResourceID))
// schon vorhanden ?
nImageID := ::GetImageIDByName(cImageName) // ist das Image schon enthalten / only once
if nImageID == 0
nImageID := ::AddImageFromString( ::cLoadResource(nDLL,nResourceID, 2, , .t. ) , nOptions )
if nImageID > 0 // OK !
::AddImageID(nImageID,cImageName)
endif
endif
endif
return nImageID
wie man sieht, wird eine Resource einer DLL nur einmal in die PDF eingebunden und danach einfach wieder verwendet.
Allerdings muss ich hier feststellen, dass zwei gleiche ResourceIDs in zwei verschiedenen DLL so nicht möglich sind, da immer die ID der ersten Bitmap benutzt wird. Unschön ... wohl ein Fehler.
Auf jeden Fall solltest du dir die PDF Hilfe zu QuickPDF ansehen, AddImage* DrawImage* und verschiedene Manipulationsbefehle.
Zu jedem Namen findest du eine Methode hier, wobei ich auch zusätzliche aufgenommen habe um das Leben zu erleichtern.
Wenn z.B. eine Variable schon mit XbpBitmap():load ... mit einer Grafik oder Resourcegrafik geladen wurde, kann man die direkt übergeben und die Methode kümmert sich um den BMP Header:
Code: Alles auswählen
// -------------------------------------------------------------------------------------------------------------------
METHOD HBPrintPDF:AddImageFromXbpBMP(cBMP) // NUR BEI BMP für Rückgabewert von XbpBitmap():setBuffer() !!! *.BMP !!!
// ONLY with BMP and return value from XbpBitmap():setBuffer()!!! *.BMP !!!
if left(cBMP,2) # "BM"
cBMP := "BM"+U2BIN(len(cBMP)+14)+W2BIN(0)+W2BIN(0)+U2BIN(BIN2U(left(cBMP,4))+14)+cBMP
endif
return ::AddImageFromString(cBMP,0) // !!! *.BMP !!!
Ich meine diese Befehle sind alle in der 11er Version enthalten.