Seite 1 von 1

TextGadget in Zeichnung

Verfasst: 10.12.2012 14:39
von ProgOldie
Hallo,

ich habe offenbar noch nicht den Zusammenhang zwischen Zeichnen in einem Fenster und Gadgets kapiert.

Konkret zeichne ich ein beschriftetes Achsenkreuz und möchte dann die Mauskoordinaten in einem festen Textgadget einblenden. Die Zeichnung läuft prima. Aber sobald das Textgadget (in dem die Mauskkordinaten korrekt angezeigt werden) definiert ist, verschwindet die Zeichnung wieder.
Was muss ich tun, um Zeichnung und(!) eingeblendete Mauskoordinaten zu sehen?

Oder muss ich aufs Gadget verzichten und die Mauskoordinaten schreiben und vor dem Aktualiseren den Bereich mit der Hintergrundfarbe überschreiben?

Dank vorab!

Re: TextGadget in Zeichnung

Verfasst: 10.12.2012 15:14
von RSBasic
Dein Code wird benötigt.

Re: TextGadget in Zeichnung

Verfasst: 10.12.2012 15:27
von ProgOldie
Hallo,
anbei der Code. Die 150 ProgrammZeilen für plotAxis habe ich jetzt 'mal weggelassen, weil damit nur Linien gezeichnet werden und Text mit drawtext eingefügt wird. Hier das Hauptprogramm ohne die Variablendefs.

Code: Alles auswählen

#WinParam=#PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_BorderLess|#PB_Window_SizeGadget
  Win=OpenWindow(#PB_Any, 0, 0, 840, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_BorderLess|#PB_Window_SizeGadget)
  
  If setWorld(-5.8,2,-2000,8000)   ; Bedingungen xmin<=x<=xmax und fmin<=y<=fmax  erfüllt
     ;MessageRequester("x-Werte",StrF(xmin)+"    "+Str(xmax))
    If LoadFont(1, "Arial", 8)
      StartDrawing(WindowOutput(Win)) 
      FrontColor($000000)
      BackColor($FFFFFF)
      DrawingFont(FontID(1))
      plotAxis()  ; zeichne und beschrifte das Achsenkreuz
    EndIf
  EndIf

   ;TextGadget(0, 10, 6, 200, 20, "")
   
  dx=(xmax-xmin)/WindowWidth(Win)
  dy=(fmax-fmin)/WindowHeight(Win)
    Repeat
      Event = WaitWindowEvent(20) ; mindestens alle 20 ms Update 
      Tx=StrF(xmin+dx*WindowMouseX(Win))
      Ty=StrF(fmin+dy*(WindowHeight(Win)-WindowMouseY(Win)))
      
      ;SetGadgetText(0,Tx+"     "+Ty)
    Until Event = #PB_Event_CloseWindow
Hier noch ein kleiner Ausschnitt aus dem Rest:

Code: Alles auswählen

Procedure.i plotXAxis()
  ;Zeichnet x-Achse,setzt deren Markierungen u. Beschriftung  
  Protected x.f,Start.i,Dist.f,markStart.f,Markzahl.i,THoehe.i,TOffset.i,AxText.s
  ;zeichne zuerst die x-Achse (ggf. nicht sichtbar)
  LineXY(0,pxAchse(),WindowWidth(Win),pxAchse(),RGB(0,0,0))
  markStart=markBeginn(xmin,xmax)
  Dist=markAbstand(xmin,xmax)
  Start=0
  If pxAchse() > WindowHeight(Win)-3  ;xAchse am unteren Fensterrand
    Start=-3 ;Markierungslinie von der Achse aus senkrecht nach oben
  Else          ;in allen anderen Fällen
    Start=3     ;von der Achse aus nach unten
  EndIf
  x=markStart
  THoehe=TextHeight("3")  ; Höhe des Textes an einem Beispiel ermitteln
  ;MessageRequester("Schrifthoehe",StrF(THoehe))
  If pxAchse()+3+THoehe>WindowHeight(Win)  ; Schrift passt nicht voll darunter
    ;Offset erforderlich, falls Text nich auf unteren Windowrand passt
    ;evtl. vertikaler Offset ist für alle x gleich, daher nur für markStart berechnet
    TOffset= -THoehe+Start -1  ;Text 1 Pixel oberhalb der x-Achse 
  Else
    TOffset=Start 
  EndIf 
  While x<=xmax
    ;zeichne 3 Pixel lange Linie von der Position auf der x-Achse aus nach oben bzw. unten
    LineXY(xSchirm(x),pxAchse(),xSchirm(x),pxAchse()+Start)
    ;Beschrifte die Achse; Zahl mittig (>>1) zur Markierung
    AxText=FormatText(x)
    DrawText(xschirm(x)-(TextWidth(AxText)>>1),pxAchse()+TOffset,AxText)
    x=x+Dist
  Wend  
  ProcedureReturn #True
EndProcedure


Re: TextGadget in Zeichnung

Verfasst: 10.12.2012 16:29
von ProgOldie
Hallo,

hab die Lösung gefunden: Mit Statusbar geht es wunderbar.

Gruß
aus dem eisigen Norden