Page 6 of 6
Posted: Tue Jan 27, 2009 9:23 pm
by rsts
yep, that seems to be a way to determine the drop.
Was just entering the world of EN_DRAGDROPDONE. This saved me some time.
Thanks again.
Posted: Tue Mar 10, 2009 2:36 am
by Nico
Here is a modification of the code to drag and drop a text file or image file to the editor:
Code: Select all
Procedure.l RichEdit_QueryAcceptData(*pObject.RichEditOle, *lpdataobj.IDataObject, *lpcfFormat, reco, fReally, hMetaPict)
Protected pEnumFormats.IEnumFORMATETC,fmtetc.FORMATETC,stgmed.STGMEDIUM
Protected Extension$,lpszFile.s,hdrop.l,drop.l,nFiles.l,nNames.l,id.l,*Buffer.l
Debug "RichEdit_QueryAcceptData"
; Predefined Clipboard Formats
; Private Const CF_TEXT = 1
; Private Const CF_BITMAP = 2
; Private Const CF_METAFILEPICT = 3
; Private Const CF_SYLK = 4
; Private Const CF_DIF = 5
; Private Const CF_TIFF = 6
; Private Const CF_OEMTEXT = 7
; Private Const CF_DIB = 8
; Private Const CF_PALETTE = 9
; Private Const CF_PENDATA = 10
; Private Const CF_RIFF = 11
; Private Const CF_WAVE = 12
; Private Const CF_UNICODETEXT = 13
; Private Const CF_ENHMETAFILE = 14
; Private Const CF_HDROP = 15
; Private Const CF_LOCALE = 16
; Private Const CF_MAX = 17
drop=0
;// Get the COM Interface For format Enumeration
If *lpdataobj\EnumFormatEtc(#DATADIR_GET, @pEnumFormats.IEnumFORMATETC)=0
;// Enumerate each type of Data supported by this IDataObject, one-by-one
While pEnumFormats\Next(1, @fmtetc.FORMATETC, @num.l)=0
If fmtetc\cfFormat=#CF_HDROP
lpszFile.s=Space(#MAX_PATH + 1)
If *lpdataobj\GetData(fmtetc,@stgmed.STGMEDIUM)=0
hdrop.l = GlobalLock_(stgmed\hGlobal)
If hdrop
nFiles.l = DragQueryFile_(hdrop, -1, #Null, 0)
If nFiles=1 ; ici je n'accepte que le glisser déposer d'un seul fichier
ZeroMemory_(@lpszFile, #MAX_PATH + 1)
DragQueryFile_(hdrop, nNames, @lpszFile, #MAX_PATH + 1)
Extension$ = GetExtensionPart(lpszFile)
Extension$ = LCase(Extension$)
If Extension$="bmp" Or Extension$="png" Or Extension$="jpeg" Or Extension$="jpg"
drop=4
ElseIf Extension$="rtf"
drop=3
ElseIf Extension$="txt"
drop=2
Else
drop=1
EndIf
Else
drop=5
EndIf
GlobalUnlock_(hdrop)
EndIf
ReleaseStgMedium_(@stgmed)
EndIf
EndIf
Wend
pEnumFormats\Release()
EndIf
If fReally=0 And drop=1
ProcedureReturn -1
EndIf
If fReally=1 And drop>1
Select drop
Case 2
LoadRTF(GetDlgCtrlID_(*pObject\hwnd), lpszFile)
Case 3
LoadRTF(GetDlgCtrlID_(*pObject\hwnd), lpszFile,#SF_RTF)
Case 4
id=LoadImage(#PB_Any,lpszFile)
SetClipboardImage(id)
SendMessage_(*pObject\hwnd,#WM_PASTE,0,0)
FreeImage(id)
Case 5
MessageRequester("Information", "Ne glisser-déposer qu'un seul fichier à la fois!", 0)
EndSelect
ProcedureReturn -1
EndIf
ProcedureReturn #S_OK
EndProcedure
Posted: Tue Mar 10, 2009 10:50 am
by srod
Very nice code Nico - works brilliantly here.

Re: Images in Editor gadgets!
Posted: Thu Jun 03, 2010 6:20 pm
by cas
Is it possible to use CatchRTF() with #SF_RTF to append new rtf formatted text to existing rtf text in EditorGadget?
I tried with replaceall=0 but it still replaces all data in EditorGadget with new data.
Thanks
Re: Images in Editor gadgets!
Posted: Thu Jun 03, 2010 7:02 pm
by srod
You need to set replaceall = #SFF_SELECTION.
E.g.
Code: Select all
;**************MUST INCLUDE*****************************************************************
XIncludeFile "OLEedit.pbi"
;*******************************************************************************************
a$ = "{\rtf1\ansi\ansicpg1252\deff0\deflang2057{\fonttbl{\f0\fswiss\fcharset0 Arial;}}"
a$ + "{\*\generator Msftedit 5.41.21.2508;}\viewkind4\uc1\pard\f0\fs20{\pict\wmetafile8\picwgoal210\pichgoal240 "
a$ + "010009000003f500000000007d00000000000400000003010800050000000b0200000000050000"
a$ + "000c0210001000030000001e0004000000070104000800000026060f000600544e505006014300"
a$ + "0000410b8600ee000f000f00000000000f000f0000000000280000000f0000000f000000010001"
a$ + "0000000000000000000000000000000000000000000000000000000000ffffff0007c0d9031ff0"
a$ + "494c3ff8bf037ffc00007ffc0000fffe0000fffe0000fffe0000fffe0000fffe00007ffcffff7f"
a$ + "fc00003ff8ffff1ff0bf0307c000007d000000410bc60088000f000f00000000000f000f000000"
a$ + "0000280000000f0000000f00000001000400000000000000000000000000000000000000000000"
a$ + "00000000000000ffffff0045454500ebffff00c7ffff0093feff0000ceff0013fdff0000eaff00"
a$ + "009dfe0000c9ff0000b4ff0000e5ff00000000000000000000000000111112222211111011122b"
a$ + "bbb922111011266aaaaa6921101266c00000a6921012680111110a6210268011111110a9202780"
a$ + "11111110ab202500000000000b202508888888880b20247880888088a920125780888088621012"
a$ + "457888888692101123477888692110111223455622111011111222221111100800000026060f00"
a$ + "0600544e50500701040000002701ffff030000000000"
a$ + "}\par"
a$ + "}"
If OpenWindow(0, 0, 0, 600, 400, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
EditorGadget(0, 8, 8, 500, 300)
ButtonGadget(1,520,30,60,20,"Insert")
;Set up the com interface for the editor gadget.
RichEdit_SetInterface(GadgetID(0))
Repeat
EV=WaitWindowEvent()
Select EV
Case #PB_Event_Gadget
Select EventGadget()
Case 1
CatchRTF(0, @a$, @a$ + Len(a$)-1, #SF_RTF, #SFF_SELECTION)
EndSelect
EndSelect
Until EV = #PB_Event_CloseWindow
EndIf
End
Re: Images in Editor gadgets!
Posted: Fri Jun 04, 2010 12:23 am
by cas
Thanks srod. replaceall=#SFF_SELECTION solved my problem.
Re: Images in Editor gadgets!
Posted: Sun Jul 04, 2010 1:33 am
by cas
I have a question about CatchRTF() LoadRTF() and SaveRTF() .
In comments before procedures it says:
;Returns zero if no error encountered.
But here always returns -2147024858.
I changed
to
to get return 0. But after adding GetLastError_() between SendMessage_() and ProcedureReturn i get error code 6 which means "The handle is invalid".
So does it mean that there always some error happen even if it successfully displays content in EditorGadget? Or did i miss something (probably

).
Thanks
Re: Images in Editor gadgets!
Posted: Sun Jul 04, 2010 9:53 am
by srod
I get no error codes here.
The value in edstr\dwError can be set by Windows (if it encounters a problem whist streaming) or it is simply the return value from the streaming callback function (which again will be placed there by Windows). For the majority of cases this should be zero.
Now, the code in this thread has been chopped and changed by a few people over the years so I would first have a good look at the edit-stream callback functions to make sure there is nothing obviously amis with the code. After that, I would ask as to the source of the rft files which you are streaming? If they were created by MS Word, for example, then expect problems!

The rich-edit control simply does not like MS Word created rtf files!
Beyond this.... I do not know. As I say, I can not reproduce the problem here.
Re: Images in Editor gadgets!
Posted: Sun Jul 04, 2010 12:38 pm
by cas
Thanks for replying. I get these error returned with any data streamed in, even with your example here which inserts data to end (3 posts up). It outputs smileys here but it's just that odd error message, everything else looks right. Maybe the problem is with ansicpg1252 or deflang2057 so it can't find it on my system and it automatically changes to default one for my system and that error message is just a warning that original rtf data is not displayed but changed one. I tested it on Windows XP x86 and Windows 7 x64 with PB 4.40, 4.41 and 4.50 x86 and i always get same result.
Re: Images in Editor gadgets!
Posted: Sun Jul 04, 2010 2:11 pm
by srod
That sounds plausible yes (the code page).

Re: Images in Editor gadgets!
Posted: Mon Jun 25, 2012 1:24 pm
by OldSkoolGamer
For anyone that's interested, here's how to set the start indent & spacing for the bullets:
Change this:
Code: Select all
Procedure Editor_Bulleted(Gadget)
format.PARAFORMAT
format\cbSize = SizeOf(PARAFORMAT)
format\dwMask = #PFM_NUMBERING
format\wNumbering = #PFN_BULLET
SendMessage_(GadgetID(Gadget), #EM_SETPARAFORMAT, 0, @format)
EndProcedure
to this:
Code: Select all
Procedure Editor_Bulleted(Gadget)
format.PARAFORMAT
format\cbSize = SizeOf(PARAFORMAT)
format\dwMask = #PFM_NUMBERING|#PFM_OFFSET|#PFM_STARTINDENT
format\wNumbering = #PFN_BULLET
format\dxStartIndent = 200; Space between left margin & bullet
format\dxOffset = 300; Space between bullet & start of text
SendMessage_(GadgetID(Gadget), #EM_SETPARAFORMAT, 0, @format)
EndProcedure