Corser position im Editor Gadget und in Px für Win und Linux

Für allgemeine Fragen zur Programmierung mit PureBasic.
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

Corser position im Editor Gadget und in Px für Win und Linux

Beitrag von IcedCoffee »

Moin

ich bin gerade beim coden einer kleinen Auto Complete funktion für Win und Linux

so und meine frage ist wie bekomme ich die Corser position?
SendMessage_(GadgetID(#MyStringGadget), #EM_GETSEL, @GetSelStart, @GetSelEnde) << nicht das [weil ist WinAPI]

und wie bekomme ich die Corser position in Pixel'n
MouseX() << nicht das [weil da brauche ich OpenWindowedScreen() für]

soweit bin ich schon: :-)

Code: Alles auswählen

#MyStringGadget = 1
#MyListGadget = 2
Procedure.s ICStringField(String.s, Separator.s, Index.l, StartPos.l, EndPos.l)
  Protected Wort.s, StartPosOfWort.l, EndPosOfWort.l, w.l, SatzPos.l
  Wort = StringField(String, Index, Separator)
  If CountString(String, Wort) = 1
    StartPosOfWort = FindString(String, Wort, 1)
    EndPosOfWort = StartPosOfWort+Len(Wort)
    PokeL(StartPos, StartPosOfWort-1)
    PokeL(EndPos, EndPosOfWort-1)
    ProcedureReturn Wort
  ElseIf CountString(String, Wort) > 1
    For w = 1 To CountString(String, Separator)
      Wort = StringField(String, w, Separator)
      SatzPos = SatzPos + Len(Wort) + 1
      If w = Index
        PokeL(StartPos, SatzPos-Len(Wort)-1)
        PokeL(EndPos, SatzPos-1)
        ProcedureReturn Wort
      EndIf
    Next
  Else
    ProcedureReturn ""
  EndIf
EndProcedure

OpenWindow(0,150,150,200,200, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Test")
If CreateGadgetList(WindowID())
  StringGadget(#MyStringGadget, 25,25,150,18,"")
  ListViewGadget(#MyListGadget, 25, 50, 150, 60)
EndIf

Text.s      ; Der Text wie er aus der Gadget kommt
WortStart.l ; Die Position des Wort anfangs
WortEnde.l  ; Die Position des Wort endes
i.l         ; wie oft ist " " im Text enthalten
GetSel.l    ; die position des Corsers
Wort.s      ; Wort in dem sich gerade der Corser befindet
SatzStart.s ; der Text vor dem Wort
SatzEnde.s  ; der Text nach dem Wort

NewList AutoCompleteList.s()
AddElement(AutoCompleteList()) : AutoCompleteList() = "Hallo"
AddElement(AutoCompleteList()) : AutoCompleteList() = "geht"
AddElement(AutoCompleteList()) : AutoCompleteList() = "euch"
AddElement(AutoCompleteList()) : AutoCompleteList() = "hoffe"
AddElement(AutoCompleteList()) : AutoCompleteList() = "scheisse"
AddElement(AutoCompleteList()) : AutoCompleteList() = "nene"
AddElement(AutoCompleteList()) : AutoCompleteList() = "joke"
AddElement(AutoCompleteList()) : AutoCompleteList() = "oder"
AddElement(AutoCompleteList()) : AutoCompleteList() = "egal"
AddElement(AutoCompleteList()) : AutoCompleteList() = "schön"
AddElement(AutoCompleteList()) : AutoCompleteList() = "Schöne"
AddElement(AutoCompleteList()) : AutoCompleteList() = "Cool"
AddElement(AutoCompleteList()) : AutoCompleteList() = "cooles"
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case #MyStringGadget
          ;--------------------------
          Text = GetGadgetText(#MyStringGadget)+" "
          SendMessage_(GadgetID(#MyStringGadget), #EM_GETSEL, @GetSel, 0)
          ClearGadgetItemList(#MyListGadget)
          For i = 1 To CountString(Text, " ")
            Wort = ICStringField(Text, " ", i, @WortStart, @WortEnde)
            If WortStart <= GetSel And WortEnde >= GetSel And Wort <> "" And Len(Wort) > 2
              Debug Wort
              SatzStart = Left(Text, WortStart)
              SatzEnde = Right(Text, Len(Text)-WortEnde-1)
              WortLenge = Len(Wort)
              ResetList(AutoCompleteList())
              While NextElement(AutoCompleteList())
                If LCase(LSet(AutoCompleteList(), WortLenge)) = LCase(Wort)
                  AddGadgetItem(#MyListGadget, -1, AutoCompleteList())
                EndIf
              Wend
            EndIf
          Next
          Debug "-----"
          ;--------------------------
        Case #MyListGadget
          SetGadgetText(#MyStringGadget, SatzStart+GetGadgetItemText(#MyListGadget, GetGadgetState(#MyListGadget), 0)+SatzEnde)
      EndSelect
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
CloseWindow(0)
End
die Corser position in Px brauche ich für so eine art popup fenster welches unter dem wort stehen soll
wen jemand verbesserungsvorschläge hat bitte sagen

ps: die AutoCompleteList() werde ich noch mit eine Datenbank austauschen
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Meinst den Mauscursor oder das blinkende Ding im Editor (Caret) ?
Hast du auch einen Blick in die Hilfe unter Windows geworfen , dort
findest du WindowMouseX/Y() ?
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

Beitrag von IcedCoffee »

>> Meinst den Mauscursor oder das blinkende Ding im Editor (Caret) ?

ich meine "das blinkende Ding im Editor"
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ohne API garnicht :mrgreen:
Entweder Du nutzt die jeweilige API des OS oder Du beschränkst Dich auf die Möglichkeiten, die in der PB-Hilfe aufgeführt sind.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

Beitrag von IcedCoffee »

sch[a/ei]**e

weiss den dan jemand wie ich das mit der WinAPI machen kann
also ich weiss nur wie ich die position bekommen kann
SendMessage_(GadgetID(#MyStringGadget), #EM_GETSEL, @GetSelStart, @GetSelEnde)

aber ich weiss nicht wie ich die Px position des Caret bekommen kan
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

GetCaretPos_(@pt.POINT)

Dazu musst du allerdings noch die Fensterposition berechnen da die
Koordinate nur ab dem Editorgadget zaehlt.
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

Beitrag von IcedCoffee »

THX es geht :allright: :allright:
Antworten