Seite 3 von 4

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 04.01.2014 00:28
von RSBasic
Liegt es vielleicht daran, dass du den Text dauerhaft hintereinander pausenlos änderst? Wenn ja, dann könnte es daran liegen, weil das Gadget dann bei jeder Text-Änderung neu gezeichnet wird. Sinnvoller ist, ein Timer zu erstellen und den Text immer nur jede Sekunde änderst und nicht bei jedem einzelnen Zwischenevent.
Timer-Beispiel:

Code: Alles auswählen

EnableExplicit

Define EventID
Define Second

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(1, 10, 10, 100, 20, "0", 0)
  
  AddWindowTimer(0, 123, 1000)
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Timer And EventTimer() = 123
      Second + 1
      SetGadgetText(1, Str(Second))
    EndIf  
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 04.01.2014 14:10
von Sicro
Bei einem Timer können Sprünge entstehen, weil der Timer-Takt mit dem Laufzeit-Takt nicht übereinstimmt:
Spielzeit: 00:01:30
Spielzeit: 00:01:31
Spielzeit: 00:01:33 <= Spielzeit "00:01:32" wurde übersprungen
Um das Auftreten dieser Sprünge zu verringern, könnte man noch den Timer-Takt erhöhen, also das er alle 1/2 Sekunden oder mehr ausgelöst wird, aber nach einer Weile wird es wieder zu einem Sprung kommen.
Wem diese Kleinigkeit aber nicht stört, kann das natürlich auch so machen.

Andere Möglichkeit wäre, den Text auf dem Gadget nur zu ändern, wenn dies wirklich nötig ist:

Code: Alles auswählen

Macro SetGadgetTextOnlyOnChange(Gadget, Text)
  ; Setzt dem Gadget nur einen neuen Text,
  ; wenn dieser sich wirklich geändert hat
  
  If GetGadgetText(Gadget) <> Text
    SetGadgetText(Gadget, Text)
  EndIf
EndMacro

#MainWindow = 0
#TextGadget = 0

OpenWindow(#MainWindow, 0, 0, 300, 100, "", #PB_Window_ScreenCentered)
TextGadget(#TextGadget, 120, 40, 60, 20, "")

Repeat
  Event = WindowEvent()
  
  TimeString.s = FormatDate("%hh:%ii:%ss", Date())
  SetGadgetTextOnlyOnChange(#TextGadget, TimeString) ; wird extrem oft aufgerufen
Until Event = #PB_Event_CloseWindow

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 04.01.2014 20:00
von udg
hm. bevor ich weiter experimentiere möchte ich Euch mal das Problem zeigen.

Jedoch sei angemerkt: wenn ich den Timer NICHT transparent anzeigen lasse, flackert er ganz wenig.

Hier mal der Player:
http://rghost.net/private/51402668/b43b ... 2c1dc52d1f

viele Grüße

meine Timer Prozedur schaut so aus:

Code: Alles auswählen

Case #PB_Event_Timer
    If MP_IsPlayingV2M() ; MP_IsPlayingV2M() = MP3D LIB - wird gebraucht um V2M Sounds abspielen zu können

      ;Display Time and total Time.
      
      TimeMin.s = Str(MP_GetCurrentTimeV2M()/60000) ;MP_GetCurrentTimeV2M() = MP3D LIB - wird gebraucht um V2M Sounds abspielen zu können
      TimeSec.s = Str(Val(Str(MP_GetCurrentTimeV2M()/1000)) - 60*Val(TimeMin)) ; MP_GetCurrentTimeV2M() = MP3D LIB - wird gebraucht um V2M Sounds abspielen zu können
      
      TotalMin.s = Str(MP_GetNeededTimeV2M()/60000) ; MP_GetNeededTimeV2M() = MP3D LIB - wird gebraucht um V2M Sounds abspielen zu könn
      TotalSec.s = Str(Val(Str(MP_GetNeededTimeV2M()/1000)) - 60*Val(TotalMin)) ; MP_GetNeededTimeV2M() = MP3D LIB - wird gebraucht um V2M Sounds abspielen zu können
      
      ;Measure sec strings.
      If Val(TimeSec) < 10
        TimeSec = "0" + TimeSec
      EndIf
      If Val(TotalSec) < 10
        TotalSec = "0" + TotalSec
      EndIf
      
      ;Measure min and sec strings.
      If Val(TimeMin) < 10
        TimeMin = "0" + TimeMin
      EndIf
      If Val(TotalMin) < 10
        TotalMin = "0" + TotalMin
      EndIf
      
          PureCOLOR_SetGadgetColor(#Playtime_1, TextColor.l, BackColor.l)  ; Gnozal's PureColor Lib um text ohne hintergrund darstellen zu können 
          SetGadgetText(#Playtime_1, " ( " + TotalMin + ":" + TotalSec + " ) ") ; zeigt die Songlänge in Zeit auf der rechten Seite an
          PureCOLOR_SetGadgetColor(#Playtime_1, RGB(247,247,247), #PureCOLOR_DontSetBackColor) ; Gnozal's PureColor Lib um text ohne hintergrund darstellen zu können 
          
          PureCOLOR_SetGadgetColor(#Playtime_2, TextColor.l, BackColor.l) ; Gnozal's PureColor Lib um text ohne hintergrund darstellen zu können 
          SetGadgetText(#Playtime_2, TimeMin + ":" + TimeSec) ; zeigt Minuten und Sekunden auf der linken Seite im Sekundentakt ansteigen an
          PureCOLOR_SetGadgetColor(#Playtime_2, RGB(247,247,247), #PureCOLOR_DontSetBackColor) ; Gnozal's PureColor Lib um text ohne hintergrund darstellen zu können 
          
; dies ist wichtig für den Trackbar damit ich vorspulen kann
          SetGadgetAttribute(#TrackBar_25, #PB_TrackBar_Maximum,Val(TotalMin)*60 +Val(TotalSec))   ;Set new Position Max.
          PureCOLOR_SetGadgetColor(#TrackBar_25, RGB(0,0,0), #PureCOLOR_DontSetBackColor) ; mit dieser Funktion kann der Trackbar Hintergrund transparent gemacht werden, jedoch bug :(
          If Not OnTrackBarDown=1
        SetGadgetState(#TrackBar_25, Val(TimeMin)*60 +Val(TimeSec))     ;Set new Position Value.
      EndIf

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 04.01.2014 20:04
von RSBasic
Dass es nach der Transparent-Setzung mehr flackert, ist normal, weil das Betriebssystem auch mehr zeichnen muss.
Versuche, dass der Text nicht ständig angepasst wird, sondern nur bei Veränderung bzw. bei einem Textunterschied, wie Sicro mit seinem Code gezeigt hat, dann hast du auch keine Flackerprobleme.

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 04.01.2014 20:10
von udg
RSBasic hat geschrieben:Dass es nach der Transparent-Setzung mehr flackert, ist normal, weil das Betriebssystem auch mehr zeichnen muss.
Versuche, dass der Text nicht ständig angepasst wird, sondern nur bei Veränderung bzw. bei einem Textunterschied, wie Sicro mit seinem Code gezeigt hat, dann hast du auch keine Flackerprobleme.
ich werde die Zeitprozedur ändern und den Trackbar neu verknüpfen.

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 05.01.2014 01:14
von Bisonte
RSBasic hat geschrieben:Dass es nach der Transparent-Setzung mehr flackert, ist normal, weil das Betriebssystem auch mehr zeichnen muss.
Versuche, dass der Text nicht ständig angepasst wird, sondern nur bei Veränderung bzw. bei einem Textunterschied, wie Sicro mit seinem Code gezeigt hat, dann hast du auch keine Flackerprobleme.
und dazu bemerkt, die Dauer des gesamten Stückes braucht man nicht bei jedem Durchlauf neu zu setzen. Solange es das gleiche Musikstück ist, wird sich die Gesamtlänge wohl kaum ändern. Somit wäre Flackern auf der rechten Seite auch weg.

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 05.01.2014 02:47
von udg
und dazu bemerkt, die Dauer des gesamten Stückes braucht man nicht bei jedem Durchlauf neu zu setzen. Solange es das gleiche Musikstück ist, wird sich die Gesamtlänge wohl kaum ändern. Somit wäre Flackern auf der rechten Seite auch weg.
Danke, logisch das macht Sinn.

Ich habe eine frage noch zum Font. Möchte gern einen LCD Font direkt in die Exe einbinden.

Geladen wir er doch so wenn ich mich nicht irre?:

DataSection
font:
IncludeBinary "digifaw.ttf"
end_font:
EndDataSection


nun habe ich nicht das passende gefunden den galadenen Font auf mein TextGadget anzuwenden :(

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 05.01.2014 12:16
von Bisonte
In deinem Beispiel hast du den Font in dein Programm integriert, nicht geladen.
Da PB aber keine CatchFont() Funktion hat, wie kommt man da ran ?

Wenn Du den Font benutzen darfst (Urheberrecht beachten), dann kannst du ihn aus der DataSection wieder auf die Platte schreiben,
(z.B. in den Tempordner) und dann per

Code: Alles auswählen

AddFontResource_(FontFileName)
SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0)
dem System sichtbar machen um ihn dann per LoadFont() zu laden.

Um ihn dann einem Gadget zuzuordnen wird die Funktion SetGadgetFont() benutzt. Wobei man beachten sollte die FontID zu benutzen und nicht
die PB ObjektNummer.

Kleines Beispiel

Code: Alles auswählen

DataSection
  font:
  IncludeBinary "digifaw.ttf"
  end_font:
EndDataSection

; Font auf Platte

FontFileName.s = GetTemporaryDirectory() + "digifaw.ttf"

File = CreateFile(#PB_Any, FontFileName)

If File
  WriteData(File, ?font, ?end_font - ?font)
  CloseFile(File)
  
  AddFontResource_(FontFileName)
  SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0)
  
  FontPB = LoadFont(#PB_Any, "digifaw", 8) ; Den wirklichen Fontnamen einsetzen....
  
EndIf

; und wenn die Gadgets erstellt sind

SetGadgetFont(#Playtime_1, FontID(FontPB))
SetGadgetFont(#Playtime_2, FontID(FontPB))

; am Ende des Programms aufräumen

RemoveFontResource_(FontFileName)
SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0) ; Font aus dem System entfernen

DeleteFile(FontFileName) ; Aus dem Temp Ordner löschen....
Und wie am Ende des Beispiels zu sehen ist : Alles was man erstellt, sollte man bei Nichtgebrauch wieder entfernen.
Besonders bei WinAPI muss man darauf achten. Bei PB wird fast alles wieder freigegeben (Images,Fonts,Memory etc.), bei WinAPI nicht.

PS: Ist dir eigentlich schon aufgefallen, daß alle Anzeigen einfrieren, wenn man das Fenster per Maus bewegt ?

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 05.01.2014 20:11
von udg
Danke für deine ausführliche Antwort.
Schön wäres, es gibt eine Funtkion ähnlich einem "CatchFont".

Läuft man Gefahr, wenn ich einen Font auf die Platte in einen Temp Ordner schreibe, dass Antiviren Programme rumspeckern könnten oder braucht man sich darüber keine Gedanken machen? Womöglich dann ein Schreibzugriff verhindert wird?

Den LCD Font habe ich von der Seite "dafont.com" runtergeladen, meines Wissens und was ich dort gelesen habe sind Fonts dort Free, freigegeben für eine private Nutzung und oder DonationWare. Im Moment bin ich mir noch nicht sicher welchen Font ich am Ende benutze. Test Test...

Das meine Anzeigen einfrieren beim Fenster verschieben ist schon immer so. Seit ich mit PB etwas angefangen habe. Ich dachte das ist so und kann von PB gar nicht anders dargestellt werden. Darum habe ich dies so hingenommen.
Jedoch frage ich mich natürlich nun ob da prinzipiell was falsch ist was meine Codes angeht?
Eigentlich sollten ja alle Instanzen auch beim Fensterverschieben weiterlaufen wie Du schon schreibst aber dies machte es noch nie.

Edit:
ich habe nun nochmal Beispiele geladen von anderen Leuten. Kompiliert und dann das Fenster verschoben. Selbes Problem. Wärend des verschiebens frieren die Vorgänge ein. Ich würde jetzt mal denken das dies PB normal ist?

PS.
Hier ein weiteres Update des Players:
http://rghost.net/private/51426302/4b93 ... 141b44e721

Grüße

Re: Frage ImageGadget Button und ButtonGadget

Verfasst: 06.01.2014 08:55
von Bisonte
Alles kann passieren, daher sollte man immer prüfen, ob etwas geladen wurde oder nicht.
Nichts ist schlimmer als ein Absturz des Programms beim Kunden, nur weil der ein Bild vom falschen
Format laden will.... ;)

Bei allen öffentlichen Quellen und angeblichen Free, Gratis oder sonstwas Angeboten muss man peinlichst genau
auf die Lizenz achten, wenn man es verwenden möchte. Besonders, wenn man das auch noch unter die Leute
bringen will... wenn also bei einer Datei (Font, Bild, Musik egal was) die nicht von einem selbst kommt, die Lizenz
nicht bekannt ist : Finger weg!

So etwas kann einem schnell die Laune verhageln, wenn da Abmahnungen oder gar Anzeigen ins Haus flattern....

Und das "Einfrieren" der Anzeige kann man umgehen.

Stelle Dir vor, daß beim bewegen des Fensters keine Events für PB mehr abgearbeitet werden.
Man kann dieses umgehen, indem man direkt die Events von Windows in einem Callback abgreift.

Klingt komplizierter als es ist ;)
Allerdings müsste man das für jedes Gadget tun. PB hat diesbezüglich BindEvent() und BindGadgetEvent() als Funktion im Gepäck.
Ein kleines Beispiel mit dem #PB_Event_Timer

Code: Alles auswählen

#Uhr = 0

Procedure NeueZeit()
  
  Static OldTime.s
  
  Zeit.s = FormatDate("%hh:%ii:%ss",Date())
  
  If OldTime <> Zeit
    If StartDrawing(CanvasOutput(#Uhr))
      Box(0,0,OutputWidth(),OutputHeight(),0)
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(0,0,Zeit, #White)
      StopDrawing()
    EndIf
    OldTime = Zeit
  EndIf

EndProcedure

OpenWindow(0, 0, 0, 300, 50, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

CanvasGadget(#Uhr, 0, 0, 300, 50)
BindEvent(#PB_Event_Timer, @NeueZeit(), 0)

AddWindowTimer(0, 123, 100)

Repeat
  
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_CloseWindow
      Quit = 1
  EndSelect
  
Until Quit > 0
Wenn man hier das Fenster verschiebt friert nichts mehr ein und die zeit wird ständig weiter geändert.
Ausserdem zeigt es auch nochmal, die Zeit nur zu ändern, wenn diese sich ändert (ich habe extra den Timer
auf 100 ms gestellt.... und es flackert auch nichts ;) )