Danke für deine Überlegungen. Ich glaube, zu dem Klick-Problem gäbe es wahrscheinlich auch eine andere einfache Lösung.
@Edel und PBZecke:
Wow



Das ist ja eine super Überraschung. Da wollte ich nur wissen, warum ein Mausklick nicht funktioniert und schon werde ich mit einer Expertenlösung für meine Idee überwältigt. Toll!!! Danke vielmals! Das scheint in eine ganz neue Dimension zu gehen. Mit dem Code kann ich prima was anfangen.
Danke auch für die Umwandlung, PBZecke, aber ich denke, das Teil von Edel ist sogar noch besser anwendbar. Da ich mich mit "Multitasking" noch gar nicht auskenne, die Frage, ob jemand noch im folgenden Code an der entsprechenden Stelle die Befehle eingeben kann, wie ich aus dem Programm heraus den Callback mit den eingebauten Buttons ein- und ausschalten kann. Das ist völliges Neuland für mich.
Und absolute Spitze wäre, wenn jemand in das Gadget irgendwo tippt, dass dann das entsprechende Wort angezeigt wird wo er gerade am Tippen oder verbessern ist. Das aber nur wenn es "eben mal schnell" zu machen ist.
Code: Alles auswählen
Macro LOWORD(Value)
Value & $FFFF
EndMacro
Macro HIWORD(Value)
(Value >> 16) & $FFFF
EndMacro
#window = 0
#editor = 0
#text = 1
#buttonan = 2
#buttonaus = 3
Procedure Callback(hwnd,msg,wParam,lParam)
Protected pt.POINT , hdc.l , linelength.l
Protected line.l , index.l , lineindex.l
Protected pbid.l = GetProp_(hwnd,"PBID")
Protected *char.character , Size.SIZE
Protected old = GetGadgetData(pbid)
Protected linetext.s
If msg = #WM_MOUSEMOVE ; #WM_LBUTTONDOWN ;
pt\x = LOWORD(lParam)
pt\y = HIWORD(lParam)
index = SendMessage_(hwnd,#EM_CHARFROMPOS,0,@pt)
line = SendMessage_(hwnd,#EM_EXLINEFROMCHAR,0,index)
lineindex = SendMessage_(hwnd,#EM_LINEINDEX ,line,0)
linetext = GetGadgetItemText(pbid,line,0)
;ende suchen
*char = @linetext + (index - lineindex)
While *char\c
If *char\c = 32 Or *char\c = 10 ; leerzeichen und linefeed
*char\c = 0
Break
EndIf
*char + SizeOf(character)
Wend
;anfang suchen
*char = @linetext + (index - lineindex)
While *char\c And *char > @linetext
If *char\c = 32 ; leerzeichen
*char + 1
Break
EndIf
*char - SizeOf(character)
Wend
SendMessage_(hwnd,#EM_POSFROMCHAR ,@pt,lineindex + *char -@linetext)
;breite und hoehe des wortes holen
hdc = GetDC_(hwnd)
GetTextExtentPoint32_(hdc,*char,Len(PeekS(*char)),@Size)
ReleaseDC_(hwnd,hdc)
;pruefen ob sich die maus ueber dem wort befindet
If Size\cy + pt\y >= HIWORD(lParam) And pt\y <= HIWORD(lParam) And Size\cx + pt\x >= LOWORD(lParam) And pt\x <= LOWORD(lParam)
SetGadgetText(#text,PeekS(*char))
Else
SetGadgetText(#text,"")
EndIf
EndIf
ProcedureReturn CallWindowProc_(old,hwnd,msg,wParam,lParam)
EndProcedure
Procedure SubclassGadget(gadget)
If IsGadget(gadget)
Protected old = SetWindowLong_(GadgetID(gadget),#GWL_WNDPROC,@Callback())
ProcedureReturn SetGadgetData(gadget,old)
EndIf
EndProcedure
hwnd = OpenWindow(#window,#PB_Ignore,#PB_Ignore,400,400,"")
CreateGadgetList(hwnd)
font = LoadFont(0,"Curier New",10)
SetGadgetFont(#PB_Default,font)
EditorGadget(#editor,0,0,400,340) : SubclassGadget(#editor)
TextGadget(#text,0,375,400,23,"",#PB_Text_Border)
ButtonGadget(#buttonan,10,350,25,20,"an")
ButtonGadget(#buttonaus,40,350,25,20,"aus")
text.s = "Hallo ... Halloooooo ?" + Chr(10)
text + "blabla"
SetGadgetText(#editor,text)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : End
Case #PB_Event_Gadget
Select EventGadget()
Case #buttonan ; Button an
Debug "Leiste angeschaltet"
Case #buttonaus ; Button aus
Debug "Leiste ausgeschaltet"
Case #editor
Debug "Zeige in der Leiste das Wort wo gerade getippt wird"
EndSelect
EndSelect
ForEver