Seite 1 von 2

Editor erstellen wie pb-ide/jaPBe

Verfasst: 20.03.2006 01:40
von Toshy
Hallo.
Nix besonderes, brauche aber für mehrere kleine Projekte nen kleinen Editor. Gibt es ja ansich ein Gadget zu, aber ich will da ich es klasse finde so machen wie in jaPBe, also Links ne Spalte mit Zeilennummern (oder evtl. anderen Daten) und dann auch die Möglichkeit bieten Zeilen auszublenden.
Wie macht man das? Bin durch den jaPBe Quelltext noch nicht durchgestiegen.

Erster Punkt ist wie erstellt man die Spalte mit den Zeilennummern?
Ist das ein bestimmtes Gadget oder sind es zwei Gadget nebeneinander ....

Zweiter Punkt, wie blendet man in der "Zeilenspalte" und im Editor die Zeilen aus? Ist das ein Gadget bzw. eine Funktion die das automatisch macht oder muß ich das selbst machen (Zeilennummer erkennen und klick erkennen, dann Zeilen entfernen bzw. einfügen)?

Ich brauche nicht unbedingt ne fertige Vorlage, bastele mir eh lieber alles selber damit ich es verstehe, aber irgenwo muß man ja mal anfangen und es verstehen. Bin für Tips dankbar.

Grüßle
Toshy

Verfasst: 20.03.2006 01:49
von edel

Code: Alles auswählen

  Procedure MAKELONG(low,high)
    ProcedureReturn low | (high<<16)
  EndProcedure 
  
  Structure DrawingInfoStruct
    Type.l
    Window.l
    DC.l
    ReleaseProcedure.l
    PixelBuffer.l
    Pitch.l
    Width.l
    Height.l
    Depth.l
  EndStructure
  
  Global DS.DrawingInfoStruct
  
  Procedure ReleaseOutput()
    ReleaseDC_(DS\Window,DS\DC)
  EndProcedure
  
  Procedure WindowIDOutput(hWnd) ; returns the outputID for the declared window handle
    DS\Type=1
    DS\Window=hWnd
    DS\DC=GetDC_(hWnd) ;GetWindowDC_(hWnd)
    DS\ReleaseProcedure=@ReleaseOutput()
    ProcedureReturn DS
  EndProcedure 
  
  Procedure _iEditor_CallBack(hwnd, msg, wParam, lParam)
    protected rc.rect
    protected fontsizecy
    shared OLDP
    shared *font.long
    protected point.point
    
    res = CallWindowProc_(OLDP, hwnd, msg, wParam, lParam)
    
    if msg = #WM_PAINT 
      
      HideCaret_(hwnd)
     
      GetClientRect_(hwnd,rc)
      
      startindex = SendMessage_(hwnd,#EM_CHARFROMPOS,0,@point)
      startline  = SendMessage_(hwnd,#EM_LINEFROMCHAR,startindex,0) 
      endindex = SendMessage_(hwnd,#EM_CHARFROMPOS,0,@rc\right)
      endline  = SendMessage_(hwnd,#EM_LINEFROMCHAR,endindex,0) 
       
      StartDrawing(WindowIDOutput(hwnd))
      
      box(0,0,48,rc\bottom,$C0C0C0)
      
      DrawingFont(*font\l)
      
      fontsizecy = TextHeight("M")
      
      lastLine = rc\bottom / fontsizecy + startline - 1
      
      x  =  43
      
      while (startline <= lastLine) and (startline <= endline)
        DrawText(x-TextWidth(str(startline+1)),y,str(startline+1),$000000,$C0C0C0) 
        y + fontsizecy
        startline + 1 
      wend
      
      
      StopDrawing()
      
      ShowCaret_(hwnd)
      ProcedureReturn 0
    endif 
     
    ProcedureReturn res
  EndProcedure
  
  
  ;#####################################################
  ;#
  ;#####################################################
  
  define.long *font
  Define.long *editor
  Define.long *window
  Define.l    Event
  
  
  *window = OpenWindow(#PB_Any,0,0,400,400,"",1|#WS_SYSMENU)
  
  If *window 
    
    CreateGadgetList(*window\l)
    
    *editor = EditorGadget(#pb_any,0,0,395,375)
    *font   = LoadFont(#pb_any,"Courier New",10)
    SetGadgetFont(*editor,*font\l)
    OLDP = SetWindowLong_(*editor\l,#GWL_WNDPROC,@_iEditor_CallBack())
    
    SendMessage_(*editor\l,#EM_SETMARGINS,#EC_LEFTMARGIN,MAKELONG(50,0))
    
    ;-
    Repeat
      Event = WaitWindowEvent()  
      
      
      
    Until Event = #WM_CLOSE
    ;-
  EndIf
  
  End


Verfasst: 06.04.2006 13:41
von funk.munich
Hi zusammen,

wenn ich den Code ausprobiere erhalte ich nur Fehlermeldungen, das
z.B. TextHeight() is not a function, an array or ...

Was mache ich falsch?

Danke + Gruß,
Daniel

Verfasst: 06.04.2006 13:45
von edel
Du benutzt bestimmt <= PB 3.94 . der Code oben ist ab PB Version 4

Verfasst: 06.04.2006 13:45
von Kiffi
> Was mache ich falsch?

Der Code von hallodri musst Du mit PB4 ausführen.

@hallodri:

Da hat sich ein kleiner Typo eingeschlichen:

Code: Alles auswählen

  *font   = LoadFont(#pb_any,"Couriere New",10)
                                     ^
Grüße ... Kiffi

Verfasst: 06.04.2006 13:47
von edel
Danke :-D

Code: Alles auswählen

Hinweis: Unter Windows versucht der systemseitige Font-Mapper immer, einen passenden Zeichensatz für Sie zu finden. Wenn Sie z.B. versuchen einen Zeichensatz mit Namen "Tim Now Ronin" zu öffnen und dieser Zeichensatz-Name existiert nicht, dann versucht der Font-Mapper denn am besten passenden (anhand von Name, Zeichensatzhöhe, Stil, etc.) Zeichensatz zu finden und zu öffnen. Gehen Sie also nicht davon aus, dass kein Zeichensatz geladen wird, wenn Sie einen falsche(n) Namen oder Größe angeben. 
Ich liebe Windows ;-)

Verfasst: 06.04.2006 13:54
von Kiffi
> Ich liebe Windows ;-)

ich weiss nicht, welche Schriftart bei mir anstelle von Couriere verwendet
wird. Courier ist es allerdings nicht ;-)

Bild

Grüße ... Kiffi

Verfasst: 06.04.2006 13:54
von MVXA
Bei mir hat Windows das nicht gemacht :(...

Verfasst: 06.04.2006 14:42
von Kaeru Gaman
> dann versucht der Font-Mapper denn am besten passenden Zeichensatz zu finden

halt ich fürn gerücht...

wenn ein zeichensatz nicht vorhanden ist, wird immer Arial verwendet...

Verfasst: 06.04.2006 14:58
von DarkDragon
Kaeru Gaman hat geschrieben:> dann versucht der Font-Mapper denn am besten passenden Zeichensatz zu finden

halt ich fürn gerücht...

wenn ein zeichensatz nicht vorhanden ist, wird immer Arial verwendet...
Ich dachte MS Sans Serif ist die standard schriftart.