Bonjour à tous.
Je vais à contre-courant dans votre course aux monsieur + de la fonction sur ce superbe code, ou je ne comprend vraiment rien
, car je n'ai besoin que d'elle.
Je suis arrivé à enlever pas mal de procedures.
J'en ai commenté 2, donc apparement elle ne servent à rien pour la fonction que je recherche, mais je n'arrive pas à les supprimer, meme en remplaçant dans les DATAS leur adresse par 0, et pourtant ça a marché pour les autres
Quelqu'un pourrait continuer à simplifier ce code au maximum, en supprimant ce qui ne me servirait à rien dans ce que je veux faire, et afin que j'entrevoie une lueur de comprehension dans ce code hight tech
Code : Tout sélectionner
Structure iData
*pIntf.IDataobject
Refcount.l
m_stgmed.STGMEDIUM
m_fromat.FORMATETC
EndStructure
Global NewList IDataObject.iData()
#STGM_SHARE_EXCLUSIVE=$00000010
#STGM_READWRITE = $00000002
#STGM_CREATE = $00001000
#REO_CP_SELECTION=$FFFFFFFF
#REO_RESIZABLE=1
#REO_BELOWBASELINE=2
#OLERENDER_FORMAT=2
Procedure dataobject_AddRef(*dataobject.iData)
; Debug "AddRef"
; *dataobject\Refcount=*dataobject\Refcount+1
; ProcedureReturn *dataobject\Refcount
EndProcedure
Procedure dataobject_Release(*dataobject.iData)
; *dataobject\Refcount=*dataobject\Refcount-1
; If *dataobjectRefcount > 0
; ProcedureReturn *dataobject\Refcount
; Else
; ForEach IDataObject()
; If IDataObject()=*dataobject
; Debug "Release"
; DeleteElement(IDataObject()) : Break
; EndIf
; Next
; *dataobject=0
; EndIf
EndProcedure
Procedure dataobject_QueryInterface(*dataobject.IDataobject, iid, *ppvObject.Long) ; A garder
If CompareMemory(iid, ?IID_IUnknown, 16)=1 Or CompareMemory(iid, ?IID_IDataObject, 16)=1
*ppvObject\l = *dataobject
*dataobject\AddRef()
ProcedureReturn #S_OK
Else
*ppvObject=0
ProcedureReturn #E_NOINTERFACE
EndIf
EndProcedure
Procedure dataobject_GetData(*dataobject.iData,*pformatetcIn.FORMATETC, *pmedium.STGMEDIUM) ; A garder
If *pformatetcIn\tymed=*dataobject\m_fromat\tymed
If *pformatetcIn\cfFormat=*dataobject\m_fromat\cfFormat
*pmedium\tymed = *dataobject\m_stgmed\tymed
*pmedium\hBitmap = *dataobject\m_stgmed\hBitmap
*pmedium\pUnkForRelease = *dataobject\m_stgmed\pUnkForRelease
EndIf
EndIf
ProcedureReturn #S_OK
EndProcedure
Procedure dataobject_SetData(*dataobject.iData, *pformatetc.FORMATETC , *pmedium.STGMEDIUM , fRelease ) ; A garder
CopyMemory(*pformatetc,*dataobject\m_fromat,SizeOf(FORMATETC))
CopyMemory(*pmedium,*dataobject\m_stgmed,SizeOf(STGMEDIUM))
ProcedureReturn #S_OK
EndProcedure
Procedure.l Paste_Image(hBitmap.l,Rich_Edit_ID.l)
Protected RET.l,sc.l,pods.IDataobject,stgm.STGMEDIUM ,fm.FORMATETC
SendMessage_(GadgetID(Rich_Edit_ID), #EM_GETOLEINTERFACE, 0, @RichEditOleObject.IRichEditOle)
If RichEditOleObject
AddElement(IDataObject())
IDataObject()\pIntf=?VTable
pods.IDataobject=IDataObject()
; Normalement on devrait dupliquer le bitmap avec cette fonction,
; mais bien que la fonction return un handle; ça ne fonctionne pas pour autant!
; hbitmap = OleDuplicateData_(hBitmap, #CF_BITMAP, #Null)
hBitmap=CopyImage_(hBitmap,#IMAGE_BITMAP,0,0,#LR_COPYRETURNORG)
stgm\tymed = #TYMED_GDI ; // Storage medium = HBITMAP handle
stgm\hBitmap = hBitmap ; // HBITMAP handle
stgm\pUnkForRelease = #Null ; // Use ReleaseStgMedium
fm\cfFormat = #CF_BITMAP ; // Clipboard format = CF_BITMAP
fm\ptd = #Null ; // Target Device = Screen
fm\dwAspect = #DVASPECT_CONTENT ; // Level of detail = Full content
fm\lindex = -1 ; // Index = Not applicaple
fm\tymed = #TYMED_GDI ; // Storage medium = HBITMAP handle
CopyMemory(?IID_IUnknown,@iid.IID,16)
sc=pods\QueryInterface(iid.IID, @lpDataObject.IDataobject)
sc=pods\SetData(@fm, @stgm, #True)
sc = CreateILockBytesOnHGlobal_(#Null, #True, @lpLockBytes.ILockBytes)
If sc = #S_OK
sc =StgCreateDocfileOnILockBytes_(lpLockBytes,#STGM_SHARE_EXCLUSIVE|#STGM_CREATE|#STGM_READWRITE, 0, @lpStorage.IStorage)
If sc = #S_OK
sc =RichEditOleObject\GetClientSite(@lpClientSite.IOleClientSite)
If sc = #S_OK
sc = OleCreateStaticFromData_(lpDataObject, ?IID_IOleObject, #OLERENDER_FORMAT, IDataObject()\m_fromat, lpClientSite, lpStorage, @lpOleObject.IOleObject)
If sc = #S_OK
OleSetContainedObject_(lpOleObject, #True)
reobject.REOBJECT
ZeroMemory_(@reobject, SizeOf(REOBJECT))
reobject\cbStruct = SizeOf(REOBJECT)
sc = lpOleObject\GetUserClassID(@clsid.CLSID)
CopyMemory(@clsid.CLSID,@reobject\clsid,16)
reobject\cp = #REO_CP_SELECTION
reobject\dvaspect = #DVASPECT_CONTENT
reobject\dwFlags = #REO_RESIZABLE
reobject\dwUser = 0
reobject\poleobj = lpOleObject
reobject\polesite = lpClientSite
reobject\pstg = lpStorage
reobject\sizel\cx=0
reobject\sizel\cy=0
RET= RichEditOleObject\InsertObject(reobject)
EndIf
EndIf
EndIf
EndIf
If lpLockBytes
lpLockBytes\Release()
lpLockBytes=0
EndIf
If lpDataObject
lpDataObject\Release()
lpDataObject = #Null
EndIf
If lpOleObject
lpOleObject\Release()
lpOleObject = #Null
EndIf
If lpStorage
lpStorage\Release()
lpStorage = #Null
EndIf
If lpClientSite
lpClientSite\Release()
lpClientSite = #Null
EndIf
If RichEditOleObject
RichEditOleObject\Release()
RichEditOleObject = #Null
EndIf
EndIf
ProcedureReturn RET
EndProcedure
UseJPEGImageDecoder()
;CheminDossierPolices = AppPath;+ "Polices graphiques\"
Police.s = "Recreation"
ExtensionPolice.s = ".ttf"
LoadFont(0, Police, 40)
LoadImage(1,"C:\Africa.jpg")
If OpenWindow(0, 0, 0, 600, 600, "RichEdit", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
SetWindowLong_(WindowID(0),#GWL_STYLE,GetWindowLong_(WindowID(0),#GWL_STYLE)|#WS_CLIPCHILDREN)
CreateGadgetList(WindowID(0))
EditorGadget(0, 10, 10, 580, 360)
ButtonImageGadget(2, 10, 380, 200, 200, ImageID(1))
SetGadgetFont(0,FontID(0))
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 2
Select EventType()
Case #PB_EventType_LeftClick
Paste_Image(ImageID(1),0)
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
DataSection
VTable:
Data.l @dataobject_QueryInterface(), @dataobject_AddRef(), @dataobject_Release()
Data.l @dataobject_GetData(),0,0
Data.l 0,@dataobject_SetData()
IID_IDataObject: ;{0000010e-0000-0000-C000-000000000046"}
Data.l $0000010E
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
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
EndDataSection