Insert Bitmap to RichEdit
Posted: Tue Jun 19, 2007 10:15 am
For save and load RTF with images, you need code of Srod!
http://www.purebasic.fr/english/viewtop ... mreadwrite
Reference source code:
http://support.microsoft.com/default.as ... -us;220844
http://www.purebasic.fr/english/viewtop ... mreadwrite
Reference source code:
http://support.microsoft.com/default.as ... -us;220844
Code: Select all
; Insert a Bitmap file in the Editor
; Version PureBasic 4.10
#STGM_SHARE_EXCLUSIVE=$00000010
#STGM_READWRITE = $00000002
#STGM_CREATE = $00001000
#REO_CP_SELECTION=$FFFFFFFF
#REO_RESIZABLE=1
#REO_BELOWBASELINE=2
#OLERENDER_DRAW=1
Global RichEditOleObject.IRichEditOle
Global lpStorage.IStorage,lpObject.IOleObject,lpClientSite.IOleClientSite
Prototype.l CreateFromFile(a.l, FileName.p-bstr, b.l, c.l, d.l, e.l, f.l, g.l)
Procedure.l FileToOLE(FileName.s,Rich_Edit_ID.l)
SendMessage_(GadgetID(Rich_Edit_ID), #EM_GETOLEINTERFACE, 0, @RichEditOleObject.IRichEditOle)
If RichEditOleObject
lpLockBytes.ILockBytes
cfFormat = 0
lpFormatEtc.FORMATETC
clsid.CLSID
CopyMemory(?IID_NULL,@clsid,16)
sc = CreateILockBytesOnHGlobal_(#Null, #True, @lpLockBytes)
If sc = #S_OK
sc =StgCreateDocfileOnILockBytes_(lpLockBytes,#STGM_SHARE_EXCLUSIVE|#STGM_CREATE|#STGM_READWRITE, 0, @lpStorage)
If sc = #S_OK
lpLockBytes\Release()
Else
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
;// fill in FORMATETC struct
lpFormatEtc\cfFormat = 0
lpFormatEtc\ptd = #Null
lpFormatEtc\dwAspect = #DVASPECT_CONTENT
lpFormatEtc\lindex = -1
lpFormatEtc\tymed = #TYMED_NULL
;// attempt To create the object
RichEditOleObject\GetClientSite(@lpClientSite)
If OpenLibrary(0, "ole32.dll")
CreateFromFile.CreateFromFile = GetFunction(0, "OleCreateFromFile")
sc = CreateFromFile( clsid, FileName, ?IID_IUnknown, #OLERENDER_DRAW, lpFormatEtc, lpClientSite, lpStorage, @lpObject)
CloseLibrary(0)
EndIf
Debug sc
; je devrais avoir 0 mais on a 48 ?
;// lpObject is currently an IUnknown, convert To IOleObject
If lpObject<> #Null
lpUnk.IUnknown = lpObject
lpUnk\QueryInterface(?IID_IOleObject, @lpObject)
lpUnk\Release()
EndIf
;// all items are "contained" -- this makes our reference To this object
;// weak -- which is needed For links To embedding silent update.
OleSetContainedObject_(lpObject, #True)
reobject.REOBJECT
ZeroMemory_(@reobject, SizeOf(REOBJECT))
reobject\cbStruct = SizeOf(REOBJECT)
sc = lpObject\GetUserClassID(clsid.CLSID)
Debug sc
CopyMemory(@clsid,@reobject\clsid,16)
reobject\cp = #REO_CP_SELECTION
reobject\dvaspect = #DVASPECT_CONTENT
reobject\dwFlags = #REO_RESIZABLE | #REO_BELOWBASELINE
reobject\dwUser = 0
reobject\poleobj = lpObject
reobject\polesite = lpClientSite
reobject\pstg = lpStorage
reobject\sizel\cx=0
reobject\sizel\cy=0
RichEditOleObject\InsertObject(reobject)
If lpObject
lpObject\Release()
lpObject = #Null
EndIf
If lpStorage
lpStorage\Release()
lpStorage = #Null
EndIf
If lpClientSite
lpClientSite\Release()
lpClientSite = #Null
EndIf
If RichEditOleObject
RichEditOleObject\Release()
RichEditOleObject = #Null
EndIf
ProcedureReturn #True
EndIf
EndProcedure
Enumeration
#GADGET_Editor
EndEnumeration
If OpenWindow(0, 0, 0, 500, 440, "RichEdit", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
EditorGadget(#GADGET_Editor, 10, 10, 480, 380)
ButtonGadget(1, 10, 400, 200, 20, "Choose Bitmap File")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Select EventType()
Case #PB_EventType_LeftClick
FichierParDefaut$ = "C:\"
Filtre$ = "Bitmap(*.bmp)|*.bmp"
Filtre = 0
Fichier$ = OpenFileRequester("Choose Bitmap File", FichierParDefaut$, Filtre$, Filtre)
If Fichier$
Ret=FileToOLE(Fichier$,0)
If Ret=0
MessageRequester("Information", "Le chargement de l'image dans l'éditeur à échoué", 0)
EndIf
Else
MessageRequester("Information", "La sélection a été annulée.", 0)
EndIf
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
End
DataSection
IID_IOleObject: ;"{00000112-0000-0000-C000-000000000046}"
Data.l $00000112
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
IID_IUnknown: ;"{00000000-0000-0000-C000-000000000046}"
Data.l $00000000
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
IID_NULL: ;"{00000000-0000-0000-0000-000000000000}"
Data.l $00000000
Data.w $0000,$0000
Data.b $00,$00,$00,$00,$00,$00,$00,$09
EndDataSection