Seite 2 von 2

Verfasst: 03.09.2006 15:12
von Eckhard.S
@Kaeru Gaman:
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 :mrgreen: :mrgreen: :mrgreen:

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 
  
  

Verfasst: 03.09.2006 15:15
von Kaeru Gaman
Eckhard.S hat geschrieben:@Kaeru Gaman:
Danke für deine Überlegungen. Ich glaube, zu dem Klick-Problem gäbe es wahrscheinlich auch eine andere einfache Lösung.
für screen-games ist die flag-methode das gängige, auch für keyboard.

Verfasst: 03.09.2006 15:39
von edel
zwar nicht so optimal aber es laeuft

Code: Alles auswählen

Procedure SubclassGadget(gadget,proc,remove=0)
  If IsGadget(gadget)
    
    Protected old = GetGadgetData(gadget) 
    
    If Not remove  
      If Not old
        old = SetWindowLong_(GadgetID(gadget),#GWL_WNDPROC,proc)
        ProcedureReturn SetGadgetData(gadget,old) 
      EndIf
    Else 
      If old 
        SetGadgetData(gadget,0)  
        ProcedureReturn SetWindowLong_(GadgetID(gadget),#GWL_WNDPROC,old)
      EndIf
    EndIf
  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) 
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
          SubclassGadget(#editor,@Callback()) 
          
        Case #buttonaus ; Button aus
          SubclassGadget(#editor,@Callback(),#True) 
          
        Case #editor
          Debug "Zeige in der Leiste das Wort wo gerade getippt wird"
          
      EndSelect
  EndSelect
ForEver
 

Verfasst: 03.09.2006 18:23
von Eckhard.S
1000 Dank :allright: