Evtl. hat ja außer mir noch jemand Verwendung dafür.
Leider ist er aufgrund massiven API-Einsatzes nur unter Windows lauffähig.
*UPDATE*
Danke für die Feedbacks.
Ich habe eine Öffnen- und Speichern-Funktion eingebaut.
Es fehlen noch Funktionen wie "Seite einrichten", "Drucken", Tabstops etc,
die Buttons könnten durch eine Toolbar mit schicken Icons ersetzt werden...
aber das würde, glaube ich, den Rahmen für Tipps und Tricks sprengen.
*UPDATE* 25.10.2011
gesamten Code überarbeitet
hinzugefügt: Speichern als UTF-8
hinzugefügt: Hintergrundfarbe wählbar
Code: Alles auswählen
EnableExplicit
Enumeration
#Editor_Window
#Editor_Gadget
#Editor_StyleF
#Editor_StyleY
#Editor_StyleB
#Editor_StyleI
#Editor_StyleU
#Editor_StyleFC
#Editor_StyleBC
#Editor_Number
#Editor_AlignR
#Editor_AlignC
#Editor_AlignL
#Editor_Menu
#Editor_MenuNew
#Editor_MenuOpen
#Editor_MenuSave
#Editor_MenuQuit
#Editor_ImageFC
#Editor_ImageBC
EndEnumeration
#CFM_BACKCOLOR = $4000000
#SF_USECODEPAGE = $20
#CP_UTF8 = 65001
Global Editor_FileName$ = ""
Global Editor_Pattern$ = "RTF (*.rtf)|*.rtf|Text (*.txt)|*.txt|Unicode (*.txt)|*.txt|UTF8 (*.utf8)|*.utf8"
Procedure Editor_EnumFontProc(*lpelfe.LOGFONT , *lpntme.TEXTMETRIC , fontType , lParam)
AddGadgetItem(#Editor_StyleF , -1 , PeekS(@*lpelfe\lfFaceName))
ProcedureReturn 1
EndProcedure
Procedure Editor_StreamOutCallback(dwCookie , *pbBuff , cb , *pcb.Long)
*pcb\l = WriteData(dwCookie , *pbBuff , cb)
ProcedureReturn (Not *pcb\l)
EndProcedure
Procedure Editor_StreamInCallback(dwCookie , *pbBuff.l , cb , *pcb.Long)
*pcb\l = ReadData(dwCookie , *pbBuff , cb)
ProcedureReturn (Not *pcb\l)
EndProcedure
Procedure Editor_UpdateGadgets(editor)
Protected cf.CHARFORMAT2
Protected pf.PARAFORMAT2
Protected fName$ , i
cf\cbSize = SizeOf(CHARFORMAT2)
SendMessage_(GadgetID(editor) , #EM_GETCHARFORMAT , #SCF_SELECTION , cf)
pf\cbSize = SizeOf(PARAFORMAT2)
SendMessage_(GadgetID(editor) , #EM_GETPARAFORMAT , 0 , pf)
If cf\dwMask & #CFM_SIZE
SetGadgetText(#Editor_StyleY , Str(cf\yHeight * 0.05))
EndIf
If cf\dwMask & #CFM_FACE
fName$ = PeekS(@cf\szFaceName , 32)
For i = 0 To CountGadgetItems(#Editor_StyleF) - 1
If GetGadgetItemText(#Editor_StyleF , i) = fName$
SetGadgetState(#Editor_StyleF , i)
Break
EndIf
Next
EndIf
If cf\dwEffects & #CFE_BOLD
SetGadgetState(#Editor_StyleB , 1)
Else
SetGadgetState(#Editor_StyleB , 0)
EndIf
If cf\dwEffects & #CFE_ITALIC
SetGadgetState(#Editor_StyleI , 1)
Else
SetGadgetState(#Editor_StyleI , 0)
EndIf
If cf\dwEffects & #CFE_UNDERLINE
SetGadgetState(#Editor_StyleU , 1)
Else
SetGadgetState(#Editor_StyleU , 0)
EndIf
If cf\crTextColor <> -1
StartDrawing(ImageOutput(#Editor_ImageFC))
Box(0,0,ImageWidth(#Editor_ImageFC),ImageHeight(#Editor_ImageFC), cf\crTextColor)
StopDrawing()
SetGadgetAttribute(#Editor_StyleFC , #PB_Button_Image , ImageID(#Editor_ImageFC))
EndIf
If cf\crBackColor <> -1
StartDrawing(ImageOutput(#Editor_ImageBC))
Box(0,0,ImageWidth(#Editor_ImageBC),ImageHeight(#Editor_ImageBC), cf\crBackColor)
StopDrawing()
SetGadgetAttribute(#Editor_StyleBC , #PB_Button_Image , ImageID(#Editor_ImageBC))
EndIf
If pf\dwMask & #PFM_ALIGNMENT
SetGadgetState(#Editor_AlignR , 0)
SetGadgetState(#Editor_AlignC , 0)
SetGadgetState(#Editor_AlignL , 0)
Select pf\wAlignment
Case #PFA_LEFT : SetGadgetState(#Editor_AlignL , 1)
Case #PFA_CENTER : SetGadgetState(#Editor_AlignC , 1)
Case #PFA_RIGHT : SetGadgetState(#Editor_AlignR , 1)
EndSelect
EndIf
If pf\dwMask & #PFM_NUMBERING
Select pf\wNumbering
Case 0 : SetGadgetState(#Editor_Number , 0)
Default : SetGadgetState(#Editor_Number , 1)
EndSelect
EndIf
SetActiveGadget(editor)
EndProcedure
Procedure Editor_SetFontName(editor , fontName$)
Protected cf.CHARFORMAT2
If fontName$ <> ""
cf\cbSize = SizeOf(CHARFORMAT2)
cf\dwMask = #CFM_FACE
PokeS(@cf\szFaceName , fontName$ , 32)
SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)
Editor_UpdateGadgets(editor)
EndIf
EndProcedure
Procedure Editor_SetFontHeight(editor , fontSize)
Protected cf.CHARFORMAT2
If fontSize > 0
cf\cbSize = SizeOf(CHARFORMAT2)
cf\dwMask = #CFM_SIZE
cf\yHeight = fontSize * 20.0
SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)
Editor_UpdateGadgets(editor)
EndIf
EndProcedure
Procedure Editor_SetFontColor(editor , fontColor)
Protected cf.CHARFORMAT2
If fontColor <> -1
cf\cbSize = SizeOf(CHARFORMAT2)
cf\dwMask = #CFM_COLOR
cf\crTextColor = fontColor
SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)
Editor_UpdateGadgets(editor)
EndIf
EndProcedure
Procedure Editor_SetBackColor(editor , backColor)
Protected cf.CHARFORMAT2
If backColor <> -1
cf\cbSize = SizeOf(CHARFORMAT2)
cf\dwMask = #CFM_BACKCOLOR
cf\crBackColor = backColor
SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)
Editor_UpdateGadgets(editor)
EndIf
EndProcedure
Procedure Editor_SetFontStyle(editor , mask)
Protected cf.CHARFORMAT2
cf\cbSize = SizeOf(CHARFORMAT2)
cf\dwMask = mask
cf\dwEffects = 0
If GetGadgetState(#Editor_StyleB)
cf\dwEffects | #CFE_BOLD
EndIf
If GetGadgetState(#Editor_StyleI)
cf\dwEffects | #CFE_ITALIC
EndIf
If GetGadgetState(#Editor_StyleU)
cf\dwEffects | #CFE_UNDERLINE
EndIf
SendMessage_(GadgetID(editor) , #EM_SETCHARFORMAT , #SCF_SELECTION , cf)
Editor_UpdateGadgets(editor)
EndProcedure
Procedure Editor_SetAlignment(editor , alignment)
Protected pf.PARAFORMAT2
pf\cbSize = SizeOf(PARAFORMAT2)
pf\dwMask = #PFM_ALIGNMENT
pf\wAlignment = alignment
SendMessage_(GadgetID(editor) , #EM_SETPARAFORMAT , 0 , pf)
Editor_UpdateGadgets(editor)
EndProcedure
Procedure Editor_SetNumbering(editor , format)
Protected pf.PARAFORMAT2
pf\cbSize = SizeOf(PARAFORMAT2)
pf\dwMask = #PFM_NUMBERING | #PFM_NUMBERINGTAB
pf\wNumbering = format
pf\wNumberingTab = 500
SendMessage_(GadgetID(editor) , #EM_SETPARAFORMAT , 0 , pf)
Editor_UpdateGadgets(editor)
EndProcedure
Procedure Editor_Quit()
End
EndProcedure
Procedure Editor_Callback(hwnd , msg , wparam , lparam)
Protected *nmhdr.NMHDR
If msg = #WM_NOTIFY
*nmhdr = lparam
If *nmhdr\code = #EN_SELCHANGE
Editor_UpdateGadgets(*nmhdr\idFrom)
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure Editor_Initialize(editor , fontName$ = "Arial" , fontHeight = 10 , fontStyle = 0 , fontColor = #Black , backColor = #White)
Protected lf.LOGFONT , y
ClearGadgetItems(editor)
ClearGadgetItems(#Editor_StyleF)
ClearGadgetItems(#Editor_StyleY)
EnumFontFamiliesEx_(GetDC_(GadgetID(editor)) , lf , @Editor_EnumFontProc() , 0 , 0)
For y = 1 To 100
AddGadgetItem(#Editor_StyleY , -1 , Str(y))
Next
If fontStyle & #CFM_BOLD
SetGadgetState(#Editor_StyleB , 1)
Else
SetGadgetState(#Editor_StyleB , 0)
EndIf
If fontStyle & #CFM_ITALIC
SetGadgetState(#Editor_StyleI , 1)
Else
SetGadgetState(#Editor_StyleI , 0)
EndIf
If fontStyle & #CFM_UNDERLINE
SetGadgetState(#Editor_StyleU , 1)
Else
SetGadgetState(#Editor_StyleU , 0)
EndIf
Editor_SetFontStyle (editor , fontStyle)
Editor_SetFontName (editor , fontName$)
Editor_SetFontHeight(editor , fontHeight)
Editor_SetFontColor (editor , fontColor)
Editor_SetBackColor (editor , backColor)
SendMessage_(GadgetID(editor) , #EM_SETEVENTMASK , 0 , #ENM_SELCHANGE)
SetWindowCallback(@Editor_Callback())
EndProcedure
Procedure Editor_Open(editor , fileName$)
Protected es.EDITSTREAM , file
file = ReadFile(#PB_Any , fileName$)
If IsFile(file)
Editor_Initialize(editor)
es\pfnCallback = @Editor_StreamInCallback()
es\dwCookie = file
Select SelectedFilePattern()
Case 0 : SendMessage_(GadgetID(editor) , #EM_STREAMIN , #SF_RTF , es)
Case 1 : SendMessage_(GadgetID(editor) , #EM_STREAMIN , #SF_TEXT , es)
Case 2 : SendMessage_(GadgetID(editor) , #EM_STREAMIN , #SF_UNICODE | #SF_TEXT , es)
Case 3 : SendMessage_(GadgetID(editor) , #EM_STREAMIN , (#CP_UTF8 << 16) | #SF_USECODEPAGE | #SF_TEXT , es)
EndSelect
CloseFile(file)
Editor_FileName$ = fileName$
EndIf
EndProcedure
Procedure Editor_Save(editor , fileName$)
Protected es.EDITSTREAM , file
file = CreateFile(#PB_Any , fileName$)
If IsFile(file)
es\pfnCallback = @Editor_StreamOutCallback()
es\dwCookie = file
Select SelectedFilePattern()
Case 0 : SendMessage_(GadgetID(editor) , #EM_STREAMOUT , #SF_RTF , es)
Case 1 : SendMessage_(GadgetID(editor) , #EM_STREAMOUT , #SF_TEXT , es)
Case 2 : SendMessage_(GadgetID(editor) , #EM_STREAMOUT , #SF_UNICODE | #SF_TEXT , es)
Case 3 : SendMessage_(GadgetID(editor) , #EM_STREAMOUT , (#CP_UTF8 << 16) | #SF_USECODEPAGE | #SF_TEXT , es)
EndSelect
CloseFile(file)
Editor_FileName$ = fileName$
EndIf
EndProcedure
CreateImage(#Editor_ImageFC,12,12)
CreateImage(#Editor_ImageBC,12,12)
OpenWindow(#Editor_Window,0,0,500,500,"TextEditor" , #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
CreateMenu(#Editor_Menu , WindowID(#Editor_Window))
MenuTitle("Datei")
MenuItem(#Editor_MenuNew , "Neu")
MenuItem(#Editor_MenuOpen , "Öffnen")
MenuItem(#Editor_MenuSave , "Speichern")
MenuBar()
MenuItem(#Editor_MenuQuit , "Beenden")
ComboBoxGadget (#Editor_StyleF , 5, 5,140, 20)
ComboBoxGadget (#Editor_StyleY ,155, 5, 50, 20)
ButtonGadget (#Editor_StyleB ,215, 5, 20, 20 , "B" ,#PB_Button_Toggle)
ButtonGadget (#Editor_StyleI ,240, 5, 20, 20 , "I" ,#PB_Button_Toggle)
ButtonGadget (#Editor_StyleU ,265, 5, 20, 20 , "U" ,#PB_Button_Toggle)
ButtonGadget (#Editor_AlignL ,305, 5, 20, 20 , "<" ,#PB_Button_Toggle)
ButtonGadget (#Editor_AlignC ,330, 5, 20, 20 , "-" ,#PB_Button_Toggle)
ButtonGadget (#Editor_AlignR ,355, 5, 20, 20 , ">" ,#PB_Button_Toggle)
ButtonGadget (#Editor_Number ,395, 5, 20, 20 , "o" ,#PB_Button_Toggle)
ButtonImageGadget (#Editor_StyleFC ,435, 5, 20, 20 , ImageID(#Editor_ImageFC))
ButtonImageGadget (#Editor_StyleBC ,455, 5, 20, 20 , ImageID(#Editor_ImageBC))
EditorGadget (#Editor_Gadget, 5, 30,490,445)
Editor_Initialize(#Editor_Gadget)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Editor_Quit()
Case #PB_Event_SizeWindow
ResizeGadget(#Editor_Gadget , #PB_Ignore,#PB_Ignore , WindowWidth(#Editor_Window) - 10 , WindowHeight(#Editor_Window) - 55)
Case #PB_Event_Gadget
Select EventGadget()
Case #Editor_StyleF
Editor_SetFontName(#Editor_Gadget , GetGadgetText(#Editor_StyleF))
Case #Editor_StyleY
Editor_SetFontHeight(#Editor_Gadget , Val(GetGadgetText(#Editor_StyleY)))
Case #Editor_StyleB
Editor_SetFontStyle(#Editor_Gadget , #CFM_BOLD)
Case #Editor_StyleI
Editor_SetFontStyle(#Editor_Gadget , #CFM_ITALIC)
Case #Editor_StyleU
Editor_SetFontStyle(#Editor_Gadget , #CFM_UNDERLINE)
Case #Editor_StyleFC
Editor_SetFontColor(#Editor_Gadget , ColorRequester())
Case #Editor_StyleBC
Editor_SetBackColor(#Editor_Gadget , ColorRequester())
Case #Editor_Number
Editor_SetNumbering(#Editor_Gadget , GetGadgetState(#Editor_Number))
Case #Editor_AlignL
Editor_SetAlignment(#Editor_Gadget , #PFA_LEFT)
Case #Editor_AlignC
Editor_SetAlignment(#Editor_Gadget , #PFA_CENTER)
Case #Editor_AlignR
Editor_SetAlignment(#Editor_Gadget , #PFA_RIGHT)
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case #Editor_MenuNew
ClearGadgetItems(#Editor_Gadget)
Case #Editor_MenuOpen
Editor_Open(#Editor_Gadget , OpenFileRequester("" , Editor_FileName$ , Editor_Pattern$ , SelectedFilePattern()))
Case #Editor_MenuSave
Editor_Save(#Editor_Gadget , SaveFileRequester("" , Editor_FileName$ , Editor_Pattern$ , SelectedFilePattern()))
Case #Editor_MenuQuit
Editor_Quit()
EndSelect
EndSelect
ForEver