Syntax Highlighting im EditorGadget???

Für allgemeine Fragen zur Programmierung mit PureBasic.
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Syntax Highlighting im EditorGadget???

Beitrag von PMTheQuick »

Hi,

ist es irgendwie möglich im Editor Gadget Syntax Highlighting einzubauen? Wenn ja, wie? :? Habe PB 4.02...

Gruss
PMTheQuick ;)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nur Windows :

http://win32assembly.online.fr/tut35.html

Alles andere ist viel zu langsam und unbrauchbar.
Leider ist das Tutoruial in englisch und die Beispiele
sind in ASM geschrieben. Es gibt aber davon eine
Uebersetzung, finde sie aber gerade nicht.

Edit:
http://www.joachimrohde.com/cms/xoops/m ... .php?id=93
Zuletzt geändert von edel am 03.01.2007 20:02, insgesamt 1-mal geändert.
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

Ja ich kenne dies... Gibt es sonst wirklick keine Möglichkeit (Kenne es übersetzt in Deutsch, ist auf RobSite drauf...)? Denn ASM... :roll:

Gruss
PMTheQuick ;)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Den Text verstehst du aber schon oder, denn du selber brauchst
nicht eine Zeile in ASM zu schreiben ?

Sonst such mal hier im Board, wurde schon oft genug behandelt,
leider sind alle Varianten davon, zumindest in meinen Augen,
unbrauchbar.

Als Alternative kannst du Scintilla benutzen, ts-soft muesste da
noch nen Link zu einer Lib haben.
Zuletzt geändert von edel am 03.01.2007 20:09, insgesamt 1-mal geändert.
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

habe jetzt mal alles durchgelesen... Ui... das klingt kompliziert... Aber ich versuchs mal.... :|

Gruss
PMTheQuick ;)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Im prinzip laeuft es so ab :
  • 1. sichbares Zeichen ermitteln
    letztes sichbares Zeichen ermitteln
    diesen sichbaren Text in den Buffer schreiben
    buffer nach text durchsuchen und uebermalen.
Das ganze spielt sich nur in WM_PAINT ab.
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

ja ok das schaffe ich ist ja nicht schwer.... aber #WM_PAINT... Mit Callbacks habe ich noch nie gearbeitet.... Für ein klitzekleines Beispiel wäre ich sehr dankbar!

Gruss
PMTheQuick ;)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Der Font zum zeichnen muss immer der gleiche sein wie im EditorGadget.
Also eventuell folgendenen Teil anpassen :

Code: Alles auswählen

Protected hFont.l = GetStockObject_(#DEFAULT_GUI_FONT)

Code: Alles auswählen

  
  ; PB V4.0keine_ahnung

  Prototype PrevProc(hwnd,uMsg,wParam,lParam)
  Define PrevEditProc.PrevProc = 0
  Define hwnd
  Define hEdit
  Define i
  Define event
  
  Macro DrawWord(word,color)
    
    If Not CompareMemoryString(*ptr_char,@word,1,Len(word)) ;  wort vergleichen 
      SetTextColor_(hdc,color)   ; farbe setzen
      SendMessage_(hwnd,#EM_POSFROMCHAR,@rect,first_index+*ptr_char-@Buffer) ; aktuelle Position des Chars holen
      DrawText_(hdc,*ptr_char,Len(word),rect,0) ; und strng ueber den alten malen
    EndIf 
    
  EndMacro
  
  Procedure EditCallback(hwnd,uMsg,wParam,lParam)
    Shared PrevEditProc.PrevProc
    
    Protected Buffer.s
    Protected first_index.l
    Protected last_index.l
    Protected rect.RECT
    Protected TextRange.TEXTRANGE
    Protected *ptr_char.Character
    Protected hdc.l , hreg.l
    Protected hFont.l = GetStockObject_(#DEFAULT_GUI_FONT)
    Protected result 
    
    ; WM_PAINT abfangen
    If uMsg = #WM_PAINT
      ; allten Calback aufrufen um alles zu zeichnen 
      result = PrevEditProc(hwnd,uMsg,wParam,lParam)
      
      SendMessage_(hwnd,#EM_GETRECT,0,@rect)
      
      ; Charakter index des ersten und letzten Zeichens auslesen.
      first_index = SendMessage_(hwnd,#EM_CHARFROMPOS,0,rect)
      last_index  = SendMessage_(hwnd,#EM_CHARFROMPOS,0,@rect\right)
      
      If (last_index-first_index) > 0 ; mehr als 0 Zeichen
        
        Buffer = Space(last_index-first_index) ; PB String genug speicher geben
        
        TextRange\chrg\cpMin = first_index     
        TextRange\chrg\cpMax = last_index
        TextRange\lpstrText  = @Buffer
        
        SendMessage_(hwnd,#EM_GETTEXTRANGE,0,TextRange) ; Text in buffer schreiben lassen
        
        hdc = GetDC_(hwnd)
        
        hreg = CreateRectRgn_(rect\left,rect\top,rect\right,rect\bottom) ; eine Region erstellen
        
        SelectObject_(hdc,hreg)      ; Region zuweisen
        SetBkMode_(hdc,#TRANSPARENT) ; hintergrund auf transparent setzen
        SelectObject_(hdc,hFont)     ; !Wichtig , Font setzen
                                     ; Es muss der gleiche Font sein, inc. Eigenschaften
                                     ; er darf weder breiter noch groesser sein, als der normale Font.
        
        *ptr_char = @Buffer
        
        While *ptr_char\c 
          DrawWord("hallo",$0000FF) ; Achtung Macro !  
          DrawWord("du",$FF0000)    ; Achtung Macro !  
          DrawWord("da",$008000)    ; Achtung Macro ! 
          *ptr_char + 1
        Wend 
        
        
        DeleteObject_(hreg) ; region wieder loeschen 
        ReleaseDC_(hwnd,hdc)
        
      EndIf
      ; und raus hier
      ProcedureReturn result
    EndIf
    
    
    ; sonstige Nachrichten an den alten Callback weiterleiten
    ProcedureReturn PrevEditProc(hwnd,uMsg,wParam,lParam)
  EndProcedure
  
  hwnd = OpenWindow(0,0,0,500,500,"TEST")
  
  CreateGadgetList(hwnd)
  
  hEdit = EditorGadget(0,0,0,500,500)
  
  PrevEditProc = SetWindowLong_(hEdit,#GWL_WNDPROC,@EditCallback())
  
  For i = 0 To 100
    AddGadgetItem(0,i,"HalLo du da")
  Next
  
  Repeat
    event = WaitWindowEvent()
    
    
  Until event = 16
Macht so zwar nicht viel Sinn aber zum verstehen sollte es reichen.
DW

Beitrag von DW »

Du prüfst, ob sich der Text im editorgadget geändert hat. Dann gehst du den string der aktuellen Zeile durch und ermittelst die Position aller Befehle, dabei selektierst du die Befehle, dann färbst du sie etc.
Das wars.
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Syntax Highlighting im EditorGadget???

Beitrag von lite »

@edel

Das Beispiel ist Super.
Nur funktioniert es nur mit Ascii.
Könntest Du das Beispiel bitte in Unicode posten ?
Versuche von meiner Seite zu konvertieren schlugen leider fehl.

Grüße

Lite
Antworten