@CSHW89
"du möchtest also so eine art formel-editor, wie er auch in word oder so integriert ist, schreiben!?"Jo so in etwar, wobei der formel-editor an sich nicht das eigentliche Ziel ist, sonden nur ein Werkzeug welches das eigentliche Programm später selber nutzt, und der benutzer auch zur Eingabe benutzen kann.
"ok, ich weiß ja nicht ob das so praktikabel ist, aber wie wärs mit mehreren images. ich mein damit, dass z.b. text, der in auf der gleichen höhe liegt, in einem image gespeichert ist, ein bruch z.b. besteht dann aus zwei images usw..."Die Idee ist schon mal nicht schlecht.
Dann würde ich so zu sagen auf ein ScrollAreaGadget() wechseln.
Eine Eingabe erzeugt dann ein Image, wird die Eingabe komplexer (größer) wird das Image zerteilt und die ImageGadgets auf der ScrollArea Positioniert.
Ändert man dann einen Textabschnitt, muss wirklich nur dieser Teil als Image neu gezeichnet werden, die anderen ImageGadgets ändern nur ihre Position.
Zeilenumbruch und Ausdrucken solcher Gadget-Haufen soll jetzt mal im hintergrund stehen.
Ein Problem was es dann jedoch geben könnte ist das Markieren von Text-Abschnitten oder Teilen von Formeln, so ein Hover-Effekt müsste dann auf mehreren Images gleichzeitig gemacht werden, oder das macht man dann wirklich als Window-Draw
@Josh
Das problem was es beim direkt auf den bildschirm zeichnen noch gibt ist das es "flackert" wenn viel Text/Bilder oft erneuert werden. da es ja kein "FlipBuffer" gibt.
@ALL
Hier mal n wirklich sehr sehr vereinfachte Variante:
Ein ImageGadget in dem man Text schreiben kann (mit zeilenumbruch)
Cursor kann mit Pfeiltasten navigiert werden Backspace und Entf gehen auch ...
Das wäre so zu sagen, der Startschuss, den Text$ könnte man dann Analysieren und dann Styles und Prositionen anpassen.
Das Image könnte man zerkleinern usw.
Schwerer wirds dann schon beim Markieren mit der Maus, wenn man bei gestylten um versetzten Texten die Position unter der Maus findne muss ...
Code:
Enumeration
#Window
#Gadget
#Image
EndEnumeration
#Window_Width = 640
#Window_Height = 480
CreateImage(#Image, #Window_Width, #Window_Height)
Global Text$ = "Hier steht Irgend ein Text."+Chr(13)+"Und in der nächsten Zeile auch."
Global Position.i = Len(Text$)
Global Font = FontID(LoadFont(#PB_Any, "Times New Roman", 12))
Procedure UpdateImage()
StartDrawing(ImageOutput(#Image))
DrawingMode(1) : DrawingFont(Font)
maxRow = CountString(Text$, Chr(13))
RowHeight = TextHeight(" ")
BoxHeight = (maxRow+1)*RowHeight
Dim Row$(maxRow)
For n = 0 To maxRow
Row$(n) = StringField(Text$, n+1, Chr(13))
Next
Box(0, 0, WindowWidth(#Window), WindowHeight(#Window), $FFFFFF)
Char = 0
Cursor = 0
For n = 0 To maxRow
DrawText(10, 10+n*RowHeight, Row$(n), $000000)
If Char + Len(Row$(n)) >= Position And Cursor = 0
DrawingMode(#PB_2DDrawing_XOr)
Box(10+TextWidth(Left(Row$(n),Position-Char)), 10+n*RowHeight, 1, TextHeight(" "))
DrawingMode(1)
Cursor = 1
EndIf
Char + Len(Row$(n))+1
Next
StopDrawing()
SetGadgetState(#Gadget, ImageID(#Image))
EndProcedure
OpenWindow(#Window, 0, 0, #Window_Width, #Window_Height, "Fenster", #PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
AddKeyboardShortcut(#Window, #PB_Shortcut_Left, #PB_Shortcut_Left)
AddKeyboardShortcut(#Window, #PB_Shortcut_Right, #PB_Shortcut_Right)
AddKeyboardShortcut(#Window, #PB_Shortcut_Delete, #PB_Shortcut_Delete)
SmartWindowRefresh(#Window, 1)
ImageGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window), ImageID(#Image))
UpdateImage()
Repeat
Event = WaitWindowEvent()
Select Event
Case 258
Select EventwParam()
Case 8
If Position > 0 : Position - 1 : EndIf
Text$ = Left(Text$, Position) + Mid(Text$, Position+2)
Default
Text$ = Left(Text$, Position) + Chr(EventwParam()) + Mid(Text$, Position+1)
Position + 1
EndSelect
UpdateImage()
Case #PB_Event_SizeWindow
CreateImage(#Image, WindowWidth(#Window), WindowHeight(#Window))
ResizeGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
UpdateImage()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Menu
Select EventMenu()
Case #PB_Shortcut_Left
If Position > 0 : Position - 1 : EndIf
UpdateImage()
Case #PB_Shortcut_Right
If Position < Len(Text$) : Position + 1 : EndIf
UpdateImage()
Case #PB_Shortcut_Delete
Text$ = Left(Text$, Position) + Mid(Text$, Position+2)
UpdateImage()
EndSelect
EndSelect
ForEver