TextGadget in Zeichnung

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

TextGadget in Zeichnung

Beitrag 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!
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: TextGadget in Zeichnung

Beitrag von RSBasic »

Dein Code wird benötigt.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: TextGadget in Zeichnung

Beitrag 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

Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: TextGadget in Zeichnung

Beitrag von ProgOldie »

Hallo,

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

Gruß
aus dem eisigen Norden
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten