scintilla popupmenu

Anfängerfragen zum Programmieren mit PureBasic.
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

scintilla popupmenu

Beitrag von delikanli_19_82 »

hallo leute,

ich habe jetzt mit scintilla eine editor umgebung zusammengeflickt. besser gesagt habe ich aus einem beispiel im forum genommen und erweitert.

nun möchte ich ein eigenes popupmenu statt das von scintilla selbst anzeigen lassen. wie man den scintilla-eigenen popupmenu unterdrücken kann weiß ich. wie kann man aber ein eigenes popupmenu auf dem einblenden, sobald die rechte maustaste gedrückt wird.

ich hab da an sowas wie das hier gedacht:

Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
DisplayPopupMenu(0, WindowID(0))
EndIf

ist das so möglich. Wenn nein, welche Möglichkeiten gibt es?

ich brauche noch eine lösung für folgende themen bei scintilla:

- suchen
- weitersuchen
- suchen und ersetzen
- gehe zu zeile

danke in voraus
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

Re: scintilla popupmenu

Beitrag von ts-soft »

Das POPUPMENU würde ich einem #WM_CONTEXTMENU in einem Callback zuordnen, aber
Deine Version sollte ja auch funktionieren.

Für das Suchen:

Code: Alles auswählen

Procedure Edit_Search(id, search.s, direction, flags)
  Protected *mem, pos, result
  Protected selstart, selend

  If search
    *mem = AllocateMemory(StringByteLength(search, #PB_UTF8) + 1)
    If *mem
      PokeS(*mem, search, -1, #PB_UTF8)
     
      If direction = 0
        pos = ScintillaSendMessage(id, #SCI_GETSELECTIONSTART) - 1
      Else
        pos = ScintillaSendMessage(id, #SCI_GETSELECTIONEND) + 1
      EndIf
      ScintillaSendMessage(id, #SCI_SETSEL, pos, pos)
      ScintillaSendMessage(id, #SCI_SEARCHANCHOR)
      If direction
        result = ScintillaSendMessage(id, #SCI_SEARCHNEXT, flags, *mem)
      Else
        result = ScintillaSendMessage(id, #SCI_SEARCHPREV, flags, *mem)
      EndIf
      If result <> -1
        selstart = ScintillaSendMessage(id, #SCI_GETSELECTIONSTART)
        selend = ScintillaSendMessage(id, #SCI_GETSELECTIONEND)
        GOSCI_SetState(id, #GOSCI_CURRENTLINE, ScintillaSendMessage(id, #SCI_LINEFROMPOSITION, result))
        ScintillaSendMessage(id, #SCI_SETSELECTIONSTART, selstart)
        ScintillaSendMessage(id, #SCI_SETSELECTIONEND, selend)
        ScintillaSendMessage(id, #SCI_SCROLLCARET)
      EndIf
      FreeMemory(*mem)
    EndIf
    
    ProcedureReturn result
  EndIf

EndProcedure
Die Zeile mit GOSCI_SetState wirste wohl noch selber anpassen müssen. Zur Zeile gehen, die der Position entspricht.

Gruß
Thomas
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
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

Re: scintilla popupmenu

Beitrag von delikanli_19_82 »

hi ts_soft,

vielen dank für die hilfe.
Antworten