Das wäre aber IMHO die simpelste Lösung, die zudem Dein Programm nicht aufbläht.Kukulkan hat geschrieben:und auch ohne RTF Konvertierungen meinerseits.
Da würde ich an Deiner Stelle nochmals drüber Nachdenken
Gruß
Thomas
Das wäre aber IMHO die simpelste Lösung, die zudem Dein Programm nicht aufbläht.Kukulkan hat geschrieben:und auch ohne RTF Konvertierungen meinerseits.

Code: Alles auswählen
Enumeration
  #frmWYSIWYG
EndEnumeration
Enumeration
  #frmWYSIWYG_cmdTest
  #frmWYSIWYG_Browser
EndEnumeration
Enumeration   ; VARENUM
  #VT_EMPTY = 0
  #VT_NULL = 1
  #VT_I2 = 2
  #VT_I4 = 3
  #VT_R4 = 4
  #VT_R8 = 5
  #VT_CY = 6
  #VT_DATE = 7
  #VT_BSTR = 8
  #VT_DISPATCH = 9
  #VT_ERROR = 10
  #VT_BOOL = 11
  #VT_VARIANT = 12
  #VT_UNKNOWN = 13
  #VT_DECIMAL = 14
  #VT_I1 = 16
  #VT_UI1 = 17
  #VT_UI2 = 18
  #VT_UI4 = 19
  #VT_I8 = 20
  #VT_UI8 = 21
  #VT_INT = 22
  #VT_UINT = 23
  #VT_VOID = 24
  #VT_HRESULT = 25
  #VT_PTR = 26
  #VT_SAFEARRAY = 27
  #VT_CARRAY = 28
  #VT_USERDEFINED = 29
  #VT_LPSTR = 30
  #VT_LPWSTR = 31
  #VT_RECORD = 36
  #VT_INT_PTR = 37
  #VT_UINT_PTR = 38
  #VT_FILETIME = 64
  #VT_BLOB = 65
  #VT_STREAM = 66
  #VT_STORAGE = 67
  #VT_STREAMED_OBJECT = 68
  #VT_STORED_OBJECT = 69
  #VT_BLOB_OBJECT = 70
  #VT_CF = 71
  #VT_CLSID = 72
  #VT_VERSIONED_STREAM = 73
  #VT_BSTR_BLOB = $fff
  #VT_VECTOR = $1000
  #VT_ARRAY = $2000
  #VT_BYREF = $4000
  #VT_RESERVED = $8000
  #VT_ILLEGAL = $ffff
  #VT_ILLEGALMASKED = $fff
  #VT_TYPEMASK = $fff
EndEnumeration
#DISPATCH_METHOD = $1
#DISPATCH_PROPERTYGET = $2
#DISPATCH_PROPERTYPUT = $4
#DISPATCH_PROPERTYPUTREF = $8
DataSection
  IID_IHTMLDocument: ; {626FC520-A41E-11CF-A731-00A0C9082637}
    Data.l $626FC520
    Data.w $A41E, $11CF
    Data.b $A7, $31, $00, $A0, $C9, $08, $26, $37
    
  IID_NULL: ; {00000000-0000-0000-0000-000000000000}
    Data.l $00000000
    Data.w $0000, $0000
    Data.b $00, $00, $00, $00, $00, $00, $00, $00       
EndDataSection
Procedure MakeBSTR(String$)
  Unicode$ = Space(Len(String$)*2+2)
  MultiByteToWideChar_(#CP_ACP, 0, @String$, -1, @Unicode$, Len(String$)*2+2)
  ProcedureReturn SysAllocString_(@Unicode$)
EndProcedure
Procedure.s ReadBSTR(bstr)
  length = WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, 0, 0, 0, 0)
  Text$ = Space(length)
  WideCharToMultiByte_(#CP_ACP, 0, bstr, -1, @Text$, length, 0, 0)   
  ProcedureReturn Text$
EndProcedure
Procedure.s StringFromVARIANT(*var.VARIANT)
  If VariantChangeType_(*var, *var, $2, #VT_BSTR) = #S_OK
    Result$ = ReadBSTR(*var\bstrVal)
    SysFreeString_(*var\bstrVal)
  Else
    Result$ = "ERROR : Cannot convert VARIANT to String!"
  EndIf
  
  ProcedureReturn Result$
EndProcedure
Procedure.s ExecuteJavaScript(Gadget, Function$, Arguments$, Separator$)
  Result$ = "ERROR" 
  Browser.IWebBrowser2 = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
  If Browser\get_Document(@DocumentDispatch.IDispatch) = #S_OK
    If DocumentDispatch\QueryInterface(?IID_IHTMLDocument, @Document.IHTMLDocument) = #S_OK
      If Document\get_Script(@Script.IDispatch) = #S_OK
        
        bstr_command = MakeBSTR(Function$)
        result = Script\GetIDsOfNames(?IID_NULL, @bstr_command, 1, 0, @dispID.l)
        If result = #S_OK
          
          ; parse the arguments          
          ;
          If Trim(Arguments$) = ""
            Count = 0
            *Arguments = 0
          Else            
            Count = CountString(Arguments$, Separator$)+1
            *Arguments = AllocateMemory(SizeOf(VARIANT)*Count)       
            *Arg.VARIANT = *Arguments
            
            For i = 1 To Count            
              *Arg\vt = #VT_BSTR
              *Arg\bstrVal = MakeBSTR(StringField(Arguments$, i, Separator$))
              *Arg + SizeOf(VARIANT)
            Next i
          EndIf
          
          params.DISPPARAMS\cArgs = Count
          params\cNamedArgs = 0
          params\rgvarg = *Arguments
          
          result = Script\Invoke(dispID, ?IID_NULL, 0, #DISPATCH_METHOD, @params, @varResult.VARIANT, 0, 0)
          If result = #S_OK
            Result$ = StringFromVARIANT(@varResult)
          Else
            Message$ = Space(3000)
            FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, @Message$, 3000, 0)          
            Result$ = "ERROR: Invoke() "+Message$            
          EndIf
          
          If *Arguments
            *Arg.VARIANT = *Arguments
            For i = 1 To Count
              SysFreeString_(*Arg\bstrVal)
              *Arg + SizeOf(VARIANT)
            Next i          
            FreeMemory(*Arguments)
          EndIf
          
        Else
          Message$ = Space(3000)
          FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, @Message$, 3000, 0)          
          Result$ = "ERROR: GetIDsOfNames() "+Message$          
          
        EndIf
        SysFreeString_(bstr_command)
                      
        Script\Release()
      EndIf
      Document\Release()
    EndIf
    DocumentDispatch\Release()
  EndIf
  ProcedureReturn Result$
EndProcedure
; Hier geht's lo-hos...
Define.s HTML
OpenWindow(#frmWYSIWYG, #PB_Ignore, #PB_Ignore, 600, 400, "WYSIWYG-Demo")
ButtonGadget(#frmWYSIWYG_cmdTest, 10, 5, 120, 25, "Get editor content...")
WebGadget(#frmWYSIWYG_Browser, 0, 30, 600, 360, "")
HTML + "<!DOCTYPE HTML PUBLIC ''-//W3C//DTD HTML 4.01//EN'' ''http://www.w3.org/TR/html4/strict.dtd''>"
HTML + "<html dir=''ltr''>"
HTML + "    <head>"
HTML + "        <style type=''text/css''>"
HTML + "            body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }"
HTML + "        </style>"
HTML + "        <script src=''http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js'' djConfig=''parseOnLoad: true''>"
HTML + "        </script>"
HTML + "        <script type=''text/javascript''>"
HTML + "            dojo.require(''dijit.Editor'');"
HTML + "  function GetEditorContent() { return dijit.byId(''editor1'').attr(''value'') };"
HTML + "        </script>"
HTML + "        <link rel=''stylesheet'' type=''text/css'' href=''http://ajax.googleapis.com/ajax/libs/dojo/1.6/dijit/themes/claro/claro.css'' />"
HTML + "    </head>"
HTML + "    <body class='' claro ''>"
HTML + "        <div dojoType=''dijit.Editor'' id=''editor1''>"
HTML + "            <p>"
HTML + "                This instance is created from a div directly with default toolbar and"
HTML + "                plugins"
HTML + "            </p>"
HTML + "        </div>"
HTML + "    </body>"
HTML + "</html>"
HTML = ReplaceString(HTML, "''", Chr(34))
SetGadgetItemText(#frmWYSIWYG_Browser, #PB_Web_HtmlCode, HTML)
Repeat
  WWE=WaitWindowEvent()
  Select WWE
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #frmWYSIWYG_cmdTest
          MessageRequester("", ExecuteJavaScript(#frmWYSIWYG_Browser, "GetEditorContent", "", ""))
      EndSelect
    Case #PB_Event_CloseWindow
      Break 
  EndSelect
ForEverups! Posting von DarkDragon übersehen...Kiffi hat geschrieben:Eine Crossplattformlösung gibt es IMO nicht.
Code: Alles auswählen
Enumeration
  #frmWYSIWYG
EndEnumeration
Enumeration
  #frmWYSIWYG_cmdTest
  #frmWYSIWYG_Browser
EndEnumeration
Define.s HTML
OpenWindow(#frmWYSIWYG, #PB_Ignore, #PB_Ignore, 600, 400, "WYSIWYG-Demo")
ButtonGadget(#frmWYSIWYG_cmdTest, 10, 5, 120, 25, "Get editor content...")
WebGadget(#frmWYSIWYG_Browser, 0, 30, 600, 360, "")
HTML + "<!DOCTYPE HTML PUBLIC ''-//W3C//DTD HTML 4.01//EN'' ''http://www.w3.org/TR/html4/strict.dtd''>"
HTML + "<html dir=''ltr''>"
HTML + "    <head>"
HTML + "        <style type=''text/css''>"
HTML + "            body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }"
HTML + "        </style>"
HTML + "        <script src=''http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js'' djConfig=''parseOnLoad: true''>"
HTML + "        </script>"
HTML + "        <script type=''text/javascript''>"
HTML + "            dojo.require(''dijit.Editor'');"
HTML + "  function SetDocumentTitle() { document.title=dijit.byId(''editor1'').attr(''value'') };"
HTML + "        </script>"
HTML + "        <link rel=''stylesheet'' type=''text/css'' href=''http://ajax.googleapis.com/ajax/libs/dojo/1.6/dijit/themes/claro/claro.css'' />"
HTML + "    </head>"
HTML + "    <body class='' claro ''>"
HTML + "        <div dojoType=''dijit.Editor'' id=''editor1'' onDisplayChanged=''SetDocumentTitle();''>"
HTML + "            <p>"
HTML + "                This instance is created from a div directly with default toolbar and"
HTML + "                plugins"
HTML + "            </p>"
HTML + "        </div>"
HTML + "    </body>"
HTML + "</html>"
HTML = ReplaceString(HTML, "''", Chr(34))
SetGadgetItemText(#frmWYSIWYG_Browser, #PB_Web_HtmlCode, HTML)
Repeat
  WWE=WaitWindowEvent()
  Select WWE
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #frmWYSIWYG_cmdTest
          MessageRequester("", GetGadgetItemText(#frmWYSIWYG_Browser, #PB_Web_PageTitle))
      EndSelect
    Case #PB_Event_CloseWindow
      Break 
  EndSelect
ForEverIch kenne mich mit Scintilla nicht aus, kann also nicht sagen ob es alsKukulkan hat geschrieben:@Danilo
Ja, im Prinzip will ich nur rudimentäres. Allerdings ohne HTML Kenntnisse der Nutzer und auch ohne RTF Konvertierungen meinerseits. Kann Scintilla denn als WYSIWYG Editor funktionieren? Ich dachte, Scintilla macht nur Syntax-Highlighting (nehme ich heute für den HTML Editor-Part)?
Code: Alles auswählen
#font     = "Arial"
#fontsize = 14
Enumeration
  #DEFAULT   = 0
  #BOLD      = 1
  #ITALIC    = 4
  #UNDERLINE = 8
EndEnumeration
Procedure SetStyle(style,font$,fontsize,fontcolor,flag)
    ScintillaSendMessage(0,#SCI_STYLESETFONT, style, @font$)
    ScintillaSendMessage(0,#SCI_STYLESETSIZE, style, fontsize)
    ScintillaSendMessage(0,#SCI_STYLESETFORE ,style, fontcolor)
    If flag&#BOLD
        ScintillaSendMessage(0,#SCI_STYLESETBOLD     ,style, 1)
    EndIf
    If flag&#ITALIC
        ScintillaSendMessage(0,#SCI_STYLESETITALIC   ,style, 1)
    EndIf
    If flag&#UNDERLINE
        ScintillaSendMessage(0,#SCI_STYLESETUNDERLINE,style, 1)
    EndIf
EndProcedure
Procedure InitStyles()
    SetStyle(#DEFAULT                   ,#font,#fontsize  ,RGB($00,$00,$00),#DEFAULT)
    SetStyle(#BOLD                      ,#font,#fontsize  ,RGB($FF,$00,$00),#BOLD)
    SetStyle(#ITALIC                    ,#font,#fontsize-6,RGB($80,$80,$80),#ITALIC)
    SetStyle(#UNDERLINE                 ,#font,#fontsize  ,RGB($00,$00,$FF),#UNDERLINE)
    SetStyle(#BOLD|#UNDERLINE           ,#font,#fontsize  ,RGB($00,$00,$00),#BOLD|#UNDERLINE)
    SetStyle(#BOLD|#ITALIC              ,#font,#fontsize  ,RGB($00,$00,$00),#BOLD|#ITALIC)
    SetStyle(#BOLD|#ITALIC|#UNDERLINE   ,#font,#fontsize-4,RGB($00,$00,$00),#BOLD|#ITALIC|#UNDERLINE)
EndProcedure
Procedure StyleChars(start,length,style)
    ScintillaSendMessage(0,#SCI_STARTSTYLING,start,255)
    ScintillaSendMessage(0,#SCI_SETSTYLING,length,style)
EndProcedure
Procedure AddLine(text$)
    text$+Chr(10)
    len = Len(text$)
    text2$=Space(len*4)
    PokeS(@text2$,text$,len,#PB_UTF8) ; convert to UTF8
    ScintillaSendMessage(0, #SCI_APPENDTEXT, MemoryStringLength(@text2$,#PB_UTF8), @text2$)
EndProcedure
If OpenWindow(0, 0, 0, 500, 300, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If InitScintilla()
        ScintillaGadget(0, 0, 0, 500, 300, #Null)
        ScintillaSendMessage(0,#SCI_SETMARGINWIDTHN,1,0)        ; margin
        ScintillaSendMessage(0,#SCI_SETCODEPAGE,#SC_CP_UTF8,0)  ; UTF8 mode
        InitStyles()
        
        AddLine("Hallo Kukulkan!")
        AddLine("Das ist ein Scintilla-Gadget")
        AddLine("mit Styles")
        AddLine("")
        AddLine("Ä Ö Ü ä ö ü ß")
        StyleChars(0 ,15,#BOLD)
        StyleChars(16,28,#ITALIC)
        StyleChars(45,3 ,#UNDERLINE)
        StyleChars(49,6 ,#BOLD|#UNDERLINE|#ITALIC)
        
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf